在分离的 HEAD 中进行提交应该怎么办?

407

使用 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 状态下,我仍然可以提交,所以我这样做了。但现在我想合并我的分离 HEAD 分支和本地主分支,然后将我的一堆更改推送到 origin/master。

所以我的问题是如何将主分支与我的当前状态(分离的 HEAD)合并。


可能是重复的问题:Git:HEAD已经消失,想将其合并到主分支(master) - Karl Bielefeldt
1
如果您能够添加一个提交树的截图(在gitk或SourceTree中显示分离头上的提交实际上是什么样子),那将使这个问题更好。 - florisla
很遗憾,目前我不能提供,但如果您能提供一个,我会很高兴在这里看到它。即使只是一张草图,也会让它更清晰明了。 - benzen
12个回答

2
当我进行检出导致分离头时,Git实际上告诉我在这种情况下该怎么做:
``` git switch -c ```
如果你这样做,它会保留HEAD分支在分离头之前的状态。它会创建一个新的分支,其中包含在分离头状态下进行的所有提交,就好像你从HEAD位置执行了`git checkout `一样。之后,HEAD将成为新分支的头部,正如你所期望的那样。
要复现/测试/更详细地理解,请按照以下步骤进行:
1. 创建一个带有两个提交的测试仓库:
~/gittest$ git log --oneline 
17c34c0 (HEAD -> master) 2
5975930 1
  1. 检出之前的提交1

~/gittest$ git checkout 5975930

在德语中,git的响应是:

提示:切换到'5975930'。
您目前处于“分离的HEAD”状态。您可以浏览、进行实验性更改并提交这些更改,而且在此状态下进行的所有提交都不会影响任何分支,只需切换到另一个分支即可放弃在此状态下进行的所有可能提交。
如果您想创建一个新分支来保留您所做的提交,可以使用'switch'命令并带上选项-c(现在或以后)。示例:
git switch -c <新分支名称> 要撤销此操作,请运行:git switch -
您可以通过将配置变量'advice.detachedHead'设置为'false'来关闭此提示。
当前HEAD指向5975930 1。
注意:切换到'5975930'。
你处于“分离的HEAD”状态。你可以四处查看,进行实验性的更改并提交它们,你也可以通过切换到一个分支来丢弃在这个状态下所做的任何提交,而不会影响任何分支。
如果你想创建一个新的分支来保留你所创建的提交,你可以使用带有switch命令的-c选项来实现(现在或以后)。示例:
git switch -c .
或者使用以下命令撤销此操作:
git switch -
通过将配置变量advice.detachedHead设置为false来关闭此建议。
HEAD 现在位于 5975930 1

1
也许不是最好的解决方案(将重写历史记录),但您也可以执行 git reset --hard <分离头提交的哈希值>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接