我一直在进行变基。我已经处理了一些冲突,但最终走错了方向,现在我只想重新开始解决这些冲突。
我想重置变基,这样我仍然可以变基到当前提交,但工作副本已经被重置到第一次出现冲突的提交。
如何在当前提交上重置变基?
如果您正在执行变基操作,您可以进行以下操作:
git rebase --abort
首先,清理杂物:
git reset --hard HEAD
然后,挑选你正在变基的提交:
git cherry-pick -n `git rev-parse REBASE_HEAD`
就是这样。像往常一样,在解决冲突后,您将能够继续执行变基。
如果您只想为特定文件重新合并,您需要做的就是:
git checkout -m <file>
如果你想重新做整个提交,这是我如何做的(可能有更好的方法):
我运行 git status
,在Git 2.0.0及以上版本中,会给我一个类似下面这样的输出(仅适用于交互式rebase):
interactive rebase in progress; onto 14ed389
Last command done (1 command done):
pick db2511c Modify file
Next command to do (1 remaining command):
pick d1c2037 Modify file one more time
(use "git rebase --edit-todo" to view and edit)
You are currently rebasing branch 'other' on '14ed389'.
(fix conflicts and then run "git rebase --continue")
(use "git rebase --skip" to skip this patch)
(use "git rebase --abort" to check out the original branch)
Unmerged paths:
(use "git reset HEAD <file>..." to unstage)
(use "git add <file>..." to mark resolution)
both modified: file.txt
pick db2511c 修改文件
git rebase --edit-todo
,并将该行粘贴到文件顶部git rebase --skip
如果你经常这样做(像我一样),你可以创建一个有用的git别名(基于Pierre的优雅答案)
[alias]
# Restart the current rebase step if you accidentally messed it up
# SEE: https://dev59.com/LVsW5IYBdhLWcg3wSFjW#53141807
restart-rebase-step = !git reset --hard HEAD && git cherry-pick -n `git rev-parse REBASE_HEAD`
之后您可以在命令行中调用它:
git restart-rebase-step
如果要使用 elstgav resolution 而不带别名,请先进行重置:
git reset --hard HEAD
然后获取rebase的SHA1:
rev-parse REBASE_HEAD
b10b228e263dfa223221036fa17506445a101f0f // this is the SHA1 value
接着,使用SHA1值与cherry-pick
命令:
git cherry-pick -n b10b228e263dfa223221036fa17506445a101f0f
git rebase --abort
),那么我猜您需要查看目录.git/rebase-apply
并检查patch
文件。它包含在重新设置期间进行的所有更改。在执行git rebase --abort
后,您需要手动应用此补丁。