存储更改,同时将更改保留在Git的工作目录中


145

是否有一个git stash命令可以存储您的更改,但也将其保留在工作目录中?所以基本上git stash; git stash apply一步就可以完成?




1
@MariuszPawelski不,不是。这个问题比我的问题更具体。我的问题的答案仅仅是“否”。不过,感谢您提供的链接,它可能对某些人甚至以后的我自己都有帮助。
Michael Dorst

明确地说,我的问题有所不同,因为我不要求文件保持不变。我只是在寻找替代品git stash && git stash apply。您会注意到,该问题的答案与我的答案完全不同。
Michael Dorst

嗯,对,您的问题不太具体。但是我提出这个问题是因为它的答案也可以满足您的要求。这样,该问题在边栏中将显示为“已链接”,因此对某人可能会有帮助。
Mariusz Pawelski

Answers:


156

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

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

上面的命令将隐藏所有内容,但会将文件保留在您的工作目录中。

来自或git-scm官方Linux Kernel Git文档git stash

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


3
到目前为止,这是我所见过的--keep-index的最直接的解释。通过文档上的措辞,我并没有完全理解它的含义。
40名侦探

52

git stash然后git stash applygit stash && git stash apply)将存储文件并在其后立即应用存储。因此,毕竟您将在存储和工作目录中进行更改。

如果需要,您可以创建一个别名。只需将以下内容放入~/.gitconfig

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

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


1
而且,git stash; git stash apply和之间有什么区别git stash && git stash apply
Michael Dorst


2
@拟人git config --global alias.sta "!git stash && git stash apply"应该做到这一点。

我怎么能修改此别名使用git stash save同一个参数,然后git stash apply
spinningarrow

1
@JaySidri,爆炸意味着它实际上是外部命令,而不是git参数本身。按照docs的说法:“如您所知,Git只是将新命令替换为其别名。但是,也许您想运行外部命令,而不是Git子命令。在这种情况下,您可以使用!字符。”
madhead '17

10

答案可能会有所提高,实际上可能会使用。

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

注意:如果没有“ git add”(例如,已修改但未添加到提交文件)
无法使用

4

有一个技巧可以帮助您,而不是藏起来的东西,而是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无论如何都无法执行,但是您可以执行诸如创建补丁或重置文件之类的操作。从那里开始,您的工作目录文件也保持不变。


2

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


1
爱这个!!不过man git-stash-m <message>有一个更正:说必须在提交哈希之前。除了最新git中的某些更改。
tanius
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.