使用Git,我不得不回到特定的提交。我做了一些更改,现在我想提交它们。这样做的正确方法是什么?
我的项目现在处于分离-HEAD状态。如果我使用
进行提交,我的更改是否会被保存git commit
?否则,我该怎么做才不会丢失我的更改?
答案 0 :(得分:20)
免责声明:git并不复杂,它只是用途广泛。不要因为我絮絮叨叨地回答这个问题而吓跑了。)
你有:
master: a-b-c-d-e-f
并希望更改c
。你做了:
* git checkout c
(避免将来检查提交。改为移动分支头)
* 更改了一些文件
你在:
master: a-b-c-d-e-f \uncommitted-work,detached
(如果你推了,下游的人将有to recover from upstream 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'
,其中c'
是您在rebase期间合并g
和c
的结果。d-e-f
已成为d'-e'-f'
他们的祖先已经改变,所以就git而言,它们不是“相同的”提交,但它们的内容保持不变)。d-e-f
(并重写历史记录,就好像从未创建过它们一样)(如果您已推送,下游人员将有to recover from upstream 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
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>