存储更改,同时保持Git中工作目录中的更改

时间:2013-07-24 19:39:12

标签: git git-stash

是否有git stash命令可以存储您的更改,但也将它们保存在工作目录中?那么基本上只需git stash; git stash apply一步吗?

5 个答案:

答案 0 :(得分:107)

对于它的价值,另一种方法是暂停您想要保留的更改,然后使用--keep-index存储所有内容:

$ git add modified-file.txt
$ git stash save --keep-index

上面的命令会隐藏包括modified-file.txt在内的所有内容,但它也会将该文件暂存并保存在您的工作目录中。

来自official Linux Kernel Git documentation for git stash

  

如果使用--keep-index选项,则已添加到索引的所有更改都将保持不变。

答案 1 :(得分:41)

git stash然后git stash applygit stash && git stash apply)将存储文件并在其后立即应用存储。所以,毕竟你将在藏匿处和工作目录中进行更改。

如果您想将其整合在一起,则可以创建别名。只需将这样的内容添加到~/.gitconfig

[alias]
    sta = "!git stash && git stash apply"

这种方法的缺点是所有文件都被存储并重新创建。这意味着将更改有问题文件的时间戳。 (如果在我执行git sta之前打开文件时尝试保存文件,则会导致Emacs抱怨,如果您使用make或朋友,可能会导致不必要的重建。)

答案 2 :(得分:9)

答案中的一个小的改进,实际上可能会使用。

$ git add modified-file.txt  
(OR $ git add .    ---- for all modified file)
$ git stash save --keep-index "Your Comment"

答案 3 :(得分:3)

有一个技巧可以帮助你,而不是藏匿'但FWIW:

git add -A
git commit -m "this is what's called stashing"       (create new stash commit)
git tag stash                               (mark the commit with 'stash' tag)
git reset HEAD~        (Now go back to where you've left with your working dir intact)

所以现在你有一个提交标记藏匿的东西,无论如何都不可能做git stash pop但你可以做那些事情,比如从那里创建补丁或重置文件等,你的工作目录文件也是完好无损的BTW。

答案 4 :(得分:3)

您可以使用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”。