【发布时间】:2021-04-02 03:19:56
【问题描述】:
我有一个分支,它是从分支 main 的提交 A 合并而来的。我做了一些更改,结果是这样的:
A-B-C-D
然后我将分支合并回main,引入了合并提交。快进合并就足够了,但我们的策略是创建合并提交。我注意到合并的提交消息中有拼写错误,并使用git commit --amend 进行更正。历史现在看起来是这样的。其中E 是合并提交。
A-B-C-D-E
E 的父母被 git log 显示为Merge: A D。
现在的问题是 main 不再包含提交 B、C 或 D 的更改。
- 例如,C 更改了文件
foo/bar,但在打开E之后的文件时,文件处于“A”状态。 -
git log -- foo/bar也没有列出提交 C。 - 执行
git diff A E与git show E一样显示空差异。
这是我的参考日志中的相应部分:
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 log -- foo/bar does not list commit C" 这并不能证明你认为它证明了什么,因为默认情况下这个命令不会分支到合并的第二个父节点。跨度>
-
@matt 好的,感谢您指出这一点。然而,该文件不包含提交
C对其所做的更改 -
嗯,发生了一些你没有告诉我们的事情。如果您真正合并,合并提交,然后立即进行提交修改,那么(如您所说)A 和 D 仍然是修改后提交的父级(它是合并提交)并且两个分支中的更改都存在在修改后的合并提交中。所以要么你做了一些你没有告诉我们的其他事情,要么你测试“变化是否存在”的方法是错误的。
-
例如,您说“尽管如此文件不包含更改”。好的,所以它可能不包含 now 的更改。但这将是由于稍后完成的。我们在 HEAD 负 93;那里有 92 次后来的提交可以扭转这些变化。
-
追踪 D、C 和 B 中发生的事情,
git checkout E(分离,只是暂时的)然后说git show HEAD^2,然后是git show HEAD^2~1,然后是git show HEAD^2~2。