Git将更改保存在';恢复点';不在同一分支中提交并继续?

Git将更改保存在';恢复点';不在同一分支中提交并继续?,git,Git,我正在使用一个新特性,我在我的分支中进行了更改,但没有提交这些更改,因为代码不完整/不稳定。但后来我意识到,也许我可以做一些重构来改进我修改过的部分代码,但我不确定重构是否能正常工作。所以我想暂时保存我的更改,并在当前状态下继续编辑文件。如果重构进展顺利,一切正常,我可以继续编码,完成所有代码后,进行提交。但是,如果重构不起作用,我希望在恢复点之前恢复重构更改(但保留到目前为止所做的更改) 我不想进行git隐藏,因为我不想撤消所有更改,我想继续处理更改,只修改其中的几行。 到目前为止,我知道的唯

我正在使用一个新特性,我在我的分支中进行了更改,但没有提交这些更改,因为代码不完整/不稳定。但后来我意识到,也许我可以做一些重构来改进我修改过的部分代码,但我不确定重构是否能正常工作。所以我想暂时保存我的更改,并在当前状态下继续编辑文件。如果重构进展顺利,一切正常,我可以继续编码,完成所有代码后,进行提交。但是,如果重构不起作用,我希望在恢复点之前恢复重构更改(但保留到目前为止所做的更改)

我不想进行
git隐藏
,因为我不想撤消所有更改,我想继续处理更改,只修改其中的几行。
到目前为止,我知道的唯一方法是使用类似“假提交以尝试重构”的名称进行提交,但我认为这不是正确的方法。

最简单的方法是使用隐藏。。。。但不是一个命令而是两个:

git stash save "blah blah"
git stash apply # get the changes back, keep them on the stash as well

Git阶段实际上是一个很好的用例选择。您可以
git添加
您希望在提交中显示的所有更改文件(如果现在提交的话)。然后,继续进行测试重构。这只会影响工作目录中的文件,而不会影响阶段

如果您决定保留测试重构中的更改,那么只需对已更改的任何文件执行另一轮的
git add
。如果您决定放弃对工作目录所做的更改,则使用
git checkout--
重置这些文件


您的用例是Git阶段存在的原因之一。

这就是提交的具体用途。只要没有将提交推送到远程服务器,就始终可以撤消提交

为检查点创建一个新的
提交[1]
,然后
修改[2]
检查点提交,如果您决定继续重构工作。如果需要返回检查点,可以
reset[3]
撤消重构

#[1]创建检查点提交
git提交-A-m检查点
#然后,进行一些更改,然后执行以下操作之一:
#[2]使用您的新更改修改以前的检查点:
git提交-A--amend
#或
#[3]撤消自上次检查点以来的所有操作:
git重置--硬头

重要更新-在我最初写这篇文章时,如果因为重构失败而撤消提交,我给了
重置
错误的选项。我给出的命令将删除提交,并从索引和工作树中删除其更改,这不是您在本场景中希望执行的操作。恢复是可能的,但您可能希望按照现在编写的方式进行恢复


我可以想出三个合理的解决办法

第一个——我会做的一个——就是承诺。未推送的提交不必是永久性的。所以现在你会

git commit
如果重构失败,您将放弃更改(恢复到提交状态),然后放弃提交

git reset HEAD -- :/:
git checkout -- :/:
git reset --soft HEAD^
git commit --amend
但是如果重构没有失败,您可以修改提交

git reset HEAD -- :/:
git checkout -- :/:
git reset --soft HEAD^
git commit --amend
即使重构后您还没有准备好提交,您也可以继续工作,然后稍后修改提交

因此,即使您进行了多个WIP提交,您仍然可以在使用交互式重基完成后将其删除。(有关详细信息,请参阅git rebase文档;您可能希望“挤压”提交,而不是删除它们,因为rebase使用的术语有点“错误”。)


这是迄今为止最安全的解决方案,也就是说,犯错误和丢失工作的可能性最小。但是如果你真的不想这样做,你可以使用隐藏(隐藏,然后应用隐藏,然后如果你必须恢复,你可以返回上一次提交并再次应用隐藏),或者只使用索引(但如果您在使用(例如添加或重置)时出错,则可能会丢失保存点)。

您可以尽可能多地使用
git commit
。当代码足够好时,您可以重构提交以创建一个清晰的历史记录

假设自提交O以来,您在功能分支上创建了5个新的草稿提交。历史记录是
O-A-B-C-D-E
。现在代码已经完善。您可以将5个新提交转换为单个提交:

git reset O --soft
git commit -m'perfect commit'
历史现在变成了
O-N
。如果您发现某些内容仍然需要修改,您可以修改并使用
git commit--amend
使
N
更加完美

您可能会发现
N
包含太多更改,最好将其拆分为3个提交

# --mixed can be omitted as it's the default option
git reset O --mixed

# if you want to split changes of one file to different commits, use -p to selectively add the changes 
git add -p foo1.txt
git commit -m'1st perfect commit'

git add foo2.txt
git commit -m'2nd perfect commit'

# add the rest changes
git add .
git commit -m'3rd perfect commit'
现在的历史是
O-P1-P2-P3

到目前为止,我知道的唯一方法是使用类似“假提交以尝试重构”的名称进行提交,但我认为这不是正确的方法

我认为这是一种正确的方式。你没有推动的提交是本地提交,它们是你桌上的笔记,初稿正在准备出版,在你组织和澄清你的工作以供展示时可能会被重写

承诺没有什么神圣的。其他人所依赖的承诺,那是另一回事,在dvcs发明之前,两者之间没有任何区别,pu[bli]如果没有发布,就不可能有本地提交,因为每个风投都缺乏这种设施,因此围绕它们发展起来的语言和习俗甚至缺乏这种概念


您尚未发布的工作可以被重写和重写,直到它能够发布为止。本地提交不必比编辑器的撤消缓冲区的增强多文件扩展名更持久,而且它们在使用时非常有价值。

只需将更改提交到新的分支即可。分支很便宜,也很容易够我妈了