我正在做一个很长的
git rebase
,有很多提交。我不小心 --skipped
提交了一些我解决的冲突。我应该这样做git rebase --continue
。
有没有办法在这个变基阶段重新应用之前的提交,然后继续变基?
我认为的一种方法是
或者我可以在 rebase 阶段进行挑选吗?
Git 很棒,因为它基本上保存了您提交的所有内容的日志。
在“.git/logs/HEAD”中找到您的提交并在文本编辑器中打开
在 HEAD 文件中找到您的 SHA
3c8c... 2260dc... 全名 {[email protected]} 1471276956 -0600 提交:保存试用版 1,2,3
键入(注意键入足够的 sha,以便 git 知道要拉取哪一个):
git checkout -b 恢复 2260d...
请参阅参考链接:http://blog.screensteps.com/recovering-from-a-disastrous-git-rebase-mistake
我找到了一种“对我有用”的方法:
在变基期间,
.git/rebase-apply
目录中发生了很多事情。其中有一个名为 next
的文件。 next
包含一个与也驻留在 .git/rebase-apply
中的文件相对应的数字。该文件包含有关当前正在处理的提交的信息。例如:
$ cat .git/rebase-apply/next
0260
$ less .git/rebase-apply/0260
<info about the commit which is currently processed (and has conflicts)
Git 似乎保留了上述文件中跳过的提交。而与已应用的提交相对应的文件不再存在。我不小心跳过的提交名为 0259,并且该文件仍然存在。
这就是我所做的:
$ echo "0258" > .git/rebase-apply/next
我告诉 git 目前第 258 个提交已处理(之前应用正确)。然后我就这么做了
$ git rebase --skip
告诉 git 忘记这个,瞧,我可以再次处理跳过的提交,纠正冲突,然后
--continue
。已经成功了。
对我来说,我在
.git/REBASE_HEAD
中找到了变基哈希并复制了该哈希。然后在我做了 git rebase --skip
的分支,我做了 git merge {copied hash}
。它成功了!
现有的答案很好,但我找到了一种更快的方法来恢复我刚刚 rebase-skipped/'lost' 的单个提交:
git cherry-pick -x <commit-hash>
。每当您搞乱提交并且想要返回到之前的工作状态时。永远记住执行这 3 个步骤。
就是这样。