题 修一个Git分离的头?


我在我的存储库中做了一些工作,发现文件有本地更改。我不再想要它们,所以我删除了文件,以为我可以签出一份新的副本。我想做相当于的git

svn up .

运用 git pull 似乎没有用。一些随机搜索引导我到一个有人推荐做的网站

git checkout HEAD^ src/

src 是包含已删除文件的目录)。

现在我发现我有一个超然的头。我不知道那是什么。我怎么撤消?


984
2018-04-19 13:07


起源


git checkout master 会让你回到主分支。如果您想清除任何工作副本更改,您可能想要这样做 git reset --hard。 - Abe Voelker
也可以看看 为什么我的Git repo进入了独立的HEAD状态?。
如果你没有承诺,你可以做到 git checkout -- src/ - thesummersign
尝试这个: 链接。简而言之 create temp branch - checkout temp branch - checkout master - delete temp branch - fidev
@AbeVoelker你在评论中的意思是什么 working copy changes?您是指在检出另一次提交后对文件所做的更改(即,在处于分离头状态时所做的更改)? - Minh Tran


答案:


分离头意味着您不再在分支上,您已在历史记录中检出单个提交(在这种情况下是HEAD之前的提交,即HEAD ^)。

如果你想 删除 您与分离的HEAD相关的更改

您只需要检查您所在的分行,例如

git checkout master

下次更改文件并希望将其恢复到索引中的状态时,请不要先删除文件,只需执行此操作

git checkout -- path/to/foo

这会将文件foo恢复到索引中的状态。

如果你想 保持 您与分离的HEAD相关的更改

  1. git log -n 1;这将显示分离的HEAD上的最新提交。复制并粘贴提交哈希。
  2. git checkout master
  3. git branch tmp <commit-hash>。这会将您的更改保存在一个名为的新分支中 tmp
  4. 如果您想合并您所做的更改 master, 跑 git merge tmp 来自 master 科。你应该参加 master 跑完后分支 git checkout master

1411
2018-04-19 13:32



为什么这个错误首先发生?这是我讨厌git的事情之一 - 有时是完全随机的行为。 Mercurial从未遇到过这样的问题。 - Violet Giraffe
@VioletGiraffe它既不是错误也不是随机的 - 它只是您在检出先前提交时存储库进入的状态。如果您打算从那一点开始做任何工作,那么“分离头”可以作为警告,您可能还想创建或指向分支。但是如果您只是希望查看该标记或提交,那么处于分离头状态并没有错。 - Neil Neyman
如果您已经致力于分离头,请不要这样做,请参阅其他答案。如果这样做,你可以查看以前的头部git提及 Previous HEAD position was 7426948... - KCD
这样你就失去了分离的头部提交。 Downvoted。 - nottinhill
这个答案让我失去了所有的工作。 - jordanbtucker


如果您更改了不想丢失的文件,则可以推送它们。我已将它们以分离模式提交,之后您可以移动到临时分支以便稍后在master中集成。

git commit -m "....."
git branch my-temporary-work
git checkout master
git merge my-temporary-work

摘自:

如何处理分离头中的提交


368
2017-12-09 20:05



我发现这是首选解决方案 - 特别是如果您想要保留在签出单个版本时所做的更改。 - adswebwork
@adswebwork:我同意。所有其他答案建议恢复到以前的状态并且在分离的头状态中丢失本地更改。 - Sk8erPeter
为什么不 git stash ?因为这是我想到的第一件事。创建一个新的分支将是一个矫枉过正。 - thesummersign
你也可以 git rebase my-temporary-work 然后删除分支 git branch -d my-temporary-work 所以看起来好像你首先致力于正确的分支。 - Zoltán
@Zoltan检查这个答案 stackoverflow.com/a/27735365/751026 - thesummersign


如何退出(“修复”)分离的HEAD状态 当你在这种模式下已经改变了什么 并且,可选地,想要保存您的更改。

此解决方案无需创建临时分支即可运行。

  1. 提交您想要保留的更改。 如果要接管在分离的HEAD状态下所做的任何更改,请提交它们。喜欢:

    git commit -a -m "your commit message"
    
  2. 放弃您不想保留的更改。 硬重置将丢弃您在分离的HEAD状态下所做的任何未提交的更改:

    git reset --hard
    

    (如果没有这个,第3步会失败,抱怨分离的HEAD中修改过的未提交文件。)

  3. 看看你的分公司。 通过检出之前处理过的分支退出分离的HEAD状态,例如:

    git checkout master
    
  4. 接管你的提交。 您现在可以通过cherry-picking接管您在分离的HEAD状态下所做的提交,如图所示 我对另一个问题的回答

    git reflog
    git cherry-pick <hash1> <hash2> <hash3> …
    

107
2018-06-11 13:23





分离头意味着:  (1)你不再在一个分支上,  (2)您已在历史记录中检出了单个提交

如果你没有变化: 您可以通过应用以下命令切换到master

  git checkout master

如果您要保留更改: 

在分离的HEAD的情况下,提交工作正常,除了没有命名分支更新。要更新主分支 使用您提交的更改,在您所在的位置创建一个临时分支(这样临时分支将具有您在分离的HEAD中所做的所有已提交的更改),然后切换到主分支并将临时分支与主服务器合并。

git branch  temp
git checkout master
git merge temp

88
2017-08-29 00:39



完美,然后删除分支温度 - Davi Menezes


这是我刚刚意识到自己处于一个独立的头脑并且已经做出一些改变后我刚刚做的事情。

我承诺了改变。

$ git commit -m "..."
[detached HEAD 1fe56ad] ...

我记得提交的哈希值(1fe56ad)。然后我检查了我应该去的那个分支。

$ git checkout master
Switched to branch 'master'

最后,我将提交的更改应用于分支。

$ git cherry-pick 1fe56ad
[master 0b05f1e] ...

我认为这比创建临时分支要容易一些。


49
2017-08-02 23:33



这应该是答案。它取回你的nuked文件。 - BlindWanderer
是的,这真的是最简单的事情 - 简单到足以记住,而不会在下次发生时搜索网页。提交,注意哈希,返回你想要提交的分支,和 git cherry-pick <hash>。 - Mason
谢谢你的解决方案。这有帮助。我还要补充一点,我必须做一个“git push origin master”,以便我的master和origin / master指向同一个提交。 - turnip424


当您签出特定提交时 git,你最终进入了 独立的头 state ...也就是说,您的工作副本不再反映命名引用的状态(如“master”)。这对于检查存储库的过去状态非常有用,但如果您实际尝试还原更改,则不是您想要的。

如果您对特定文件进行了更改,并且只是想丢弃它们,则可以使用 checkout 像这样的命令:

git checkout myfile

这将丢弃任何未提交的更改,并将文件还原为它在当前分支头部的状态。如果要放弃已提交的更改,可能需要使用 reset 命令。例如,这会将存储库重置为先前提交的状态,并丢弃任何后续更改:

git reset --hard HEAD^

但是,如果您与其他人共享存储库,a git reset 可能具有破坏性(因为它会删除存储库历史记录的一部分)。如果您已与其他人共享更改,通常需要查看 git revert 相反,它会产生一个“反提议” - 也就是说,它会创建一个新的提交,“撤消”有问题的更改。

Git Book 有更多细节。


39
2018-04-19 13:32



正如我在@ralphtheninja的回答中所说, git checkout path/to/foo 可能会发生冲突 git checkout some-branch,所以最好使用 git checkout -- path/to/foo 避免这些冲突。 - Diego Lago


如果你做了一些改变,然后意识到你是一个独立的头,有一个简单的解决方案:stash - > checkout master - > stash pop:

git stash
git checkout master   # Fix the detached head state
git stash pop         # ... or for extra safety use 'stash apply' then later 
                      # after fixing everything do 'stash drop'

您将获得未经修改的更改和正常的“附加”HEAD,就像什么都没发生一样。


37
2018-01-01 22:40



已经为这个坏男孩加了书签 - 保存了一个临时分支。做了一个享受。 - Tim Tyler


由于“分离头状态”让你在临时分支上,只需使用 git checkout - 这会让你进入你所在的最后一个分支。


14
2017-11-20 19:30



要小心,当你处于超级头状态时,你将失去任何提交。 - Ajak6


附录

如果您要返回的分支是您最后一次结账,则可以使用 checkout @{-1}。这将带您回到之前的结账时间。

此外,您可以使用此命令替换此命令,例如 git global --config alias.prev 所以你只需要输入 git prev 切换回上一个结帐。


4
2018-01-22 11:09