Git如何回滚基准


101

在Git中,如果您对重新设置不满意,该如何回滚?

Git没有试运行的基础。如果我进行了变基并且还没有推送,那么如何回滚到以前,好像从未发生过?


4
git rebase --abort
olibiaz

2
您是什么意思“失败”?您是否完成了变基,但您不喜欢结果?还是您遇到冲突并想在中间停止重新部署?我想是前者,因为您不能推动有冲突的,未完成的基础,但是我问是因为它们是两个不同的问题。
爱德华·汤姆森

是的,前任。谢谢。
user1615666 '16

Answers:


210

您可以使用reflog在重新启动基准之前找到第一个操作,然后将--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”开头的条目。

替代方法

如果重新部署是您在分支上唯一要做的事情,即您没有未推送的提交/更改-那么您可以使用删除本地分支,git branch -D然后再次签出:

$ git checkout my-branch
$ git rebase master
// not happy with result
$ git checkout master
$ git branch -D my-branch
$ git checkout my-branch

或出于相同的效果,您可以将--hard重置为origin分支:

$ git reset --hard origin/my-branch

如果您在执行其他未按下的提交时这样做,那么您将丢失它们。在这种情况下,只需使用上面的reflog方法跳回到您进行提交的reflog条目。


11
另一个方便的快捷方式:rebase设置ORIG_HEAD为要重新建立分支的原始哈希值。因此,而不是寻找号2 HEAD@{2},你可以只使用ORIG_HEAD...但如果ORIG_HEAD仍然不受干扰。一堆Git命令对其进行了设置(在各种情况下会变基,修改,重置和合并)。
torek 2016年

1
谢谢你,先生!对此有很大帮助:)
Alec

1
谢谢我的源代码....使用此$ git reset HEAD @ {2} --hard
reza rahmad

收到建议,建议我删除本地分支并再次拉出它!
quicklikerabbit

1
这可以节省生命。谢谢@Robbie
Nelson Katale

41

Rebase保留旧状态的备份为ORIG_HEAD
因此,您可以通过运行以下命令还原上一个基准:

git reset --hard ORIG_HEAD

1
您是否偶然知道该标签的记录位置?
奔小号

这有不利之处还是新功能?这似乎比筛选reflog容易得多。
1252748

这不是新的。但是您通常会在重新设置基准后立即使用它,无法在多次重新设置基准后追溯回溯。对于这些复杂的情况,您会寻找重新记录的东西,但是对于“哎呀,我刚才做了什么?我该如何还原?那现在?” 它工作正常。
Meligy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.