如何处理超脱的提交


279

使用git我做了这样的事情

git clone
git checkout {a rev number tree rev before} (here I started to be in a detached head state)
//hacking
git commit
//hacking
git commit
(some commit where made on origin/master)
git pull (which does complete because there was some error due to the fact that I'm no more on master)

因为它告诉我,处于分离状态时我仍然可以提交,所以我这样做了。但是现在我想合并独立的head分支和本地master分支,然后将一堆更改推送到origin / master。

所以我的问题是如何将master分支与我的实际状态(分离的头)合并



我可以在这种状态下添加一个提交树的屏幕截图(在分离的头部上的提交实际上看起来像gitk或SourceTree中的样子),这会使这个问题变得更好。
florisla 2015年

目前无法提供不幸,但如果您能提供的话,我将很高兴在这里看到它。即使必须平局,也将使其更加清晰
岑2015年

Answers:


476

在您所在的位置创建一个分支,然后切换到master并将其合并:

git branch my-temporary-work
git checkout master
git merge my-temporary-work

12
将来如何避免头脑混乱?
ycomp

我这样做了,发现自己领先5次提交。在那种情况下,您只是执行git push origin吗?
Winnemucca

5
奇怪的是,我得到“已经是最新的”。合并我的临时工作时
Robert Sinclair

10
别忘了用“ git branch -d my-temporary work”删除我的临时工作
Lepton船长

5
当您编辑旧提交的文件,然后提交不带分支的文件以供以后引用此新提交时,会发生@ycomp“分离头”。为了避免头脑混乱,请不要签出旧提交。如果您仍然希望从那里获取所有文件,但是作为新的提交,则可以从提交中检出目录,而不是从提交本身中检出目录。看到这个答案
lucidbrot

96

你可以做这样的事情。

# Create temporary branch for your detached head
git branch tmp

# Go to master
git checkout master

# Merge in commits from previously detached head
git merge tmp

# Delete temporary branch
git branch -d tmp

更简单的是

git checkout master
git merge HEAD@{1}

但这有轻微的危险,如果您确实犯了一个错误,则恢复在分离头上所做的提交可能会更加困难。


4
我知道这是几年后的事,但是感谢您的回答。我不认为自己在此处完成了接受的答案的搜索,因为我不想离开临时分支,并且此答案包含删除它的命令。
杰里米·普里德摩尔

8
如果决定使用该命令git merge HEAD@{1},则可能应该确保使用该命令git reflog
Michael Stramel

3
能够合并HEAD @ {1}拯救了我的性命,因为我已经抢先检出了master。
2016年

奇怪的是,我得到“已经是最新的”。合并tmp时(但文件不同)
Robert Sinclair

18

这是我所做的:

基本上,将detached HEAD视为一个没有名称的新分支。您可以像其他任何分支一样提交到该分支。提交完毕后,您想将其推送到远程。

因此,您需要做的第一件事就是给它起detached HEAD一个名字。您可以轻松地像这样detached HEAD

git checkout -b some-new-branch

现在,您可以像其他任何分支一样将其推送到远程。

就我而言,我还想将该分支与在detached HEAD(现在some-new-branch)中所做的提交一起快速掌握。我所做的就是

git checkout master

git pull # To make sure my local copy of master is up to date

git checkout some-new-branch

git merge master // This added current state of master to my changes

当然,我稍后将其合并到master

就是这样


1
这个答案对我有用,而其他人则没有。git checkout -b new-branch为我工作。其他建议需要git branch new-branch,但那使我仍然处于分散的头脑中,新分支并没有接受我的更改。
杰西·帕特尔

17

你可以做git merge <commit-number>或者git cherry-pick <commit> <commit> ...

根据Ryan Stewart的建议,您还可以从当前HEAD创建一个分支:

git branch brand-name

或者只是一个标签:

git tag tag-name

您可以在git rev-parse HEAD
KOGI 2013年

6

在分离HEAD的情况下,提交工作与正常工作相同,只是没有命名分支得到更新。要使用您提交的更改更新master分支,请在您所在的位置创建一个临时分支(这样,该临时分支将具有您在分离的HEAD中所做的所有提交的更改),然后切换到master分支并合并与大师。

git branch  temp
git checkout master
git merge temp

3

一个简单的办法是只创建该提交一个新的分支,结帐吧:git checkout -b <branch-name> <commit-hash>

这样,您所做的所有更改都将保存在该分支中。如果您需要从剩余的提交中清理master分支,请确保运行git reset --hard master

这样,您将重写您的分支,因此请确保不要以这些更改打扰任何人。请务必查看本文,以更好地说明 分离的HEAD状态。


1

可能不是最好的解决方案(会重写历史记录),但您也可以这样做git reset --hard <hash of detached head commit>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.