我在我的存储库中做了一些工作,发现文件有本地更改。 我不再想要它们所以我删除了文件,以为我可以签出一份新的副本。 我想做Git相当于
使用git pull似乎不起作用。 一些随机搜索引导我到一个有人推荐做的网站
(src是包含已删除文件的目录)。
现在我发现我有一个超然的头。 我不知道那是什么。 我怎么撤消?
-
git checkout master会让你回到主分支。 如果您想清除任何工作副本更改,您可能想要git reset --hard。
-
另请参阅为什么我的Git repo进入独立的HEAD状态?
-
如果你没有提交,你可以完成git checkout -- src/
-
试试这个:链接。 简而言之create temp branch - checkout temp branch - checkout master - delete temp branch
-
@AbeVoelker你在working copy changes的评论中是什么意思? 您是指在检出另一次提交后对文件所做的更改(即,在处于分离头状态时所做的更改)?
分离头意味着您不再在分支上,您已在历史记录中检出单个提交(在这种情况下是HEAD之前的提交,即HEAD ^)。
如果要删除与分离的HEAD关联的更改
您只需要检查您所在的分行,例如
下次更改文件并希望将其恢复到索引中的状态时,请不要先删除文件,只需执行此操作
1
| git checkout -- path/to/foo |
这会将文件foo恢复到索引中的状态。
如果要保持更改与分离的HEAD相关联
运行git log -n 1;这将显示分离的HEAD上的最新提交。复制提交哈希。
运行git checkout master
运行git branch tmp 。这会将您的更改保存在名为tmp的新分支中。
如果要将所做的更改合并到master中,请从master分支运行git merge tmp。运行git checkout master后,您应该在master分支上。
-
"这会将文件foo恢复到对其进行任何更改之前的状态。" - >它会将其恢复到索引中的状态 - 请编辑
-
git checkout path/to/foo可能与git checkout some-branch冲突,因此最好使用git checkout -- path/to/foo来避免这些冲突。
-
为什么这个错误首先发生?这是我讨厌git的事情之一 - 有时是完全随机的行为。 Mercurial从未遇到过这样的问题。
-
@VioletGiraffe它既不是错误也不是随机的 - 它只是您检查先前提交时存储库进入的状态。如果您打算从那时开始做任何工作,"分离的头部"可以作为警告,您可能还想创建或指向分支。但是,如果您只是希望查看该标记或提交,则处于分离头状态没有任何问题。
-
如果你已经致力于分离头,请不要这样做,请参阅其他答案。如果这样做,你可以在Previous HEAD position was 7426948...中查看以前的头部git提及
-
以防任何noobs出错:path / to / foo不是文字路径 - 你想用path / to / foo文件夹路径替换你的文件夹路径。
-
@nottinhill你为什么要与一个独立的头部承诺...?如果没有首先创建分支,就会有明确的警告。
-
这根本不是我的答案。我绝对是一个分支,但我不在一个可追踪的分支。我做了git checkout远程/分支,我需要做git checkout origin / branch - 或类似的东西。
-
@ralphtheninja您好,看了你的答案,我有一个小问题:在SourceTree中我双击前一次提交(为了检查出来)我得到的信息相同,这会导致一个超然的头,所以我想知道是什么这意味着当人们说你可以简单地使用git回滚到任何以前的状态?那么如何回滚到特定的提交呢?谢谢
-
@Joshua不确定你的意思是"回滚"。如果您已提交,则可以随时检查该提交。
-
@ralphtheninja感谢您的回复。通过"回滚",我的意思是在特定的提交/修订中进入项目状态。我知道我可以检查任何提交,但是当我这样做时,我得到一个警告,我的检查会导致一个超然的头。所以,我想知道如果我不能简单地检查它,我怎么能回到项目的状态,比如,两个提交之前?
-
@Joshua如果你想回到之前签出的任何提交(1,2或3等步骤),那么你可以看看git reflog
-
以下是一个类似案例的精彩视觉解释,可以帮助人们了解正在发生的事情:stackoverflow.com/a/34994175/5040168
-
为了不丢弃工作,首先备份你的文件夹(这就是我所做的)。
-
当你运行git checkout master时,Git建议你:Warning: you are leaving 1 commit behind, not connected to any of your branches [...] If you want to keep it by creating a new branch, this may be a good time to do so with: git branch 。我不相信遵循这个答案ipsis litteris导致失去工作。但在任何情况下,备份始终是一个很好的预防措施。
-
最后,确保您的提交在master,您可以删除tmp本地分支:git branch -d tmp
-
这个答案中没有一个方法对我有用。
-
Visual Studio 2017在状态栏中的分支选择器中显示分离状态。我只是选择了"master"并重新连接而不会丢失我在分离时所做的更改。
-
@VioletGiraffe:你有一个基于Mercurial发生的事情的心智模型,但你正在使用Git。如果你不愿意调整你的心理模型以适应Git的模型,那么事情将继续随机出现。这就像你在外面走动,戴着VR护目镜,你认为你正在驾驶飞机,但你真的正在过马路。你会受到汽车的打击。
-
您可以跳过分支位,直接执行git merge 。我不知道你为什么要在这里创建一个分支。
-
请添加更改两个'粗体'secitons的顺序。匆忙我检查出主人。因此,我无法再从分离的头部访问日志。惊人的帖子。
-
谢谢你!
-
这样可行,但它缺少一个头部仍与主分支不同步的步骤。我编辑了答案以包含它。
如果您更改了不想丢失的文件,可以推送它们。我已将它们以分离模式提交,之后您可以移动到临时分支以便稍后在master中集成。
1 2 3 4
| git commit -m"....."
git branch my-temporary-work
git checkout master
git merge my-temporary-work |
摘自:
如何处理分离头中的提交
-
我发现这是首选解决方案 - 特别是如果您想要保留在签出单个版本时所做的更改。
-
@adswebwork:我同意。所有其他答案建议恢复到以前的状态并且在分离的头状态中丢失本地更改。
-
为什么不git stash?因为这是我想到的第一件事。创建一个新的分支将是一个矫枉过正。
-
您也可以git rebase my-temporary-work然后删除分支git branch -d my-temporary-work,这样就好像您首先提交到了正确的分支。
-
@geekay git stash听起来像是这种情况的完美工具。你可以用建议的步骤来回答这个问题吗?
-
@Zoltan检查此答案stackoverflow.com/a/27735365/751026
-
@Zoltn用git stash替换git branch ..,用git stash apply替换git merge ..。
-
嗯,这就是我做的,它的工作原理。 $git reflog(查找要恢复的HEAD的SHA)。 $git checkout HEAD_SHA(你现在应该在这个独立的头上)。 $git branch BRANCH_NAME(通过执行此操作,将HEAD的更改合并到新分支)。然后使用这个新的分支,你可以合并,变基,樱桃选择做任何你想做的事情
没有创建临时分支的解决方案。
当您在此模式下已经更改了某些内容时,如何退出("修复")分离的HEAD状态,并且可选地,您希望保存更改:
提交您想要保留的更改。如果要接管在分离的HEAD状态下所做的任何更改,请提交它们。喜欢:
1
| git commit -a -m"your commit message" |
放弃您不想保留的更改。硬重置将丢弃您在分离的HEAD状态下所做的任何未提交的更改:
(如果没有这个,第3步就会失败,抱怨分离的HEAD中修改过的未提交文件。)
看看你的分公司。通过检出之前处理过的分支退出分离的HEAD状态,例如:
接管你的提交。您现在可以通过挑选来接管您在分离的HEAD状态下所做的提交,如我对另一个问题的回答所示。
1 2
| git reflog
git cherry-pick <hash1> <hash2> <hash3> … |
分离头意味着:
你不再是一个分支,
您已在历史记录中检出了单个提交
如果没有更改:可以通过应用以下命令切换到master
如果您要保留更改:
在分离的HEAD的情况下,提交正常工作,除了没有命名分支更新。要使用您提交的更改更新主分支,请在您所在的位置创建一个临时分支(这样临时分支将具有您拥有的所有已提交的更改在分离的HEAD中制作,然后切换到主分支并将临时分支与主分支合并。
1 2 3
| git branch temp
git checkout master
git merge temp |
这是我刚刚意识到自己处于一个独立的头脑并且已经做出一些改变后我刚刚做的事情。
我承诺了改变。
1 2
| $ git commit -m"..."
[detached HEAD 1fe56ad] ... |
我记得提交的哈希值(1fe56ad)。然后我检查了我应该去的那个分支。
1 2
| $ git checkout master
Switched to branch 'master' |
最后,我将提交的更改应用于分支。
1 2
| $ git cherry-pick 1fe56ad
[master 0b05f1e] ... |
我认为这比创建临时分支要容易一些。
-
这应该是答案。它取回你的nuked文件。
-
是的,这真的是最简单的事情 - 简单到足以记住,而不会在下次发生时搜索网页。提交,注意哈希,返回到您要提交的分支,以及git cherry-pick 。
-
谢谢你的解决方案。这有帮助。我还要补充一点,我必须做一个"git push origin master",这样我的master和origin / master就指向同一个提交。
-
这基本上就是tanius的答案(比之前的一年多发布)。
如果你做了一些改变,然后意识到你是一个独立的头,有一个简单的解决方案:stash - > checkout master - > stash pop:
1 2 3 4
| 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子模块后,我经常最终处于一个独立的HEAD状态,然后对其进行更改。我发现这是解决问题的最佳和最简单的解决方案,因此我可以保留我的更改。
-
Stash -a ........
当您在git中签出特定提交时,您最终处于分离头状态...也就是说,您的工作副本不再反映命名引用的状态(如"master")。这对于检查存储库的过去状态非常有用,但如果您实际尝试还原更改,则不是您想要的。
如果您对特定文件进行了更改而只是想丢弃它们,则可以使用checkout命令,如下所示:
这将丢弃任何未提交的更改,并将文件还原为当前分支头部的状态。如果要放弃已提交的更改,可能需要使用reset命令。例如,这会将存储库重置为先前提交的状态,并丢弃任何后续更改:
但是,如果您与其他人共享存储库,则git reset可能会造成中断(因为它会删除存储库历史记录的一部分)。如果您已经与其他人共享了更改,则通常需要查看git revert,这会生成"反提示" - 也就是说,它会创建一个新的提交,"撤消"相关更改。
Git Book有更多细节。
-
正如我在@ralphtheninja的回答中所说,git checkout path/to/foo可能与git checkout some-branch发生冲突,因此最好使用git checkout -- path/to/foo来避免这些冲突。
由于"分离头状态"让你在临时分支上,只需使用git checkout -将你带到你所在的最后一个分支上。
-
要小心,当你处于分离状态时,你将失去任何提交。
-
@ Ajak6你真的没有丢失那些提交。它们仍可通过git reflog获得,并可以接管到新分支或通过git cherry-pick接入现有分支。看到这个问题。
为了进一步澄清@Philippe Gerber的答案,这里是:
在cherry-pick之前,在这种情况下需要git checkout master。此外,仅需要commit in detached head。
附录
如果您要返回的分支是您最后一次结账,则只需使用checkout @{-1}即可。这将带您回到之前的结账时间。
此外,您可以使用例如git global --config alias.prev对此命令进行别名,这样您只需键入git prev即可切换回上一个结帐。
处于"分离头"意味着HEAD引用特定的未命名提交(与命名分支相反)(参见:https://git-scm.com/docs/git-checkout section Detached head)
要解决此问题,您只需选择之前选择的分支
git checkout @{-1}
当您处于分离头状态并创建新文件时,首先要确保将这些新文件添加到索引中,例如:
但是,如果您只更改或删除了现有文件,则可以通过以下方式添加(-a)并同时提交消息(-m):
1
| git commit -a -m"my adjustment message" |
然后,您只需使用当前状态创建一个新分支:
1
| git checkout -b new_branch_name |
你将有一个新的分支,所有的调整都将在那个新的分支中。然后,您可以继续按下遥控器和/或结账/拉/合并。
Git告诉我该怎么做。
如果你输入:
1
| git checkout <some-commit_number> |
保存状态
1 2
| git add .
git commit -m"some message" |
然后:
1
| git push origin HEAD:<name-of-remote-branch> |
为我工作。它只是明确地给出远程和分支名称。
我想保留我的更改,我只是解决这个问题......
1 2 3 4 5 6
| git add .
git commit -m"Title" -m"Description"
(so i have a commit now example: 123abc)
git checkout YOURCURRENTBRANCH
git merge 123abc
git push TOYOURCURRENTBRANCH |
这对我有用
在我的情况下,我运行git status,我看到我的工作目录中有一些未跟踪的文件。
我只需要清理它们(因为我不需要它们)来运行我想要执行的rebase。