【问题标题】:How to commit files in detached head mode to a branch如何以分离头模式将文件提交到分支
【发布时间】:2016-10-20 09:33:43
【问题描述】:

我最终遇到了一个奇怪的情况,我在我的分支 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

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

【问题讨论】:

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


    【解决方案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 步骤成功,这是迄今为止处理这一切的最简单方法。如果没有,请继续使用其他方法。


    方法二(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),这使你能够复制东西随时获取。


    方法三:

    $ 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 所做的是进行一个不在 any 分支上的提交(嗯,实际上是 两个 提交)。效果与制作临时分支时相同。这留下了在完成后删除非分支的问题,因此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。)

    【讨论】:

    • 很好的答案。谢谢!!
    【解决方案2】:

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

    【讨论】:

    • 如果我创建并签出一个新分支,我不会在分离模式下丢失我当前的工作吗?
    • @SamuelRobert:不,git 保证结帐是非破坏性的。它将保留未提交的修改,或者如果由于冲突而不能签出,则拒绝签出。有关说明,请参阅 git checkout < branch > failure for local changes
    • 是的,您将从分离的分支中丢失当前的修改。首先在分离头上提交您的更改,然后从分离头创建新分支。
    • 你太棒了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 2015-03-03
    • 2016-11-13
    • 2011-05-11
    • 1970-01-01
    • 2021-11-06
    • 2021-04-10
    相关资源
    最近更新 更多