【问题标题】:Git: "Not currently on any branch." Is there an easy way to get back on a branch, while keeping the changes?Git:“目前不在任何分支上。”有没有一种简单的方法可以返回分支,同时保留更改?
【发布时间】:2011-06-11 18:09:03
【问题描述】:

所以我在存储库中做了一些工作,当我即将提交时,我意识到我目前不在任何分支上。

在使用子模块时经常发生这种情况,我能够解决它,但是这个过程很乏味,我一直在想必须有一种更简单的方法来做到这一点。

有没有一种简单的方法可以在保留更改的同时返回分支?

【问题讨论】:

    标签: git branch git-checkout


    【解决方案1】:

    如果你还没有提交:

    git stash
    git checkout some-branch
    git stash pop
    

    如果您已提交并且此后未更改任何内容:

    git log --oneline -n1 # this will give you the SHA
    git checkout some-branch
    git merge ${commit-sha}
    

    如果你已经承诺然后做了额外的工作:

    git stash
    git log --oneline -n1 # this will give you the SHA
    git checkout some-branch
    git merge ${commit-sha}
    git stash pop
    

    【讨论】:

    • 如果你已经提交:记下你提交的哈希值(使用git showgit rev-parse HEAD),切换到分支,然后git cherry-pick后面跟着提交哈希值。
    • 如果提交,获取上次提交的哈希值。查看您希望进入的分行,并git merge _hash_
    • 请务必小心。如果您已提交更改并按照以下步骤操作...您将看到消息...“您的分支和原点/主节点已分歧”。
    • @thinkanotherone 如果您已经提交了您的更改,那么就没有什么可存储的了,并且签出不同的分支并不是世界末日。您刚刚提交的提交仍然存在,您可以使用 git merge <hash-of-the-commit-you-just-made> 将其合并到该分支。
    • 这是有风险的,以防您最终遇到合并冲突,并且您是 git 初学者。我更喜欢babay's answer,因为创建当前点的分支是跟踪代码位置的良好第一步。
    【解决方案2】:

    这对我有帮助

    git checkout -b newbranch
    git checkout master
    git merge newbranch
    git branch -d newbranch
    

    【讨论】:

    • 如果你已经进行了多次提交,这就是你需要做的。
    • 没试过,不过好像可以。但是我认为这是一个不太可能的情况。我相信大多数人会在提交之前意识到他们不在任何分支上,并使用公认的答案来解决这个问题。
    • @ErikB 我什至不知道有没有不在分支上的事情。这个答案对我很有帮助。
    • 可爱的答案,实际上只是输入并工作,与作为 GIT 初学者遇到的几乎所有其他事情不同 - 您可能想指出 newbranch 是一个任意名称,不打算用提交哈希
    • 截至 2015 年 9 月 28 日的有效、有效的解决方案。最后一个命令可选 - 它删除新创建的分支。
    【解决方案3】:
    git checkout master
    

    结果是这样的:

    Warning: you are leaving 2 commits behind, not connected to
    any of your branches:
    
    1e7822f readme
    0116b5b returned to clean django
    
    If you want to keep them by creating a new branch, this may be a good time to do so with:
    git branch new_branch_name 1e7822f25e376d6a1182bb86a0adf3a774920e1e
    

    那么,让我们开始吧:

    git merge 1e7822f25e376d6a1182bb86a0adf3a774920e1e
    

    【讨论】:

    • 我没有尝试过,但它似乎可以正常工作。我想如果你在运行这两个命令之间运行git gc,你会丢失这些提交,但除非你自动运行git gc,否则这应该是一种相当无风险的方法。我仍然会接受 babay 的回答,但如果你想避免编写两个额外的命令,我想这是要走的路。
    • 我在某个时候离开了主分支,我不完全确定。我已经提交了我的更改,主人没有任何更改。这些说明将我的更改带到了主分支,一切都很好。
    • +1 我很担心要检查另一个分支而留下提交,看到这条消息增加了去做它的信心。
    【解决方案4】:

    这里另辟蹊径

    git branch newbranch
    git checkout master 
    git merge newbranch 
    

    【讨论】:

    • @ErikB 他可能已经完成了多次提交。在这种情况下,请参阅 babay 的回答。
    • @BenjaminOakes 可能是这样,但这些 git 命令甚至都无效。
    • @ErikB 绝对正确。 :) babay 的回答是 Alex 似乎一直在尝试做的事情的有效形式。
    【解决方案5】:

    或者,您可以设置您的子模块,这样您就可以签出一个分支,而不是处于默认的分离头状态。

    编辑添加:

    一种方法是在使用 -b 标志添加子模块时检查子模块的特定分支:

    git submodule add -b master <remote-repo> <path-to-add-it-to>
    

    另一种方法是直接进入子模块目录并检查一下

    git checkout master
    

    【讨论】:

    • 你能告诉我怎么做吗?
    • 有没有办法以这种默认分支模式更新现有子模块?更新gitmodules 或许?
    • @HertzelGuinness 不是。子模块在特定的提交 sha 处签出。分支只是指向 sha 的指针,它指向的 sha 可以更改。这没有用,因为它不会冻结已签出子模块的状态。如果您要对子模块进行更改,签出分支只是一种方便。
    【解决方案6】:

    在这种情况下结束的一种方法是在从远程分支执行 rebase 之后。在这种情况下,HEAD 指向新的提交,但 master 没有指向它们——它指向的是在你重新建立另一个分支之前的任何位置。

    您可以通过以下方式提交您的新master

    git branch -f master HEAD
    git checkout master
    

    这会强制更新master 以指向HEAD(不会让你进入master)然后切换到master

    【讨论】:

    • 按要求完美运行。我已经暂存文件并提交,但由于上述错误无法推送。以上两行代码运行良好,并按预期推送了我的代码。
    【解决方案7】:

    我最近又遇到了这个问题。自从我上次使用子模块并了解了更多关于 git 的知识以来已经有一段时间了,我意识到只需检查你想要提交的分支就足够了。即使您不存储,Git 也会保留工作树。

    git checkout existing_branch_name
    

    如果您想在新分支上工作,这应该适合您:

    git checkout -b new_branch_name
    

    如果您在工作树中发生冲突,结帐将失败,但这应该是非常不寻常的,如果发生这种情况,您可以将其隐藏、弹出并解决冲突。

    与已接受的答案相比,此答案将为您节省两个命令的执行时间,无论如何执行这些命令并不需要那么长时间。因此,我不会接受这个答案,除非它奇迹般地获得了比当前接受的答案更多的赞成票(或至少接近)。

    【讨论】:

      【解决方案8】:

      以下方法可能有效:

      git rebase HEAD master
      git checkout master
      

      这会将您当前的 HEAD 更改重新设置在 master 之上。然后就可以切换分支了。


      另一种方法是先签出分支:

      git checkout master
      

      然后 Git 应该显示你分离的提交的 SHA1,然后你可以挑选它们,例如

      git cherry-pick YOURSHA1
      

      或者你也可以合并最新的:

      git merge YOURSHA1
      

      要查看来自不同分支的所有提交(以确保您拥有它们),请运行:git reflog

      【讨论】:

        【解决方案9】:

        我知道我在 2012 年告诉 babay,我认为不太可能有人不会意识到他们不在分支上并提交。这只是发生在我身上,所以我想我不得不承认我错了,但考虑到直到 2016 年才发生在我身上,你可能会争辩说这实际上不太可能。

        无论如何,在我看来,创建一个新分支太过分了。您所要做的就是:

        git checkout some-branch
        git merge commit-sha
        

        如果你在检出另一个分支之前没有复制 commit-sha,你可以通过运行轻松找到它:

        git reflog
        

        【讨论】:

        • 对于一个男人来说这是一个罕见(不太可能)的问题。自 2012 年以来,我就没有发生过这种情况。但是,如果您将机会乘以 git 用户的数量……这很有可能。它可能每天都发生在某人身上。 :)
        【解决方案10】:

        我发现最好的方法是将我所做更改的文件复制到一个单独的文件夹中, 然后删除我目前在我的计算机上的存储库文件夹, 然后克隆主存储库并将文件放回去。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-17
          • 2011-08-28
          相关资源
          最近更新 更多