如何将git存储库切换到特定提交


189

在我的git仓库中,我做了5次提交,就像下面的git日志中一样:

commit 4f8b120cdafecc5144d7cdae472c36ec80315fdc
Author: Michael 
Date:   Fri Feb 4 15:26:38 2011 -0800

commit b688d46f55db1bc304f7f689a065331fc1715079
Author: Michael
Date:   Mon Jan 31 10:37:42 2011 -0800

commit b364f9dcec3b0d52666c4f03eb5f6efb7e1e7bda
Author: Michael
Date:   Wed Jan 26 13:33:17 2011 -0800

commit 4771e26619b9acba3f059b491c6c6d70115e696c
Author: Michael 
Date:   Wed Jan 26 11:16:51 2011 -0800

commit 6e559cb951b9bfa14243b925c1972a1bd2586d59
Author: Michael 
Date:   Fri Jan 21 11:42:27 2011 -0800

如何在分支中本地回滚以前的4次提交?换句话说,如何在没有最近的4次提交的情况下创建分支(假设我从git log获得了该提交的SHA)?

Answers:


230

要创建一个新的分支(本地):

  • 使用提交哈希(或部分哈希)

    git checkout -b new_branch 6e559cb
    
  • 或返回HEAD的4次提交

    git checkout -b new_branch HEAD~4
    

在本地创建新分支后,您可能希望将此更改复制到同名远程服务器上:如何将更改推送到远程分支


有关丢弃最后三个提交的信息,请参见下面的Lunaryorn的答案


有关将当前分支HEAD移至指定提交而不创建新分支的信息,请参阅下面的Arpiagar的答案


153

上面所有的命令都会创建一个新分支,并且最新的提交是该命令中指定的提交,但是如果您希望当前分支HEAD移到指定的提交,则下面是该命令:

 git checkout <commit_hash>

当用户只想查看分支状态直到该特定提交时,它将分离并指向HEAD指定的提交,并避免创建新分支。


然后,您可能想返回到最新的提交并修复分离的HEAD:

修复Git分离头?


1
这将使头部脱落。不方便。
IgorGanapolsky '16

即使<commit_hash>在另一个分支中的哪一个呢?
Ciasto piekarz

链接的问题只针对git checkout master,可能只适用于某些情况的一两个情况。
i336_

66

如果要丢弃最近的四次提交,请使用:

git reset --hard HEAD^^^^

或者,您可以指定要重置为的提交的哈希值:

git reset --hard 6e559cb

4
这省去了分支步骤。如果他完全按照此处显示的方式运行,他将永久失去这些最高的承诺。
Jimmy Cuadra

3
好吧,不一定是永久的-可以通过获得前一个磁头的SHA git reflog并将其重置回它-但是,它将被丢弃。
琥珀

1
如果首先推送提交然后将其重置,则只需拉动即可再次检索它们。
瑞克·史密斯

17

只需签出您希望新分支开始的提交并创建一个新分支

git checkout -b newbranch 6e559cb95

0

如何在分支中本地回滚以前的4次提交?

这意味着,您不会创建新分支并进入分离状态。这样做的新方法是:

git switch --detach revison

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.