【问题标题】:How to save changes when in detached-head state?处于分离头状态时如何保存更改?
【发布时间】:2015-09-08 02:44:18
【问题描述】:

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

我的项目现在处于 detached-HEAD 状态。如果我进行提交,我的更改是否会保存

git commit

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

【问题讨论】:

  • 我做了一些更改,现在想保存它们。请更具体一点:“保存”是什么意思?您主要有两个选择:提交或存储。从某种意义上说,任何一个都会“保存”您的更改。你指的是哪个?此外,您可能想要创建一个分支。
  • 我想提交我的更改。
  • 我已经相应地编辑了你的问题。
  • 你想对你前面的旧提交发生什么?即,您“返回”到提交,因此该提交“前面”有一些提交。你还关心那些吗? (他们是否被推到其他人的上游,你关心那些人)
  • 我想将“在前面”的提交与处于分离头部状态的提交合并。 “前面”有一些错误,这就是我回到之前提交的原因。

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


【解决方案1】:

免责声明:git 并不复杂,它只是通用的。不要因为我的回答很长而被吓跑:)

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

并想更改c。你做到了:
* git checkout c(避免在未来签出提交。改为移动分支头)
* 修改了一些文件

你在:

master: a-b-c-d-e-f
             \未提交的工作,分离

如果您想在更改的“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' 是您在变基期间合并gc 的结果。d-e-f 已变为d'-e'-f',因为它们的祖先发生了变化,因此它们不是“相同的” " 就 git 而言提交,但它们的内容保持不变)

如果你想撤销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)

如果您想撤消 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

如果您有git push d-e-f,并且您希望将它们分开:

听起来您的新更改是针对 master 的新分支。 git branch <foo>

【讨论】:

  • 惊人的综合答案,提供对多种技术和工作流程的洞察力。你应该得到比这更多的信任/关注。只有一个赞成票?耶稣。
  • 很好的答案!谢谢!!帮了我很多!
【解决方案2】:

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

git checkout -b <branchname>
git commit 

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

【讨论】:

  • 在这种情况下,您可能需要说明为什么最好创建分支。
  • 我什么都没做。我想我需要了解更多关于暂存文件的信息。
  • 执行这些命令后,它确实将我的更改放在新分支中,但我仍然看到新(当前)分支为“分离”。
【解决方案3】:

将您的工作保存在分离的头部:

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

如果你想把它合并到master:

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

【讨论】:

    【解决方案4】:

    如果您因为签出标签 (git checkout tags/&lt;tag-name&gt;) 而处于“分离 HEAD”状态,那么您想创建一个新分支来保留您创建的提交,方法是使用 -c 和 switch 命令。

    git switch -c <new-branch-name>
    

    【讨论】:

      猜你喜欢
      • 2018-04-28
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 2014-11-14
      • 2016-07-09
      • 1970-01-01
      相关资源
      最近更新 更多