使用git,我如何在不提交的情况下保存我的进度(以便以后可能回滚到它)?
有时候,在发展的过程中,我达到了某种程度,我决定尝试一些新的东西。我想在我当前工作的基础上再接再厉(因此,使用git,我如何在不提交的情况下保存我的进度(以便以后可能回滚到它)?,git,squash,Git,Squash,有时候,在发展的过程中,我达到了某种程度,我决定尝试一些新的东西。我想在我当前工作的基础上再接再厉(因此,git stash不起作用),如果我认为我的新方法行不通,我就能够回到当前状态。然而,我目前的工作通常不是我想要提交它并将其永久保留在我的提交历史中的状态,因为尝试新的东西的目的通常是修复损坏的东西 这里最好的做法是什么?我考虑过的一件事是现在就提交,然后,如果我的新方法成功了,再提交一次,并将这两种方法压在一起。这是处理此问题的推荐方法吗?正如您自己所建议的,压缩提交是解决此问题的一种方法
git stash
不起作用),如果我认为我的新方法行不通,我就能够回到当前状态。然而,我目前的工作通常不是我想要提交它并将其永久保留在我的提交历史中的状态,因为尝试新的东西的目的通常是修复损坏的东西
这里最好的做法是什么?我考虑过的一件事是现在就提交,然后,如果我的新方法成功了,再提交一次,并将这两种方法压在一起。这是处理此问题的推荐方法吗?正如您自己所建议的,压缩提交是解决此问题的一种方法。虽然通常我只提交一次,然后继续修改提交(
git commit--all--amend--no edit
),因为这比挤压各种提交更容易。我认为,只要需要,就提交!提交不会伤害任何东西,除非您将其推到远程
我通常就是这样做的,只使用简单的命令。我再次重复您的问题以确定:“您在新功能开发过程中发现了一个新的bug。”
现在,如果(2)是特性开发提交的一部分,您可能希望将其压缩为一个提交。如果是,
$ git reset --soft (1)~1 # where (1) is a sha-1 of the commit (1)
$ git commit -m "Feature development X with a minor bugfix" # (4)
$
$ # origin -- (4)
请注意,git reset--soft
保留当前的工作目录状态。
如果(2)独立于X,而是系统的常见修复程序,则如下所示:
$ git checkout (1)~1 # Go back to the original state
$ git cherry-pick (2) # (2') First apply bugfix, expecting no conflict
$ git cherry-pick (1) && git cherry-pick (3)
$ git reset --soft HEAD^ && git commit --amend -m "A new feature X" # (5)
$
$ # origin -- (2') -- (5)
我的建议是不要太在意提交历史记录中的内容。只需创建一个新分支并开发该功能,并在功能完成后使用git merge--no ff将其合并,或者如果您决定不继续执行该分支,只需删除该分支即可。在后一种情况下,提交历史中将不会保留任何内容。如果功能名为X,则每次尝试都会得到
X.0
、X.1
、X.2
,等等。我复制(rebase-I或单个git cherry pick操作)好的部分,重做坏的部分,直到我有了正确的东西,然后从中构造最终的提交序列,并在准备好后发送或合并该最终序列。@torek的建议是完全合理的git-stash
仍然可以工作,因为您可以git-stash保存“一些合理的消息”和&git-stash-apply
,这样您就可以保存您的存储并使您的更改继续工作。如果你后来觉得你现在的想法不好,你可以git重置--hard
和git stash应用
并保持原样。一旦你知道这个隐藏不再相关,你就可以git-stash-drop
。大多数时候,我仍然喜欢分支,但偶尔在与您的情况非常相似的情况下,隐藏分支非常方便
$ git checkout (1)~1 # Go back to the original state
$ git cherry-pick (2) # (2') First apply bugfix, expecting no conflict
$ git cherry-pick (1) && git cherry-pick (3)
$ git reset --soft HEAD^ && git commit --amend -m "A new feature X" # (5)
$
$ # origin -- (2') -- (5)