git如何处理合并中的提交?

dig*_*sky 6 git merge branch graph commit

我无法理解git merge在合并过程创建的提交方面是如何工作的.我已经阅读了pro git和git社区书中的相关章节,但我仍然感到困惑.

考虑这种情况:我有一个"origin"git repo:

          master
            |
a0--a1--a2--a3
  \
   -b0--b1
         |
      branch2
Run Code Online (Sandbox Code Playgroud)

我将这个repo克隆到本地仓库,然后只在本地仓库上工作.在branch2中,我做了一个"git merge master".现在我的本地仓库看起来像这样:

     master / origin/master
            |
a0--a1--a2--a3
  \           \
   -b0--b1-----merge
         |       |
  origin/branch2 |    
              branch2
Run Code Online (Sandbox Code Playgroud)

因此合并在"b1"提交之后创建了1个提交"merge".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
Run Code Online (Sandbox Code Playgroud)

另外,如果我在当前头之前进行一次提交,我会按预期进入b1提交.(按照图中的branch2行返回1提交)

> git log branch2~ --graph --pretty=oneline --decorate
* 99955f66843df51fb9d40c7797156c32cad57415 (origin/branch2) b1
* 30ca9b6363558322f2bb7810d75cda0d9c2ba3e0 b0
* 76a7c6d0eb54a9580841115ff2c3429360ab2ac9 a0
Run Code Online (Sandbox Code Playgroud)

这是我的困惑.我还没有将我的更改推送到原点,但是当我执行"git status"时,git说我的本地branch2比原始/ branch2提前4次提交.我认为合并只导致了一个新的"合并"提交,如上图/图所示?为什么4?

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

另外,从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
Run Code Online (Sandbox Code Playgroud)

我理解4个提交是来自master(a1,a2,a3)的3个,它们应该合并到分支2,再加上"merge"提交.但为什么图表没有这样显示呢?如果是,它看起来像:

     master / origin/master
            |
a0--a1--a2--a3-----------
  \                      \
   -b0--b1--a1'--a2'--a3'--merge
         |                  |
  origin/branch2            |    
                         branch2
Run Code Online (Sandbox Code Playgroud)

而branch2~会把我带到a3'而不是b1.

在此先感谢您的帮助.

Von*_*onC 6

如" 如何在git中的分支上获取更改 "中所述:

git log origin/branch2..branch2
Run Code Online (Sandbox Code Playgroud)

是指:在所有提交branch2(阳性参考),这是不是在origin/branch2(负参考)
(在正面和负面的引用,请参阅" 在'差异git log origin/master’VS' git log origin/master.. ")

在你的情况下,合并后,你必须在4个提交branch2(当地的一种)上没有的origin/branch2:a1,a2,a3merge.