Merge 没有引入合并的变化

Merge did not introduce merged changes

我有一个分支是从分支 main 的提交 A 合并而来的。我做了一些更改,结果是这样的:

A-B-C-D

然后我将分支合并回 main 引入合并提交。快进合并就足够了,但我们的政策是创建合并提交。我注意到合并的提交消息中存在拼写错误,并执行了 git commit --amend 更正。历史现在看起来是这样的。其中 E 是合并提交。

A-B-C-D-E

E 的父级由 git 显示为 Merge: A D

现在的问题是 main 不再包含提交 B、C 或 D 的更改。

这是我的 reflog 中的相应部分:

E HEAD@{93}: commit (amend): Finish Hotfix
Z HEAD@{94}: commit (merge): Finsh Hotfix
A HEAD@{95}: checkout: moving from hotfix to main
D HEAD@{96}: commit: Changes
C HEAD@{97}: commit: Changes
B HEAD@{98}: commit: Changes
A HEAD@{99}: checkout: moving from main to hotfix

当我尝试再次合并更改时 (git merge D) git 状态 Already up to date..

修改合并提交本身不会以某种方式神奇地撤销合并的影响。因此,人们不得不得出结论,这个故事有问题。要么您用于调查所发生事件的测试本身存在缺陷,因此您无法获得真实情况,要么还有更多您没有告诉我们的事情发生。

虽然这对情况没有多大帮助,但我将按照您描述的场景进行演示,以证明修改后的提交不会否定合并。

构建历史:

$ git init
$ echo a > a; git add .; git commit -m'a' 
$ git branch hotfix
$ git checkout hotfix
$ echo b > b; git add .; git commit -m'b'
$ echo c > c; git add .; git commit -m'c'
$ echo d > d; git add .; git commit -m'd'
$ git checkout master
$ git merge --no-ff hotfix # write commit message in editor

检查合并后的内容:

$ ls
a   b   c   d
$ git log --oneline --graph
*   2eb6b68 (HEAD -> master) Merge branch 'hotfix'
|\  
| * ec24fa1 (hotfix) d
| * 052560f c
| * 74d6f9a b
|/  
* 220dd03 a

修改合并提交并检查我们之后得到的内容:

$ git commit --amend # write new commit message in editor
$ ls
a   b   c   d
$ git log --oneline --graph
*   7a7d731 (HEAD -> master) Improved merge branch 'hotfix'
|\  
| * ec24fa1 (hotfix) d
| * 052560f c
| * 74d6f9a b
|/  
* 220dd03 a

如您所见,修改后的合并提交只是换入了原始合并提交,而没有扰乱历史或结果。

我仍然不确定最初是什么导致了这个问题,但似乎我在合并过程中犯了一个错误。

然而,git show E 没有显示任何变化,这让我感到困惑。这是由于我对 git show 工作原理的误解造成的。 this answer 中详细解释了它的工作原理。因此执行 git show -m E 显示了合并提交如何恢复 BCD.
的所有更改 了解这一点后,我认为还原提交是解决问题的最优雅的解决方案。即执行git revert -m2 E.