在 git 变基期间备份到之前的冲突

Back up to a previous conflict during git rebase

我正在以非交互方式将功能分支重新设置为 master:git rebase feature master

在此过程中出现了一系列冲突,我一次一个地手动解决它们。然而,在冲突 #3 中,我忘记保存一个包含一系列广泛更改的文件,只是盲目地 git add 文件,冲突和所有,git rebase --continue.

现在我遇到了另一个冲突,由于之前的冲突,文件看起来一团糟。 git rebase 提供给我 --continue--skip--abort,我不想做任何这些:我想 "back up" 到上一个提交并保存我在 "re-applying" 补丁之前忘记保存的更改,在 rebase 的这一步。

完成此操作的最简单方法是什么?

不幸的是,这是 Git 非常弱的一个案例。

底层系统中的一些东西可以使 "back up to where I was a few steps ago" 变得容易(好吧,它 容易,即使有交互式变基,如果 Git 保存每个步骤的 rebase-to-do 说明表,它没有但可以很容易地完成)。但是 rebase 代码中没有任何东西可以真正实现这一点。

如果您到目前为止在提交中投入了大量工作,您现在可以在分离的 HEAD 上设置分支或标签名称:

git tag temp-save

例如——然后使用git rebase --abort退出整个变基。

否则,使用git rebase --abort退出整个变基。

然后,从你的 git rebase 开始。

当你遇到一个你已经解决的冲突时,你可以重新使用你之前所做的任何提交,现在中止,运行ning:

git log temp-save

并找到您在之前 运行 中所做的提交。使用:

git reset --hard
git read-tree -u <hash>

——或者更简单,但我还没有测试过:

git read-tree --reset -u <hash>

—使用在终止的 rebase 的 temp-save 输出中找到的散列来加载您之前所做的工作的索引和工作树,如 git log temp-save 所找到的那样。如果需要,您可以进一步修复它,git rebase --continue。一旦你过了你想倒回的点,你可以删除临时分支或标签:

git tag -d temp-save

你在第一轮变基中所做的提交将变得很难找到。

以下是我为解决此问题所做的工作,以供将来参考。 post 给出了一些提示:

  1. 保存一份我忘记保存的文件。
  2. git rebase --abort.
  3. .git/logs/HEAD 中查找我搞砸的提交 SHA。 (即使在中止变基之后,这些也会被保存。)
  4. git checkout -b recovery SHA.
  5. 在冲突版本(我错过的保存)和 git commit -m "resolve conflicts".
  6. 之上保存冲突解决版本的文件
  7. git cherry-pick 剩余的 rebase 提交到 recovery。完成变基(这次更小心地保存更改:)。
  8. git checkout featuregit reset --hard recovery.

如果我执行上面的这个过程,上面会有额外的 "resolve conflicts" 提交。如果它很重要,我可以通过在 master 之上执行 git rebase -i 并将其压缩到它应该属于的提交中来摆脱它。