【问题标题】:GitHub Merge branch 'master'GitHub合并分支'主'
【发布时间】:2011-10-30 12:23:43
【问题描述】:

在使用 svn 多年后,一直在尝试 Git 和 Github。我似乎已经掌握了基础知识,但有一项让我感到困惑。

  • UserA 对 FileA 进行更改并推送到远程服务器 (GitHub)

  • UserB 对 FileB 进行了更改。他首先从远程拉 服务器,然后将他对 FileB 的更改推送到远程服务器

  • GitHub 提交历史显示来自 UserA 的推送和来自 UserB 的推送

  • 但是,来自 UserB 的提交历史记录中还有一个名为“https://github.com/xxx/yyy 的合并分支 'master'”的附加条目。在 Github 中查看差异表明这是 UserA 对 FileA 所做更改的精确副本

为什么显示这个重复项 - 从 UserA 到 FileA 的推送和 Merge 分支主条目都是相同的……第二个对我来说似乎是多余的。

【问题讨论】:

    标签: git github


    【解决方案1】:

    存储在 git 中的每个版本(“提交”)都构成了图表的一部分,根据该图表来思考您在 git 中所做的工作通常很有帮助。

    当 UserA 开始时,假设只创建了两个提交,我们将其称为 PQ

    P--Q (master)
    

    然后,他修改 FileA,阶段更改并创建一个代表源代码新状态的提交 - 假设提交名为 R。这有一个单亲,即提交Q

    P--Q--R (master)
    

    成功推送后,GitHub 存储库的提交图看起来相同。

    UserB 以相同的历史开始:

    P--Q (master)
    

    ...但创建了一个不同的提交,例如称为 S,其中包含他修改后的 FileB 版本:

    P--Q--S (master)
    

    UserB 尝试将其推送到 GitHub,但推送被拒绝 - 除非您“强制”推送,否则不允许更新远程分支,除非您推送的版本包含该远程中的所有历史记录分支。因此,UserB 从 GitHub 中提取。拉动实际上包括两个步骤,获取和合并。 fetch 更新origin/master,这就像来自远程origin 的远程分支master 的状态缓存。 (这是一个“远程跟踪分支”的例子。)

    P--Q--S (master)
        \
          R (origin/master)
    

    此图中的历史已经分歧,因此合并尝试通过创建合并提交(例如 M)来统一这两个历史,该合并提交同时具有 SR 作为父级,并希望代表从两个分支:

    P--Q--S--M (master)
        \   /
         \ /
          R (origin/master)
    

    当 GitHub 向您显示代表由提交引入的更改的 diff 时,对于具有一个父级的提交来说,这很简单 - 它可以只从该版本进行 diff。但是,对于像M 这样的提交,如果有多个父级,它必须选择一个父级来显示差异。这就解释了为什么合并提交M 显示的差异可能与SR 之一显示的差异相同。 git 中的提交由源树的确切状态定义,而不是使树进入该状态的更改。

    【讨论】:

    • 这是否意味着如果UserB在拉取FileA上的更改后才修改并推送FileB,则不会创建Merge分支'master'?如果是,那我想我明白了。
    • 是的,如果 UserB 在创建将更改引入 FileB 的提交之前进行拉取,则不会有合并提交 - 这就像使用单个父项创建任何其他提交一样。
    • 还值得注意的是(a)许多人使用git pull --rebase 来保持历史线性 - 在获取之后,这将尝试重新应用不在origin/master 中的任何提交和(b)如果您尝试合并到当前分支的提交已经包含当前分支的历史记录,默认情况下 git 不会创建合并提交 - 它只是将您的分支“快进”到您所在分支的状态合并。
    • 我们使用git config --global branch.autosetuprebase always自动将远程分支设置为git pull --rebase。可以使用git config branch.<branch>.rebase true 设置各个分支。这可以防止引入这些额外的合并提交。它使历史记录更加一致和规律。
    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 2015-06-23
    相关资源
    最近更新 更多