如何以ditached头模式将文件提交到分支

时间:2016-10-20 09:33:43

标签: git git-commit git-detached-head

我最终遇到了一个奇怪的情况,我在我的分支机构v4.1.0-rc12上检查了之前的提交。我已经修改了一些文件,我想将它提交到v4.1.0-rc12分支。

既然我检查了之前的提交,那么HEAD指针处于分离模式,如何在分离模式下将此更改提交到v4.1.0-rc12分支?

我希望我做过"还原"而不是"结帐"提交哈希。

是否有任何可能的解决方案来提交已编辑的文件并将其添加到我的v4.1.0-rc12分支?

这就是我的" git reflog"示出了

 441bfac HEAD@{0}: commit: Resolved #110
 dc00e4f HEAD@{1}: checkout: moving from v4.1.0-rc12 to dc00e4f
 2542748 HEAD@{2}: commit: Login & SignUp revamp (Broken)
 dc00e4f HEAD@{3}: commit: Resolved #109 and #110
 4472914 HEAD@{4}: commit: Resolved #108

我想将441bfac保存到v4.1.0-rc12

任何帮助或想法都将不胜感激。

2 个答案:

答案 0 :(得分:2)

首先,从您之前的提交创建新分支,结帐到新创建的分支,更新您的文件,然后提交更改。 之后,您可以将更改合并到任何分支。

答案 1 :(得分:2)

方法1:

$ git checkout v4.1.0-rc12 branch
(see if it succeeds, if so):
$ git add ...     # if / as needed
$ git commit

可能不起作用,因为git checkout步骤将拒绝切换到分支,如果(并且仅当)说切换将消除您已经发生的更改制成。

git checkout步骤将成功,并随时执行更改。

如果git checkout步骤成功,这是迄今为止处理这一切的最简单方法。如果没有,请继续使用其他方法。

方法2(avi's answer):

$ git checkout -b tempbranch
$ git add ...      # as and if needed
$ git commit

这个(-b tempbranch)创建一个新的临时分支,指向您之前分离HEAD的提交。然后git commit在此临时分支上创建一个新提交:

          o--o--o   <-- v4.1.0-rc12 branch
         /
...--o--o
         \
          o         <-- tempbranch

现在您可以git checkout随意添加,tempbranch上的提交将永久存储在您的存储库中(除非您删除名称tempbranch,否则永久存储),这使您可以随时从中复制内容。

方法3:

$ git stash
$ git checkout v4.1.0-rc12 branch
$ git stash apply    # or even "git stash pop" but I prefer "apply"
... check everything out ...
... if it all looks right ...
$ git stash drop     # "git stash pop" means "apply and then auto-drop"

git stash做的是提交(实际上两个提交)不在任何分支上。效果与创建临时分支时的效果相同。这样就完成了删除非分支的问题,因此git stash drop会删除保存提交的未命名非分支。

基本上git stash apply步骤(虽然它比这更复杂)樱桃选择git stash提交的提交,无论你现在在哪里:所以这就像挑选提交一样你在tempbranch上做了。

请注意,git stash pop会自动调用git stash drop,即使git stash apply的结果很乱,如果您pop,您已经丢失了临时提交但是不是你apply。如果一切顺利那么没有真正的区别,pop更方便;这只是一个让事情变得更糟的bread-crumb trail的情况。

(顺便提一下,我个人的偏好是方法1,如果可能的话,通常是2,然后是3,但有时 - 当我确定它会开始工作时 - 我更喜欢方法3来方法2。)