修复一个Git分离的头?

我在存储库中做了一些工作,发现一个文件有本地更改。 我不希望他们了,所以我删除了文件,认为我可以结帐一个新的副本。 我想做相当于git的

svn up . 

使用git pull似乎没有工作。 一些随机search导致我到一个网站,有人build议做

 git checkout HEAD^ src/ 

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

现在我发现我有一个独立的头。 我不知道那是什么 我如何撤消?

分离的头意味着你不再在分支上,你已经在历史中签出了一个单独的提交(在这种情况下是在HEAD之前的提交,即HEAD ^)。

你只需要检查你所在的分支,例如

 git checkout master 

下一次你改变了一个文件,并且想把它恢复到索引中的状态,不要先删除这个文件,只要

 git checkout -- path/to/foo 

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

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

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

摘自:

如何处理一个独立的头做的承诺

如果在此模式下已经更改某些内容并想要保存更改,如何退出(“修复”)分离的HEAD状态。 (虽然这部分是可选的。)

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

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

     git reset --hard 

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

  3. 看看你的分支。 退出先前分支的分支HEAD状态,例如:

     git checkout master 
  4. 接pipe你的提交。 您现在可以通过樱桃采摘来接pipe您以独立HEAD状态提交的提交,如我对另一个问题的回答所示。

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

分离的头表示:(1)你不再是一个分支,(2)你在历史中签出了一个提交

如果您没有任何更改:可以通过应用以下命令切换到主站

  git checkout master 

如果您有想要保留的更改:

在HEAD分离的情况下,提交工作正常,除非没有命名分支得到更新。 为了使主分支更新你提交的更改,在你所在的地方build立一个临时分支(这样临时分支将拥有在分离的HEAD中所做的所有提交的更改),然后切换到主分支并将临时分支与大师。

 git branch temp git checkout master git merge temp 

我意识到自己是一个独立的头脑,并且已经做了一些改变,这就是我刚做的事情。

我犯了这些变化。

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

我记得提交的散列(1fe56ad)。 然后我检查了我应该去的分支。

 $ git checkout master Switched to branch 'master' 

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

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

我觉得这比创build临时分支要容易一些。

当你在git签出一个特定的提交时,你将会处于独立的头部状态……也就是说,你的工作副本不再反映一个命名引用(比如“master”)的状态。 这对于检查存储库的过去状态非常有用,但如果实际尝试恢复更改,则不是您想要的。

如果您对某个特定文件进行了更改,而您只是想放弃这些文件,则可以使用如下的checkout命令:

 git checkout myfile 

这将放弃任何未提交的更改并将文件恢复到当前分支头部的任何状态。 如果要放弃已经提交的更改,则可能需要使用reset命令。 例如,这会将存储库重置为之前的提交状态,放弃所有后续更改:

 git reset --hard HEAD^ 

但是,如果您与其他人共享资源库,则git reset可能是破坏性的(因为它会擦除部分资源库历史logging)。 如果你已经与其他人分享了更改,你通常会想看看git revert ,这会产生一个“antiommit” – 也就是说,它会创build一个新的提交,“撤消”所涉及的更改。

Git Book有更多的细节。

如果你做了一些改变,然后意识到你在一个分离的头上,那么有一个简单的解决scheme:存储 – >结帐主 – >存储stream行:

 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' 

你将会有无限的变化和正常的“附加”的头,就像什么都没有发生。

由于“独立头部状态”让你在临时分支上,所以只需使用git checkout -它将你放在最后一个分支上。

附录

如果您希望返回的分支是您所做的最后一个结账,则可以使用checkout @{-1} 。 这将带您回到您以前的结帐。

此外,你可以用这个命令别名,例如git global --config alias.prev这样你只需要inputgit prev切换回前一个结账。

 git pull origin master 

为我工作。 这只是为了明确给出远程和分支名称。

在我的情况下,我运行git status ,我看到我的工作目录上有几个未跟踪的文件。

我只需要清理它们(因为我不需要它们)来运行我想要执行的rebase。

你可能需要首先清理你的分支来结帐主人。 -f强制行动。

 git clean -f 

那么你将能够像上面所述的检查你的桅杆分支

 git checkout master