如何回到Git的最新版本?


303

我最近从SVN转到了Git,对某些事情有些困惑。我需要通过调试器运行脚本的先前版本,因此我做了git checkout <previous version hash>并且做了我需要做的事情。

现在我想回到最新版本,但是我不知道它的哈希值。当我输入时git log,我看不到它。

我怎样才能做到这一点?另外,有没有比键入哈希更简单的方法来更改版本-例如“返回两个版本”或“按时间顺序排列最近”?

Answers:


371

git checkout master应该可以。要返回两个版本,您可以说类似git checkout HEAD~2,但最好根据该时间创建一个临时分支,因此git checkout -b temp_branch HEAD~2


7
凉!git checkout master这正是我从分支机构切回的方式。这是否意味着当我签出以前的版本时,实际上是在创建分支?
内森·朗

4
@Nathan:在git中,分支实际上实际上是指向某个修订的可移动指针。因此,从概念上讲,您正在创建一个分支,但并非git认为分支。
DLH

2
因此,在最简单的情况下,当我进行一系列线性更改时,当我签出较早的修订版时,我将HEAD指针移到那里,这意味着git log相对于该点将显示?当我结帐master时,将指针移到master分支的最新版本吗?
内森·朗

7
@内森:是的。HEAD是一种称为符号ref的东西-通常是指向另一个ref(当前签出的分支)的指针。git checkout是移动HEAD的一种方式。当您分离HEAD时,将其直接指向给定的提交;当您再次签出母版时,它将指向母版。(很多命令git log实际上都包含一个修订范围,默认为HEAD。)
Cascabel 2010年

3
是的-HEAD是用来指代“工作目录中代码的版本”的“代词”。它也是“接下来要做的事情的父母”的代名词
安娜·贝茨

54

当您签出到特定提交时,git会创建一个分离的分支。因此,如果您致电:

$ git branch 

您将看到类似以下内容:

* (detached from 3i4j25)
  master
  other_branch

要返回master分支头,您只需要再次签出到master分支即可:

$ git checkout master

此命令将自动删除分离的分支。

如果git checkout不起作用,则可能是因为分支之间的修改文件冲突。为了防止丢失代码,git需要您处理这些文件。您有三种选择:

  1. 存储您的修改(以后可以将其弹出):

    $ git stash
    
  2. 放弃更改以重置分离的分支:

    $ git reset --hard
    
  3. 使用先前的修改创建一个新分支,并提交它们:

    $ git checkout -b my_new_branch
    $ git add my_file.ext
    $ git commit -m "My cool msg"
    

之后,您可以返回到您的master分支(最新版本):

$ git checkout master

36

这对我有用(我仍然在master分支上):

git reset --hard origin/master

34
reset --hard是一个过大的杀伤力,它表明您不知道所做的修改。这可能会导致其丢失代码。
Thomio'3

1
以我为例,我想摆脱未推动的意外更改。我知道还有其他方法可以实现这一目标。我同意,如果您不想丢失未执行的已提交更改,这就是数据丢失。
卡萨巴·托斯


7

您可以使用分支名称签出一件事。

我知道有几种方法可以移动HEAD,但我将其留给git专家进行枚举。

我只是想建议gitk --all-从git开始时,它非常有用。


7

我才刚刚开始更深入地研究git,所以不确定我是否理解正确,但是我认为OP问题的正确答案是可以git log --all使用如下格式说明运行:git log --all --pretty=format:'%h: %s %d'。这会将当前签出的版本标记为(HEAD),您可以从列表中获取下一个版本。

顺便说一句,为您的别名添加.gitconfig格式稍好一些的别名,然后可以运行git hist --all

  hist = log --pretty=format:\"%h %ai | %s%d [%an]\" --graph

关于相对版本,我发现了这篇文章,但是它只谈论较旧的版本,可能没有什么可以引用较新的版本。


6

这里的一些答案假设您在决定签出较早的提交之前就已经在master分支上。这并非总是如此。

git checkout -

将把您带回到您以前所在的分支(无论它是否是主分支)。


不需要分支,它将指向HEAD之前指向的位置;如果你git checkout hash2之后做过git checkout hash1git checkout -将会带你回到hash1
米哈伊尔·瓦辛

3

当您返回以前的版本时,

$ git checkout HEAD~2
Previous HEAD position was 363a8d7... Fixed a bug #32

即使在这种情况下,也可以使用此命令查看功能日志(哈希)。

$ git log master --oneline -5
4b5f9c2 Fixed a bug #34
9820632 Fixed a bug #33
...

master 可以替换为另一个分支名称。

然后签出,您将可以返回到该功能。

$ git checkout 4b5f9c2
HEAD is now at 4b5f9c2... Fixed a bug #34

1

使用Git 2.23+(2019年8月)时,最佳做法是使用git switch而不是混乱的git checkout命令。

要基于旧版本创建新分支:

git switch -c temp_branch HEAD~2

返回当前的master分支:

git switch master

0

一个更优雅,更简单的解决方案是使用

git stash

它会返回到该分支最近的本地版本,并将您的更改保存在存储中,因此,如果要撤消此操作,请执行以下操作:

git stash apply

我知道它已经很老了,但是我必须对此发表评论(因为我认为不应该使用此解决方案)-我不会使用该解决方案,因为它不能解决这个问题,而是一个不同的问题。使用这种存储解决方案,每次您想要签出到先前的提交时,您实际上就“保存”了数据,这对于这种情况是非常不必要的。正确且更优雅的方法是(如前所述)仅检出<branch>。
Maayao
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.