Git在合并时如何处理提交?

6

我有些困惑git合并是如何在合并过程中创建提交的。我已经阅读了《Pro Git》和《Git社区书》,但仍感到困惑。

考虑以下情况:我有一个名为“origin”的git仓库:

          master
            |
a0--a1--a2--a3
  \
   -b0--b1
         |
      branch2

我将这个仓库克隆到本地并只在本地工作。在branch2中,我执行了“git merge master”命令。现在我的本地仓库看起来像这样:

     master / origin/master
            |
a0--a1--a2--a3
  \           \
   -b0--b1-----merge
         |       |
  origin/branch2 |    
              branch2

因此,合并后创建了1个提交,名称为“merge”,在“b1”提交之后。对于branch2的“git log”显示了预期的图形:

> git log branch2 --graph --pretty=oneline --decorate
*   a7b69fc6759e1dd5463bab379ce101a6ad026c7b (HEAD, branch2) Merge branch 'master' into branch2
|\  
| * 482e4026f05e33395a9fc3c87f50a746f692406a (origin/master, origin/HEAD, master) a3
| * 8de57bdea2d316073af3b7055f8c28c56004ce94 a2
| * 1e991047996aad269f2c01b9a0b9a7d8293096a1 a1
* | 99955f66843df51fb9d40c7797156c32cad57415 (origin/branch2) b1
* | 30ca9b6363558322f2bb7810d75cda0d9c2ba3e0 b0
|/  
* 76a7c6d0eb54a9580841115ff2c3429360ab2ac9 a0

此外,如果我回到当前主提交之前的一个提交,我会到达预期的b1提交。(在图表中跟随branch2线并返回1个提交)
> git log branch2~ --graph --pretty=oneline --decorate
* 99955f66843df51fb9d40c7797156c32cad57415 (origin/branch2) b1
* 30ca9b6363558322f2bb7810d75cda0d9c2ba3e0 b0
* 76a7c6d0eb54a9580841115ff2c3429360ab2ac9 a0

我有些困惑。我还没有将我的更改推送到远程仓库,但是当我执行“git status”时,Git说我的本地branch2比origin/branch2领先4个提交。我以为合并只会产生一个新的“合并”提交,就像上面的图表/图示中看到的那样?为什么是4个呢?

> git status
# On branch branch2
# Your branch is ahead of 'origin/branch2' by 4 commits.
#
nothing to commit (working directory clean)

此外,从origin/branch2到branch2执行“ git log”命令时,显示了4个提交记录,而不是我预期的1个(从“b1”到“merge”)。
> git log origin/branch2..branch2 --graph --pretty=oneline --decorate
* a7b69fc6759e1dd5463bab379ce101a6ad026c7b (HEAD, branch2) Merge branch 'master' into branch2
* 482e4026f05e33395a9fc3c87f50a746f692406a (origin/master, origin/HEAD, master) a3
* 8de57bdea2d316073af3b7055f8c28c56004ce94 a2
* 1e991047996aad269f2c01b9a0b9a7d8293096a1 a1

我理解这4个提交包括主分支(master)的3个提交(a1,a2,a3),这些提交应该被合并到第二分支(branch 2)中,再加上一个“合并”提交。但是为什么图形不以这种方式显示呢?如果是这样的话,它应该是这样的:

     master / origin/master
            |
a0--a1--a2--a3-----------
  \                      \
   -b0--b1--a1'--a2'--a3'--merge
         |                  |
  origin/branch2            |    
                         branch2

分支2会将我带到a3'而不是b1。感谢您提前的任何帮助。


a1、a2、a3和merge并不是origin/branch2的一部分,这就是为什么它告诉你有4个提交。 - Ondřej Mirtes
如果你想将合并的更改作为单个提交,可以使用 git merge --squash - hammar
1个回答

6

感谢您的快速回复。所以我误解了两件事:1)“您的分支领先于<分支> x个提交。”意味着您当前分支中有x个提交,这些提交在<分支>中不存在。这些x个提交并不意味着在存储库图表上您的当前分支和<分支>之间有4个提交。2)git log <branch1>..<branch2>不显示我从<branch1>到<branch2>在存储库图表中经过的提交。相反,它可以被认为是显示<branch1>和<branch2>历史记录中提交的“差异”。 - digitalsky
@digitalsky:git log接受一个范围的修订版本,它是关于遍历修订版本图形的,从正参考开始,通过修订历史向后走,直到遇到可以从负参考到达的修订版本为止。git diff接受两个修订版本(不是一系列的),它是关于显示这两个版本之间的差异。除了diff A...B,它显示自A分叉以来在B中的内容。 - VonC
@digitalsky:所以对于你的第一点,"ahead" 部分是关于回溯修订图,知道另一个分支的提交一旦与你的本地分支合并,现在可以从该本地分支访问。对于你的第二点,我会避免使用 "diff" 这个术语 ;) - VonC
那个解释很有用。谢谢。 - Philip Oakley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接