git-隐藏更改而不恢复

git-stash changes without reverting

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

所以我的问题是,有没有办法在不恢复的情况下隐藏我的更改?如果 stash 不这样做,git 中是否有任何其他命令可以做到这一点?谢谢。

您似乎想要一种方法来临时存储您的更改,这样您就不会不小心删除它们,可以回滚。

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

典型的工作流程是这样的:

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.

这样做的缺点是您的 "local changes" 没有修订。

另一种选择是继续将您的本地工作保存为不同的提交,然后在发送 patch/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 
git stash && git stash apply

如果你喜欢你的藏品并发表评论:

git stash save “stash comment” && git stash apply

当我发布这个问题时,我是 git 的新手,并没有完全理解它的力量。现在我意识到存储不是我需要的,git 的本地分支机构做得更好。

假设您正在使用 main_branch,您希望它不受实验性更改的影响。

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

git checkout -b temp_branch

假设您做了一些更改并想保存您的进度。 commit,不用担心,一切尽在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_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 查看提交列表。请注意,仅合并部分更改可能会产生您需要解决的冲突。

这可以通过手动创建存储提交对象,然后将其存储在存储中来实现。

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

说明

我也喜欢在进行我认为可能不会成功的更改或重构之前,将一些东西作为回滚点放入存储中。我发现通过简短的描述将它扔到藏匿处更快、更容易,并且比使用分支需要更少的心理上下文切换。使用分支涉及创建分支,记住分支名称,然后在恢复时删除临时分支提交和它自己的分支。

Git 具有将内容存储到存储中而不从工作目录中删除文件的命令,如 中所述。可以使用 git stash create 创建存储提交对象,然后使用 git stash store:

将其保存到存储中
git stash store $(git stash create) -m "Stash commit message"

这可以保存到一个 Git 别名以方便使用:

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

git stash-keep -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”。这些限制可以通过更复杂的别名或脚本来解决,尽管此处提供的最小版本可能就足够了。