git - 我修改而不是解决交互式 rebase 中的冲突。我可以撤消吗?

标签 git git-amend git-merge-conflict

我正在做一个大型的交互式 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~1E ,等等。

您可以git show任何提交,git checkout <commit-id> -- <path>从中获取文件,git cherry-pick <commit-id>将该提交作为增量应用到您当前的位置,依此类推。

关于git - 我修改而不是解决交互式 rebase 中的冲突。我可以撤消吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41439424/

相关文章:

git - git 中 CVS 风格的标签实现

git - Docker:如何从 Github 存储库上的非主分支构建镜像

git - 如何撤消git中远程存储库的初始提交?

git - 如何使用 'git rebase -i' 对分支中的所有更改进行 rebase ?

linux - 如何测量 Linux 中命令的 IOPS?

git 修改后的 git merge 冲突 - "Your branch and ' origin/master' 已经分歧”

GIT merge 不相关的历史

git - 查看个别家长的git diff

git - git如何找出冲​​突中未 merge 的路径?