git-stash更改而不还原

ope*_*och 11 git git-stash

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

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

M. *_*tin 7

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

git stash store $(git stash create) -m "Stash commit message"
Run Code Online (Sandbox Code Playgroud)

解释

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

Git 有命令将内容存储到存储中,而无需从工作目录中删除文件,如/sf/answers/3103166111/中所述。可以使用以下命令创建存储提交对象git stash create,然后将其保存到存储中git stash store

git stash store $(git stash create) -m "Stash commit message"
Run Code Online (Sandbox Code Playgroud)

可以将其保存到 Git 别名以使其更方便:

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

git stash-keep -m "Stash commit message"
Run Code Online (Sandbox Code Playgroud)

请注意,这并不执行所有操作git stash push。其一,它不会将分支名称附加到提交中,例如“ stash@{0}: On myBranch: Stash commit message”。其次,当存储没有更改时,上面的简单别名将出现错误,并显示“ "git stash store" requires one <commit> argument”而不是“ ”。No local changes to save这些限制可以通过更复杂的别名或脚本来解决,尽管此处提供的最小版本可能就足够了。

  • 这完美地回答了原来的问题。 (2认同)

ope*_*och 5

当我发布这个问题时,我是 git 的新手,并没有完全理解它的力量。现在我意识到藏匿不是我所需要的,而且 git 的本地分支可以更好地完成这项工作。

假设您在 main_branch 上,您希望避免实验性更改。

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

git checkout -b temp_branch
Run Code Online (Sandbox Code Playgroud)

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

git commit -a -m "first change"
Run Code Online (Sandbox Code Playgroud)

假设您进行了更多更改并希望再次存储:

git commit -a -m "second change"
Run Code Online (Sandbox Code Playgroud)

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

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

git fetch . temp_branch:main_branch
Run Code Online (Sandbox Code Playgroud)

这会将 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。请注意,仅合并部分更改可能会产生需要解决的冲突。