【问题标题】:How to get back to most recent version in Git?如何回到 Git 中的最新版本?
【发布时间】:2011-04-03 07:28:15
【问题描述】:

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

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

我该怎么做?此外,有没有比输入哈希更简单的方法来更改版本 - 例如“返回两个版本”或“转到按时间顺序排列的最新版本”?

【问题讨论】:

    标签: git git-checkout


    【解决方案1】:

    git checkout master 应该可以解决问题。要返回两个版本,你可以说类似git checkout HEAD~2,但最好在那个时候创建​​一个临时分支基于,所以git checkout -b temp_branch HEAD~2

    【讨论】:

    • 酷! git checkout master 正是我从分支切换回来的方式。那么这是否意味着当我签出以前的版本时,我实际上是在创建一个分支?
    • @Nathan:在 git 中,分支实际上主要是指向某个修订的可移动指针。所以从概念上讲,你是在创建一个分支,但不是 git 认为的分支。
    • 所以在最简单的情况下,我有一堆线性变化,当我检查早期版本时,我将 HEAD 指针移到那里,这意味着git log 将显示相对于那一点?当我结帐master时,我将指针移动到master分支的最新版本?
    • @Nathan:没错。 HEAD 是一种称为符号引用的东西 - 它通常是指向另一个引用(当前签出的分支)的指针。 git checkout 是一种移动 HEAD 的方法。当你分离 HEAD 时,你让它直接指向给定的提交;当您再次签出 master 时,它又指向 master。 (并且许多像git log 这样的命令实际上采用了一个修订范围,默认为HEAD。)
    • 是的 - HEAD 是“代词”,用于指代“工作目录中的代码版本”。它也是“你接下来提交的任何事情的父母”的代名词
    【解决方案2】:

    当您签出特定的提交时,git 会创建一个分离的分支。所以,如果你打电话:

    $ git branch 
    

    你会看到类似的东西:

    * (detached from 3i4j25)
      master
      other_branch
    

    要回到主分支头,你只需要再次结帐到你的主分支:

    $ 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"
      

    之后你可以回到你的主分支(最新版本):

    $ git checkout master
    

    【讨论】:

      【解决方案3】:

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

      git reset --hard origin/master
      

      【讨论】:

      • reset --hard 太过分了,表明您不知道您所做的修改。这可能会导致它丢失代码。
      • 就我而言,我想摆脱未推送的意外提交的更改。我知道可以有其他方法来实现这一点。我同意,如果您不想放弃未推送的已提交更改,这就是数据丢失。
      • 这个答案有一个小细节。如果远程分支收到强制推送提交(例如,由于rebaseamend),您的本地/远程分支将分歧,您需要将本地分支重置为远程分支,使用远程更新本地分支修改。在这种情况下,您并没有真正返回到最新版本。如需正确答案,请搜索git remote branch diverged
      【解决方案4】:

      这里的一些答案假设您在决定签出较旧的提交之前处于 master 分支。情况并非总是如此。

      git checkout -
      

      将指向您之前所在的分支(无论它是否是主分支)。

      【讨论】:

      • 不需要分支,它会将 HEAD 指向它之前指向的位置;如果你在git checkout hash1 之后做了git checkout hash2git checkout - 将带你回到hash1
      【解决方案5】:

      返回最新版本:

      git checkout <branch-name> 
      

      例如,git checkout mastergit checkout dev

      【讨论】:

        【解决方案6】:

        一方面,您可以使用分支名称进行结帐。

        我知道有几种方法可以移动 HEAD,但我会留给 git 专家来列举它们。

        我只是想建议gitk --all——我发现它在开始使用 git 时非常有用。

        【讨论】:

          【解决方案7】:

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

          顺便说一句,给你的.gitconfig添加一个这样的别名,格式稍微好一点,你可以运行git hist --all

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

          关于相对版本,我找到了这个post,但它只谈论旧版本,可能没有什么可以参考新版本。

          【讨论】:

            【解决方案8】:

            当你回到以前的版本时,

            $ 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
            

            【讨论】:

              【解决方案9】:

              对于 Git 2.23+(2019 年 8 月),最佳做法是使用 git switch 而不是 confusing git checkout 命令。

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

              git switch -c temp_branch HEAD~2
              

              回到当前的master分支:

              git switch master
              

              【讨论】:

                【解决方案10】:

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

                git stash
                

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

                git stash apply
                

                【讨论】:

                • 我知道它已经很老了,但我必须对此发表评论(因为我认为不应该使用这个解决方案) - 我不会使用这个解决方案,因为它不能解决这个问题但是一个不同的问题。每次您想要结帐到先前的提交时,使用此存储解决方案,您实际上“保存”了数据,这在这种情况下是非常不必要的。正确且更优雅的方式是(如前所述)结帐 .
                猜你喜欢
                • 1970-01-01
                • 2012-11-27
                • 1970-01-01
                • 1970-01-01
                • 2015-04-06
                • 2012-02-15
                • 2013-01-27
                • 2023-03-04
                相关资源
                最近更新 更多