我在我的代码库中进行工作时发现一个文件有本地更改。我不想要它们了,所以我删除了这个文件,认为可以检出一个新的副本。我想要做 Git 版本的相当于
svn up .
使用git pull
似乎没有起作用。在一些随机搜索后,我找到了一个网站,有人建议这样做:
git checkout HEAD^ src/
(src
是包含已删除文件的目录)。
现在我发现自己处于分离的HEAD状态。我不知道这是什么意思。如何撤销?
我在我的代码库中进行工作时发现一个文件有本地更改。我不想要它们了,所以我删除了这个文件,认为可以检出一个新的副本。我想要做 Git 版本的相当于
svn up .
使用git pull
似乎没有起作用。在一些随机搜索后,我找到了一个网站,有人建议这样做:
git checkout HEAD^ src/
(src
是包含已删除文件的目录)。
现在我发现自己处于分离的HEAD状态。我不知道这是什么意思。如何撤销?
分离头状态意味着您不再位于一个分支上,而是已经检出了历史中的单个提交(在此情况下是 HEAD 之前的提交,即 HEAD^)。
git branch tmp
- 这将把您的更改保存在名为 tmp
的新分支中。git checkout master
master
中,请从 master
分支运行 git merge tmp
。运行完 git checkout master
后,您应该位于 master
分支上。您只需要检出您原来所在的分支,例如:
git checkout master
git checkout -- path/to/foo
这将把文件 foo 恢复到索引中的状态。
Previous HEAD position was 7426948...
中被提到。 - KCD如果您更改了不想丢失的文件,可以推送它们。我已经在分离模式下提交了它们,之后您可以切换到一个临时分支,稍后将其集成到主分支中。
git commit -m "....."
git branch my-temporary-work
git checkout master
git merge my-temporary-work
来源:
git stash
呢?因为这是我首先想到的方法。创建一个新分支可能有些过分了。 - geekaygit rebase my-temporary-work
并删除分支 git branch -d my-temporary-work
,这样看起来就像你一开始就提交到正确的分支一样。请注意,此操作会重写 Git 历史记录,因此请确保在进行此操作之前已经备份代码。 - Zoltán如何退出(“修复”)分离 HEAD 状态,当您已经在此模式下更改了某些内容,并且可选择要保存您的更改:
提交您想要保留的更改。 如果您想接管在分离 HEAD 状态下所做的任何更改,请将它们提交。例如:
git commit -a -m "您的提交信息"
放弃您不想保留的更改。 硬重置将放弃在分离 HEAD 状态下所做的任何未提交更改:
git reset --hard
(如果没有这个步骤,第 3 步将失败,并抱怨分离 HEAD 中修改了未提交的文件。)
检出您的分支。 通过检出您之前工作的分支退出分离 HEAD 状态,例如:
git checkout master
接管您的提交。 您现在可以通过 cherry-pick 接管在分离 HEAD 状态下所做的提交,如 我回答另一个问题时所示。
git reflog
git cherry-pick <hash1> <hash2> <hash3> ...
git reset --hard
正是我所需要的,因为我希望上游成为源,并且本地更改应该被删除。 - Markus ZellerHEAD是一个指针,它直接或间接地指向特定的提交:
附加 HEAD表示它附加到某个分支(即它指向一个分支)。
分离 HEAD表示它没有附加到任何分支,即它直接指向某个提交。
换句话说:
git checkout
,针对每个图片都有不同的目标(上面的命令被调暗以强调我们只是要应用这些命令):
所以现在我们处于与这个答案开头相同的情况:
分离头指的是:
如果你没有进行任何更改: 你可以通过执行以下命令切换到主分支
git checkout master
如果您有要保留的更改:
在脱离 HEAD 的情况下,提交的工作方式与正常情况相同,只是没有命名分支得到更新。为了让主分支获得您已在脱离 HEAD 中进行的提交更改,请在当前位置创建一个临时分支(这样临时分支将拥有您在脱离 HEAD 中所做的所有提交更改),然后切换到主分支并将临时分支与主分支合并。
git branch temp
git checkout master
git merge temp
如果您进行了更改,然后意识到您处于分离的状态,您可以执行以下操作: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,就像什么也没有发生一样。
在我意识到我处于分离头状态并已经进行了一些更改后,我刚刚做了以下操作。
我提交了更改。
$ git commit -m "..."
[detached HEAD 1fe56ad] ...
我记得这个提交的哈希(1fe56ad)。然后我切换到了我应该在的分支。
$ git checkout master
Switched to branch 'master'
最后,我将提交的更改应用到了分支上。
$ git cherry-pick 1fe56ad
[master 0b05f1e] ...
我认为这比创建临时分支要容易一些。
git cherry-pick <hash>
。 - Mason当你在 git
中检出一个特定的提交时,你会进入到一个 分离头指针 的状态...也就是说,你的工作副本不再反映某个命名引用(例如 "master")的状态。这对于检查存储库之前的状态很有用,但如果你想要还原更改,则不是你想要的。
如果你对特定文件进行了更改并且只想要丢弃它们,可以使用 checkout
命令,方法如下:
git checkout myfile
这将丢弃任何未提交的更改并将文件还原为其在当前分支头部状态下的状态。如果您想放弃已经提交的更改,您可能需要使用reset
命令。例如,这将重置存储库以回到上一个提交的状态,丢弃任何随后的更改:
git reset --hard HEAD^
如果您要与其他人共享代码库,git reset
可能会造成破坏(因为它会擦除部分代码库历史记录)。如果您已经与其他人分享了更改内容,通常需要考虑使用git revert
,它会生成一个“反提交”--也就是创建一个新的提交,用于“撤消”相关更改。
《Git Book》提供了更多详细信息。
git checkout path/to/foo
可能会与git checkout some-branch
冲突,因此最好使用git checkout -- path/to/foo
来避免这些冲突。 - Diego既然"detached head state"让你处于临时分支上,只需使用git checkout -
命令,它将把你切换到最后一个你所在的分支。
git reflog
访问,并且可以被接管到一个新分支中,或者通过 git cherry-pick
接入到一个现有分支中。参见这个问题。 - tanius你可能执行了 git reset --hard origin/your-branch
。
尝试只使用 git checkout your-branch
。
git checkout master
这条命令会让你回到主分支。如果你想清除所有的工作副本更改,你应该运行git reset --hard
。 - Abe Voelkergit checkout -- src/
命令。 - geekay