我无法理解 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
、a2
、a3
和merge
。
关于git - git 如何处理 merge 中的提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6392514/