gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:06:22 25 4
gpt4 key购买 nike

我正在做一个大型的交互式 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com