如何在处于分离头状态时保存更改?

时间:2015-06-22 15:08:07

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

使用Git,我不得不回到特定的提交。我做了一些更改,现在我想提交它们。这样做的正确方法是什么?

我的项目现在处于分离-HEAD状态。如果我使用

进行提交,我的更改是否会被保存
git commit

?否则,我该怎么做才不会丢失我的更改?

4 个答案:

答案 0 :(得分:20)

免责声明:git并不复杂,它只是用途广泛。不要因为我絮絮叨叨地回答这​​个问题而吓跑了。)

你有:
master: a-b-c-d-e-f

并希望更改c。你做了:
* git checkout c(避免将来检查提交。改为移动分支头)
* 更改了一些文件

你在:

master: a-b-c-d-e-f
             \uncommitted-work,detached

如果您想在更改的“c”

之上重新应用d-e-f

(如果你推了,下游的人将有to recover from upstream rebase

  1. git stash .
  2. git checkout master
  3. git stash pop(解决冲突)
  4. git stage .
  5. git commit -m "temporary name for g"
  6. master: a-b-c-d-e-f-g
  7. git rebase c -i(“将我当前的分支重新应用到c点,让我以交互方式操作提交”,即将父级(rebase)d-e-f重新应用到新的c })
  8. 关注guide to interactive rebase。您想重新排序g,以便在c之后,然后将rebase命令从pick更改为fixupdd删除一行,P放置它,i进入插入模式键入“fixup”,然后:wq保存并退出vim。
  9. master: a-b-c'-d'-e'-f',其中c'是您在rebase期间合并gc的结果。d-e-f已成为d'-e'-f'他们的祖先已经改变,所以就git而言,它们不是“相同的”提交,但它们的内容保持不变)。
  10. 如果要撤消d-e-f(并重写历史记录,就好像从未创建过它们一样)

    (如果您已推送,下游人员将有to recover from upstream rebase ):

    1. git stash .
    2. git checkout master
    3. master: a-b-c-d-e-f,最初基于c的藏匿文件)
    4. git reset --hard c(从c开始丢弃所有文件并在master上提交)
    5. master: a-b-c,带有藏匿文件)
    6. git stash pop(解决冲突)
    7. master: a-b-c-*
    8. git stage .
    9. git commit -m "description of g"
    10. master: a-b-c-g
    11. 如果要撤消d-e-f(但保留历史记录)

      1. git stash
      2. git revert --no-commit d
      3. git revert --no-commit e
      4. git revert --no-commit f
      5. git push
      6. git stash pop(不会发生冲突)
      7. git stage .
      8. git commit -m "Undo d-e-f in order to fix..."
      9. git push
      10. 如果您有git push d-e-f,并且想要将它们分开:

        听起来你的新变化是针对主人的新分支。 git branch <foo>

答案 1 :(得分:4)

从此提交创建一个新分支,然后执行commit

git checkout -b <branchname>
git commit 

假设您已经暂存(即git add myfile1 myfile2)您的文件。

答案 2 :(得分:4)

将您的工作保存在超然的头脑中:

git checkout -b <new-branch-name-for-detached-head> <sha-of-the-detached-head>

,如果要将其合并到母版:

git checkout master
git merge <new-branch-name-you-have-just-created>

答案 3 :(得分:0)

如果由于签出标签(git checkout tags/<tag-name>)而处于“分离的HEAD”状态,那么您想通过使用-c和switch命令来创建一个新分支来保留您创建的提交。 / p>

git switch -c <new-branch-name>