我使用Git处理项目。每隔一段时间我发现自己想要保存我的更改,而不是提交它们,只是作为备份,然后继续工作。我通常做的是git stash
,然后立即git stash apply
将代码恢复到与存储之前相同的状态。我遇到的问题是git stash会恢复我的工作目录,所以即使我立即应用存储文件和项目也必须重建,因为它们似乎已经改变了。这非常令人讨厌,因为我们的一些项目需要很长时间才能构建。
所以我的问题是,有没有办法隐藏我的更改而不回复?如果stash没有这样做,git中是否还有其他命令可以执行此操作?谢谢。
答案 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 merge
或git 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