如何隐藏更改,同时将更改保留在工作目录中? (吉特)

问题描述 投票:0回答:5

是否有一个

git stash
命令可以隐藏您的更改,但也将它们保留在工作目录中?所以基本上一步就能实现
git stash; git stash apply

git git-stash
5个回答
270
投票

无论如何,另一种方法是暂存您想要保留的更改,然后使用

--keep-index
:

隐藏所有内容
$ git add modified-file.txt
$ git stash push --keep-index

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

来自git stash

官方Linux内核Git文档或来自git-scm

如果使用

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


93
投票

git stash
然后
git stash apply
(
git stash && git stash apply
) 将隐藏文件并在其之后立即应用隐藏。所以毕竟您将在存储和工作目录中进行更改。

如果您想要一个别名,您可以创建一个别名。只需将类似的内容放入

~/.gitconfig

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

这种方法的缺点是所有文件都会被隐藏并重新创建。这意味着相关文件的时间戳将被更改。 (如果在执行

git sta
之前打开文件,当我尝试保存文件时,Emacs 会抱怨,如果您使用
make
或朋友,可能会导致不必要的重建。)


31
投票

您可以使用

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
”。


15
投票
对答案的一个小改进,在实际中可能会使用。

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

3
投票
有一个技巧可能会帮助你,不是隐藏'东西,而是FWIW:

git commit -m "Your already staged content (May be empty)" #(Commit index) git add -A #(stage remaining 'unstaged' contents) git commit -m "My works so far (Unstaged)" #(Working directory) git tag stash #(mark the commit with 'stash' tag) git reset HEAD^ #(1st reset (--mixed): Unstaged) git reset --soft HEAD^ #(2nd reset (--soft): Staged (Skip if your index was empty))
现在你有一个提交标记的存储可供你使用,无论如何都不可能做

git stash pop

,但你可以从创建的“存储”标签中执行创建补丁或重置文件等操作,你的工作目录文件也是顺便说一句,完好无损。


如果您喜欢在分行存放:

current_branch=`git branch --show-current` git checkout -b stash #(create and switch to new branch 'stash') git commit -m "Your already staged content (May be empty)" #(Commit index) git add -A #(stage remaining 'unstaged' contents) git commit -m "My works so far (Unstaged)" #(Working directory) git reset HEAD^ #(1st reset (--mixed): Unstaged) git reset --soft $current_branch #(2nd reset (--soft): Staged) git checkout $current_branch #(Now go back to where you've left with your working dir and staged status intact)
    
© www.soinside.com 2019 - 2024. All rights reserved.