git-stash更改而不还原

时间:2016-09-09 13:12:48

标签: git git-stash

我使用Git处理项目。每隔一段时间我发现自己想要保存我的更改,而不是提交它们,只是作为备份,然后继续工作。我通常做的是git stash,然后立即git stash apply将代码恢复到与存储之前相同的状态。我遇到的问题是git stash会恢复我的工作目录,所以即使我立即应用存储文件和项目也必须重建,因为它们似乎已经改变了。这非常令人讨厌,因为我们的一些项目需要很长时间才能构建。

所以我的问题是,有没有办法隐藏我的更改而不回复?如果stash没有这样做,git中是否还有其他命令可以执行此操作?谢谢。

4 个答案:

答案 0 :(得分:1)

好像你想要一种临时存储更改的方法,这样你就不会意外删除它们,可以回滚。

最好的方法是在本地实际提交更改。

典型的工作流程如下:

vim myfile # make some changes
git add myfile
git commit -m "temp changes 1"
vim myfile # make more changes
git commit --amend
git diff HEAD~1 # See the changes you've made compared to last HEAD.

这样做的缺点是你的本地变化"没有被修改。

另一种选择是继续将本地工作保存为不同的提交,然后在发送补丁/ PR之前简单地压缩它们。

这看起来像这样:

vim myfile2 # make changes
git add myfile2
git commit -m "temp changes dated X"
vim myfile2 # more changes
git add myfile2
git commit -m "temp changes dated Y"

然后在发送之前简单地做这样的事情。

git rebase -i HEAD~N # Where N is the number of local commits you made
# Squash them, by changing 'pick' to 'squash' in your editor.
# Send them away
git push origin dev 

答案 1 :(得分:1)

当我发布此问题时,我是git的新手,并不完全了解它的功能。现在我意识到隐藏并不是我所需要的,而且git的本地分支可以更好地完成这项工作。

假设您在main_branch上,您想使其免受实验更改的影响。

只需创建一个新分支即可存储您的实验更改。

git checkout -b temp_branch

假设您进行了一些更改并希望保存进度。只需提交,不用担心,一切都在temp_branch上:

git commit -a -m "first change"

假设您还要进行一些更改,然后再次存储:

git commit -a -m "second change"

最后,假设您对实验性更改感到满意,并希望将其合并到主分支。有两种情况:

1)如果要合并所有更改,请执行以下操作:

git fetch . temp_branch:main_branch

这会将temp_branch的所有更改都放入main_branch中,而无需切换到main分支,这意味着您的文件不会被修改,也不需要重新编译。请注意,只有在此期间没有对main_branch进行任何其他更改时才有可能。如果main_branch已更改,则需要使用git mergegit rebase,但是这种情况超出了问题的范围。

2)假设您只想将temp_branch的部分提交合并到main_branch中。您可以使用git cherry-pick进行此操作。首先执行git checkout main_branch切换到main_branch(这会修改文件,但这是不可避免的,因为要删除某些更改),然后执行git cherry-pick <SHA>(其中<SHA>是提交您要合并的内容)。您可以通过执行git log temp_branch来查看提交列表。请注意,仅合并某些更改可能会产生需要解决的冲突。

答案 2 :(得分:1)

在进行更改或重构之前,我也很喜欢将东西作为回退点放入存储库中,以至于我觉得可能无法完成。与将其保存到分支,记住分支名称,然后在完成后还原/删除分支提交相比,将其简短地描述到存储库中对我而言,这在脑海中比现在更快捷,更容易。 >

从阅读https://stackoverflow.com/a/44330944/1108305可以看出,有些命令可用于将事物存储到存储中,而无需从工作目录中删除文件。

您可以使用git stash create创建存储提交,然后使用git stash store将其保存到存储中:

git stash store $(git stash create) -m "Stash commit message"

可以将其保存为git别名,以使其更加方便:

git config --global alias.stash-keep-all '!git stash store $(git stash create)'

git stash-keep-all -m "Stash commit message"

请注意,这不能完成git stash push所做的所有事情。例如,它不会将分支名称附加到提交,例如“ stash@{0}: On myBranch: Stash commit message”。其次,我目前编写的简单别名将错误“ "git stash store" requires one <commit> argument”而不是“ No local changes to save”。如果您觉得很重要,可以使用更复杂的别名或脚本来解决这些问题。

答案 3 :(得分:0)

git stash && git stash apply

如果您喜欢带评论的藏匿处,

git stash save “stash comment” && git stash apply
相关问题