17

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

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

git commit

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

4

4 回答 4

39

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

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

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

你在:

大师:abcdef
             \未提交的工作,分离

如果您想在更改的“c”之上重新应用 def

(如果你推了,下游的人将不得不从上游的 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. 遵循交互式 rebase 指南。你想重新排序g,所以它在 c 之后,然后将 rebase 命令从 更改pickfixupdd删除一行,P放置它,i进入插入模式输入“fixup” :wq,然后保存并退出vim。
  9. ( ,你合并的结果master: a-b-c'-d'-e'-f'在哪里,并且在变基期间。已经成为因为他们的祖先发生了变化,所以就 git 而言,它们不是“相同”的提交,但它们的内容保持不变)c'gcd-e-fd'-e'-f'

如果你想撤销d-e-f(并重写历史,就好像你从来没有做过一样)

(如果你推了,下游的人将不得不从上游的 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)

如果您想撤消 def(但将它们保留在历史记录中)

  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 pushdef,并且希望将它们分开:

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

于 2015-06-22T15:47:33.363 回答
7

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

git checkout -b <branchname>
git commit 

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

于 2015-06-22T15:13:48.097 回答
5

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

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>
于 2018-06-29T08:22:21.517 回答
0

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

git switch -c <new-branch-name>
于 2020-02-24T00:45:26.443 回答