我正在做一个大型的交互式 rebase,我正在编辑类似 8 个提交的内容。这是通过 git commit --amend
完成的。我的问题是,有一次我遇到了一个我没有注意到的 merge 冲突,所以我继续天真地修改和 git rebase --continue
-ing。显然,我现在已经将多个提交修改为一个,并且在完成 rebase 后,我的大约 4 个提交消失了。更改已修改为其他提交。
我有什么方法可以撤消这些修改,或者重新应用已经消失的提交?
当然;一种解决方案是返回并再次进行 rebase,但我在 rebase 中做了很多编辑,所以我希望不必重新做所有的工作。我如何陷入这种困境是另一回事。
Git 树示例:
rebase 前:A-B-C-D-E-F
rebase 后:A-B-C-F
(C 现在已经修改了 D 和 E 的变化)
最佳答案
您所做的每个提交,无论是否修改,都仍然“在其中”,并且它们都可以通过 reflogs 找到。这是因为 git commit --amend
没有实际上改变任何东西,它只是做了一个新的提交,“把旧的推到一边”,就像它一样。
您没有做出的提交(即,如果索引中存在冲突状态以致 git commit
拒绝做出提交)当然不会被保存。
使用 git reflog
(或 git reflog HEAD
)查找每个提交。您可能希望将它们的原始哈希 ID 保存在文件中以进行剪切和粘贴,因为命名它们的简单方法是 HEAD@{3}
等等,都是相对的,并且会不断变化。 (即,每次调整 HEAD
时,HEAD@{3}
现在是 HEAD@{4}
,HEAD@{5}
,很快 HEAD@{7}
,最后是 HEAD@{198}
,哎呀!:-))
您也可以使用名称 ORIG_HEAD
立即恢复原始链(如果您没有运行任何其他命令) .也就是说,当你运行 git rebase -i
时会发生什么?然后做你所有的编辑,修改提交等等,最后完成,是git rebase
将原始分支提示保存在名称 ORIG_HEAD
下.您可以使新的分支或标记名称指向该原始提交,然后使用 name
, name~1
, name~2
,依此类推以引用原始(预 rebase )提交:
git tag oops ORIG_HEAD
现在 oops
是提交 F
, oops~1
是 E
,等等。
您可以git show
任何提交,git checkout <commit-id> -- <path>
从中获取文件,git cherry-pick <commit-id>
将该提交作为增量应用到您当前的位置,依此类推。
关于git - 我修改而不是解决交互式 rebase 中的冲突。我可以撤消吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41439424/