使用 Git,我不得不回到特定的提交。我做了一些更改,现在我想提交它们。这样做的正确方法是什么?
我的项目现在处于 detached-HEAD 状态。如果我进行提交,我的更改是否会被保存
git commit
? 否则,我应该怎么做才能不丢失我的更改?
使用 Git,我不得不回到特定的提交。我做了一些更改,现在我想提交它们。这样做的正确方法是什么?
我的项目现在处于 detached-HEAD 状态。如果我进行提交,我的更改是否会被保存
git commit
? 否则,我应该怎么做才能不丢失我的更改?
免责声明:git 并不复杂,它只是通用的。不要因为我的回答很长而被吓跑:)
你有过:
master: a-b-c-d-e-f
并想改变c
。你做了:
* git checkout c
(避免将来检查提交。移动分支头)
*更改了一些文件
你在:
大师:abcdef \未提交的工作,分离
(如果你推了,下游的人将不得不从上游的 rebase 中恢复)
git stash .
git checkout master
git stash pop
(解决冲突)git stage .
git commit -m "temporary name for g"
master: a-b-c-d-e-f-g
)git rebase c -i
(“将我当前的分支重新应用到点 c,并让我以交互方式操作提交”,即重新父(rebase)d-e-f
到新的c
)g
,所以它在 c 之后,然后将 rebase 命令从 更改pick
为fixup
。dd
删除一行,P
放置它,i
进入插入模式输入“fixup” :wq
,然后保存并退出vim。master: a-b-c'-d'-e'-f'
在哪里,并且在变基期间。已经成为因为他们的祖先发生了变化,所以就 git 而言,它们不是“相同”的提交,但它们的内容保持不变)c'
g
c
d-e-f
d'-e'-f'
d-e-f
(并重写历史,就好像你从来没有做过一样)(如果你推了,下游的人将不得不从上游的 rebase 中恢复):
git stash .
git checkout master
master: a-b-c-d-e-f
, 最初基于 c 的隐藏文件)git reset --hard c
(丢弃自 c 以来在 master 上的所有文件和提交)master: a-b-c
, 带有隐藏文件)git stash pop
(解决冲突)master: a-b-c-*
)git stage .
git commit -m "description of g"
master: a-b-c-g
)git stash
git revert --no-commit d
git revert --no-commit e
git revert --no-commit f
git push
git stash pop
(不会有冲突)git stage .
git commit -m "Undo d-e-f in order to fix..."
git push
git push
def,并且希望将它们分开:听起来您的新更改是针对 master 的新分支。git branch <foo>
.
从此提交创建一个新分支,然后执行以下操作commit
:
git checkout -b <branchname>
git commit
假设您已经暂存(即git add myfile1 myfile2
)您的文件。
将您的工作保存在分离的头部:
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>
如果您因为签出标签 ( git checkout tags/<tag-name>
) 而处于“分离 HEAD”状态,那么您想创建一个新分支来保留您创建的提交,方法是使用 -c 和 switch 命令。
git switch -c <new-branch-name>