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

svn up .

使用git pull似乎不起作用。一些随机搜索让我找到了一个有人推荐的网站

git checkout HEAD^ src/

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

现在我发现我有一个分离的脑袋。我不知道那是什么。我怎么撤销?


当前回答

HEAD是一个指针,它直接或间接指向特定的提交:

连接的HEAD表示它连接到某个分支(即它指向某个分支)。分离的HEAD意味着它不附加到任何分支,即它直接指向某个提交。

换句话说:

如果它直接指向提交,则HEAD被分离。如果它间接指向提交(即,它指向分支,而分支又指向提交),则会附加HEAD。


为了更好地理解带有附加/分离头的情况,让我们展示通向上面四幅图片的步骤。

我们从存储库的相同状态开始(所有象限中的图片都相同):


现在我们要执行git签出-在单个图片中使用不同的目标(顶部的命令变暗以强调我们只应用这些命令):


以下是执行这些命令后的情况:

如您所见,HEAD指向git checkout命令的目标-指向分支(四元组的前3个图像),或(直接)指向提交(四元组最后一个图像)。

工作目录的内容也会更改,以符合适当的提交(快照),即HEAD(直接或间接)指向的提交。


因此,现在我们的情况与答案开头的情况相同:

其他回答

这是我在意识到自己头脑清醒,已经做出了一些改变之后所做的事情。

我提交了更改。

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

我记得提交的哈希值。然后我检查了我本该去的那家分店。

$ git checkout master
Switched to branch 'master'

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

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

我认为这比创建一个临时分支要简单一些。

使用gitrebase,您可以将HEAD移动到所需的提交

假设您的分支处于分离状态,如下所示:

* bfcb8f9 Commit 4
* 540a123 Commit 3
* 4356d64 Commit 2
| * fecb8d2 Commit 2
|/
| * 8012f45 Commit 2x
|/
| * 6676d15 (HEAD -> master) Commit 2 --amend
|/
* 1818f91 Commit 1

分离的头部是通过错误地重新定基而创建的,指向一个分离的提交,该提交之前是通过gitcommit--modify命令创建的。

如果要将HEAD ref移动到最近的提交,请使用要指向的所需HASH提交应用重基。在本例中,哈希是最近的提交:

git rebase bfcb8f9

这将使分支的HEAD指向所需的提交(在本例中是最近的):

* bfcb8f9 (HEAD -> master) Commit 4
* 540a123 Commit 3
* 4356d64 Commit 2 --amend
| * fecb8d2 Commit 2
|/
| * 8012f45 Commit 2x
|/
| * 6676d15 Commit 2
|/
* 1818f91 Commit 1

HEAD是一个指针,它直接或间接指向特定的提交:

连接的HEAD表示它连接到某个分支(即它指向某个分支)。分离的HEAD意味着它不附加到任何分支,即它直接指向某个提交。

换句话说:

如果它直接指向提交,则HEAD被分离。如果它间接指向提交(即,它指向分支,而分支又指向提交),则会附加HEAD。


为了更好地理解带有附加/分离头的情况,让我们展示通向上面四幅图片的步骤。

我们从存储库的相同状态开始(所有象限中的图片都相同):


现在我们要执行git签出-在单个图片中使用不同的目标(顶部的命令变暗以强调我们只应用这些命令):


以下是执行这些命令后的情况:

如您所见,HEAD指向git checkout命令的目标-指向分支(四元组的前3个图像),或(直接)指向提交(四元组最后一个图像)。

工作目录的内容也会更改,以符合适当的提交(快照),即HEAD(直接或间接)指向的提交。


因此,现在我们的情况与答案开头的情况相同:

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

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

摘自:

如何处理在分离的头脑中做出的承诺

当我开始使用git时,这对我来说是一件令人困惑的事情,后来我明白了为什么会发生这种情况,以及处理这种情况的最佳方法是什么。

出现这种情况的根本原因是,通常gitHEAD总是指向某个分支,当您试图将HEAD指向某个特定的提交时,就会将HEAD置于分离的HEAD状态。

HEAD连接时的状态-

cat .git/HEAD     # output--> ref: refs/heads/master or ref: refs/heads/main

当HEAD处于分离状态时-

cat .git/HEAD     # output--> b96660a90cad75867453ebe1b8d11754bbb68b0e <commit hash>

解决方案-

git stash           # Temporarily shelves (or stashes) changes
git branch          # Find your default branch
git switch master   # Point HEAD to master or main branch
git stash pop       # Apply all the changes you had previously