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 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
查看提交列表。请注意,仅合并部分更改可能会产生您需要解决的冲突。
这可以通过手动创建存储提交对象,然后将其存储在存储中来实现。
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
”。这些限制可以通过更复杂的别名或脚本来解决,尽管此处提供的最小版本可能就足够了。
我使用 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 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
查看提交列表。请注意,仅合并部分更改可能会产生您需要解决的冲突。
这可以通过手动创建存储提交对象,然后将其存储在存储中来实现。
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
”。这些限制可以通过更复杂的别名或脚本来解决,尽管此处提供的最小版本可能就足够了。