在Git中,如果你不满意之前的变更,并想要回滚rebase(变基),该怎么做?
Git没有用于rebase的dry-run(干运行)功能。如果我已经进行了rebase操作并且还没有推送到远程仓库,我应该如何回滚到之前的状态,就好像从未发生过一样?
在Git中,如果你不满意之前的变更,并想要回滚rebase(变基),该怎么做?
Git没有用于rebase的dry-run(干运行)功能。如果我已经进行了rebase操作并且还没有推送到远程仓库,我应该如何回滚到之前的状态,就好像从未发生过一样?
你可以使用reflog来查找重置操作之前的第一个动作,然后使用reset --hard命令回到该动作。例如:
$ git reflog
b710729 HEAD@{0}: rebase: some commit
5ad7c1c HEAD@{1}: rebase: another commit
deafcbf HEAD@{2}: checkout: moving from master to my-branch
...
$ git reset HEAD@{2} --hard
现在你应该回到 rebase 开始之前的状态。
要找到正确的重置位置,只需选择最靠近顶部的不以“rebase”开头的条目。
更新:如评论和其他答案中所提到的,您还可以使用 ORIG_HEAD
作为查找重置位置的更简单方法:git reset ORIG_HEAD --hard
如果 rebase 是你在该分支上唯一进行的操作,即你没有未推送的提交/更改 - 那么你可以使用 git branch -D
删除本地分支,然后再次检出:
$ git checkout my-branch
$ git rebase master
// not happy with the result
$ git checkout master
$ git branch -D my-branch
$ git checkout my-branch
或者为了达到相同的效果,您可以将 --hard 重置到原始分支:
$ git reset --hard origin/my-branch
如果在有其他未推送的提交时执行了此操作,则这些提交将会丢失。在这种情况下,只需使用上面介绍的reflog方法跳转回你做这些提交的reflog条目。
ORIG_HEAD
设置为正在进行变基操作的分支的原始哈希值。因此,您可以直接使用 ORIG_HEAD
而不必查找 HEAD@{2}
中的数字 2...但是,前提是 ORIG_HEAD
仍然没有被修改。一些 Git 命令(在各种情况下)会设置它,包括变基、应用、重置和合并。 - torekRebase会把旧状态备份为ORIG_HEAD
,因此你可以通过运行以下命令来还原最后的rebase:
git reset --hard ORIG_HEAD