将更改保存在Git的工作目录中,同时将更改隐藏起来

kq4fsx7k  于 2023-06-28  发布在  Git
关注(0)|答案(5)|浏览(188)

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

xoshrz7s

xoshrz7s1#

值得一提的是,另一种方法是暂存您想要保留的更改,然后使用--keep-index隐藏所有内容:

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

上面的命令将隐藏所有内容,但它会将文件暂存在您的工作目录中。
git stash的官方Linux Kernel Git文档或从git-scm:
如果使用--keep-index选项,则已添加到索引的所有更改将保持不变。

c9qzyr3d

c9qzyr3d2#

git stash,然后git stash applygit stash && git stash apply)将存储文件,并在它之后立即应用存储。因此,毕竟你将在stash和工作目录中进行更改。
如果你想让它完整,你可以创建一个别名。将类似这样的内容放入~/.gitconfig

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

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

iqih9akk

iqih9akk3#

你可以使用git stash create创建一个stash commit,然后使用git stash store将其保存到stash中:

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

0md85ypi

0md85ypi4#

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

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

bfrts1fy5#

有一个技巧可以帮助你,不是藏东西,而是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))

所以现在你有一个提交标记的stash在你的处置,它是不可能做一个git stash pop无论如何,但你可以做的事情,如创建补丁或重置文件等从创建的'stash'标签,您的工作目录文件也保持不变的BTW。
如果您更喜欢存储在分支中:

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)

相关问题