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 的更改。
- 例如,C 更改了文件
foo/bar
,但是从 E
打开文件时,文件处于状态“A”。
- 还有一个
git log -- foo/bar
没有列出提交 C.
- 执行
git diff A E
和 git show E
一样显示空差异。
这是我的 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
显示了合并提交如何恢复 B
、C
和 D
.
的所有更改
了解这一点后,我认为还原提交是解决问题的最优雅的解决方案。即执行git revert -m2 E
.
我有一个分支是从分支 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 的更改。
- 例如,C 更改了文件
foo/bar
,但是从E
打开文件时,文件处于状态“A”。 - 还有一个
git log -- foo/bar
没有列出提交 C. - 执行
git diff A E
和git show E
一样显示空差异。
这是我的 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
显示了合并提交如何恢复 B
、C
和 D
.
的所有更改
了解这一点后,我认为还原提交是解决问题的最优雅的解决方案。即执行git revert -m2 E
.