交互式变基中我修改而不是解决冲突了,我能撤销吗?

3
我正在进行一项大型交互式rebase操作,其中我正在编辑大约8个提交。这是通过使用git commit --amend完成的。我的问题是,在某个时刻我遇到了一个合并冲突,但我没有注意到,所以我继续幼稚地修改和git rebase --continue。显然,我现在已经将多个提交修改为一个,并且在完成rebase后,我的4个提交消失了。更改已经被修改到其他提交中。
是否有任何方法可以撤消这些修改,或者重新应用丢失的提交?
当然;一种解决方案是返回并重新进行rebase,但是我在rebase中进行了很多编辑,因此我不想重做所有工作。我陷入这种困境的方式是另一件事。
Git树示例:
rebase之前:A-B-C-D-E-F rebase之后:A-B-C-F(C现在具有来自D和E的更改)

我不知道如何将 C 提交拆分成多个原始部分。我个人会重新做一次变基。 - Tim Biegeleisen
也许有人能为你提供一个万无一失的解决方案。从我的观察来看,重新开始可能是较小的恶。 - Tim Biegeleisen
3个回答

4
你所做的每个提交,无论是否被修改,仍然“在那里”,并且可以通过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下。您可以创建一个新的分支或标签名称指向该原始提交,然后使用namename~1name~2等来引用原始(重新排列之前)提交。
git tag oops ORIG_HEAD

现在 oops 是提交 Foops~1E,以此类推。
您可以使用 git show 查看任何提交、git checkout <commit-id> -- <path> 获取其中的文件,git cherry-pick <commit-id> 将该提交作为增量应用到您当前的位置,等等。

3
可以的。通常情况下我会立即回头重新做一遍,但我可以理解这个问题 - 听起来你已经在rebase上投入了很多时间,所以重做所有的工作似乎并不邀请。
我假设您的示例中F的内容正是您想要的最终结果,只是缺少D和E提交。
你可以这样做:
git checkout C             # "git status" should be empty right now
git checkout F .
git reset .
git add only-changes-from-D ; git commit -m D
git add only-changes-from-E ; git commit -m E
git add -A ; git commit -m F
git checkout F . ; git reset . 命令会让你的工作目录包含 F,但是你的 HEAD 仍然指向 C,并且索引中没有任何内容。现在,git status 将显示 CF 之间的完整差异。
现在,您可以使用您喜欢的添加/提交工具(我喜欢 git gui)并选择原始属于 D 的每个更改,并进行提交。重复此步骤以处理 E。之后,只有来自 F 的更改存在;您可以一次性添加并提交它们。当然,如果在 EF 之间还有更多的更改,则需要重复此过程。
这样做的好处是,您实际上不需要更改任何内容。最终结果将完全是 F,但您将根据需要获得一些中间提交。

2
重新基于/修改提交后,原始提交仍然存在。尽管如果它不通过分支可达,则不会出现在 git log 中。
我认为通过使用 git reflog,您可以实现想要的操作。 git reflog //标识您想要的提交哈希值,查找您想要撤消的 --amend 提交 git checkout B git cherry-pick 已解决重定位期间提交 C 的哈希值但在修改前 git cherry-pick 带有 D 修改后提交 C 的哈希值 git cherry-pick 带有 E 修改后提交 C 的哈希值 git cherry-pick F

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接