git - git 如何处理 merge 中的提交?

标签 git graph merge branch commit

我无法理解 git merge 在 merge 过程中创建的提交方面的工作原理。我已经阅读了 pro git 和 git community book 中的相关部分,但仍然感到困惑。

考虑这种情况:我有一个“来源”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

因此 merge 在“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

此外,如果我在当前 head 之前进行一次提交,我会按预期到达 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 个提交。我认为 merge 只会导致 1 个新的“merge ”提交,如上图/图表所示?为什么是 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 次提交是 merge 应该带到分支 2 的来自 master (a1,a2,a3) 的 3 次提交,加上“merge ”提交。但是为什么图表没有那样显示呢?如果是这样,它看起来像:

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

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

在此先感谢您的帮助。

最佳答案

如“How to get the changes on a branch in git”中所述:

git log origin/branch2..branch2

表示:branch2 上的所有提交(正引用)不在 origin/branch2 上的所有提交(负引用)
(关于正面和负面的引用,见“Difference in 'git log origin/master' vs 'git log origin/master..'”)

在你的例子中, merge 后,你在 branch2(本地)上确实有 4 个提交不在 origin/branch2 上:a1 a2a3merge

关于git - git 如何处理 merge 中的提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6392514/

相关文章:

algorithm - GCJ - 哈密顿循环

git - 当目录已经移动到不同目录时如何在git中 merge 文件

git分支—— merge

Git - 我是否正确使用它?

eclipse - 在 egit 中被拒绝的非快进问题

c++ - 为什么不能在 BGL 的访问者中更改边缘属性?

c++ - 为回文遍历网格

git - 尝试推送 git 并接收 "could not read Username for ' https ://github. com':终端提示已禁用”

git rebase --continue 与新提交

svnmerge 与 svn 合并