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

svn up .

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

git checkout HEAD^ src/

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

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


当前回答

分离的头意味着你没有正确地签出你的分支,或者你刚刚签出了一个提交。

如果您遇到这样的问题,请首先隐藏本地更改,这样您就不会丢失更改。

之后。。。使用以下命令签出所需的分支:

假设您想要分支MyOriginalBranch:

git checkout-b someName origin/MyOriginalBranch

其他回答

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

如果您对特定文件进行了更改,并且只想放弃这些更改,则可以使用如下签出命令:

git checkout myfile

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

git reset --hard HEAD^

但是,如果您与其他人共享存储库,git重置可能会造成中断(因为它会擦除存储库历史的一部分)。如果您已经与其他人共享了更改,您通常希望查看git-restore,它会生成一个“反提交”,也就是说,它会创建一个新的提交来“撤消”所涉及的更改。

GitBook有更多细节。

分离的头部意味着您不再在分支上,您已经在历史中签出了一个提交(在本例中,提交是head之前的提交,即head^)。

如果要删除与分离的HEAD关联的更改

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

git checkout master

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

git checkout -- path/to/foo

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

如果您希望将更改与分离的HEAD保持关联

运行gitbranchtmp-这将在名为tmp的新分支中保存更改。运行git签出主机如果您想将所做的更改合并到master中,请从master分支运行gitmergetmp。运行git checkout master后,您应该在master分支上。

意识到我有一个超然的头脑,却不知道我是如何做到的(就像三次提交一样),我还发现尝试合并、重基或樱桃选择会引发数百次合并冲突,所以我采取了不同的方法:

(假设一切都已完成(工作树“干净”))保存我的提交消息:gitlog>/tmp/log保存我的工作树:mkdir/tmp/backup&&cp-a all_my files_and_directories/tmp/backup还原到master:git checkout master删除所有工作文件和目录:rm。。。使用备份:cp-a/tmp/backup/。gitadd和gitcommit使用保存的/tmp/log中的消息,可能使用不同的文件子集重复它。。。

缺点是,如果一个文件在master之后多次更改,则会丢失提交历史记录,但最终我有了一个干净的master。

为了进一步澄清@Philippe Gerber的答案,这里是:

在樱桃采摘之前,在这种情况下,需要一个git结账大师。此外,它只需要在分离头中提交。

使用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