在 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 给出了一些提示:
- 保存一份我忘记保存的文件。
git rebase --abort
.
- 在
.git/logs/HEAD
中查找我搞砸的提交 SHA。 (即使在中止变基之后,这些也会被保存。)
git checkout -b recovery SHA
.
- 在冲突版本(我错过的保存)和
git commit -m "resolve conflicts"
. 之上保存冲突解决版本的文件
git cherry-pick
剩余的 rebase 提交到 recovery
。完成变基(这次更小心地保存更改:)。
git checkout feature
和 git reset --hard recovery
.
如果我执行上面的这个过程,上面会有额外的 "resolve conflicts"
提交。如果它很重要,我可以通过在 master
之上执行 git rebase -i
并将其压缩到它应该属于的提交中来摆脱它。
我正在以非交互方式将功能分支重新设置为 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 给出了一些提示:
- 保存一份我忘记保存的文件。
git rebase --abort
.- 在
.git/logs/HEAD
中查找我搞砸的提交 SHA。 (即使在中止变基之后,这些也会被保存。) git checkout -b recovery SHA
.- 在冲突版本(我错过的保存)和
git commit -m "resolve conflicts"
. 之上保存冲突解决版本的文件
git cherry-pick
剩余的 rebase 提交到recovery
。完成变基(这次更小心地保存更改:)。git checkout feature
和git reset --hard recovery
.
如果我执行上面的这个过程,上面会有额外的 "resolve conflicts"
提交。如果它很重要,我可以通过在 master
之上执行 git rebase -i
并将其压缩到它应该属于的提交中来摆脱它。