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

Mic*_*rst 123 git git-stash

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

小智 127

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

$ git add modified-file.txt
$ git stash save --keep-index
Run Code Online (Sandbox Code Playgroud)

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

官方Linux Kernel Git文档中git stash:

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

  • 这是迄今为止我见过的对 --keep-index 最直接的解释。我不太明白文档中的措辞方式的含义。 (9认同)
  • 我做了`git stash push --keep-index -m“message”`,它仍然清除了工作目录!我再次清除了工作目录更改,因为我认为我已经更改并保存了旧文件,并应用了存储,我发现并非所有文件都在存储中,并且现在都消失了! (4认同)
  • 如果你想在存储之前全部上演,那么只需执行`git add --all` (2认同)

mad*_*ead 46

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

如果您想将其整合在一起,则可以创建别名.把这样的东西放到~/.gitconfig:

[alias]
    sta = "!git stash && git stash apply"
Run Code Online (Sandbox Code Playgroud)

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

  • 我相信不同之处在于[`&&`只有在第一次返回零状态代码时才运行第二个命令](http://linux-training.be/files/books/html/fun/ch11s04.html). (10认同)
  • 另外,`git stash 之间有什么区别?git stash apply`和`git stash && git stash apply`? (2认同)
  • @anthropomorphic `git config --global alias.sta "!git stash && git stash apply"` 应该这样做。 (2认同)

Pre*_*ngh 10

答案中的一个小的增强,实际上可能会使用.

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

  • 注意:没有“git add”就不起作用(例如,修改但未添加到提交文件) (3认同)

M. *_*tin 8

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

  • 这个答案实际上完全符合OP的要求! (4认同)