我如何只储存分支上的一个已修改文件?
git stash push -p -m "my commit message"
-p
选中应该被暂存的差异块; 整个文件也可以选择。
对于每个差异块,您将被提示进行几个操作:
y - stash this hunk
n - do not stash this hunk
q - quit; do not stash this hunk or any of the remaining ones
a - stash this hunk and all later hunks in the file
d - do not stash this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help
git stash save -p 我的贮藏消息
,因为参数的顺序不是很直观。 - Chris Maes免责声明:以下答案适用于git2.13之前的版本。若使用git2.13及以上版本,请查看下面的另一个答案。
警告
如评论中所述,此命令将所有内容都放入stash中,包括已暂存和未暂存的更改。而--keep-index
选项只是在stash操作后保留索引不变,这可能导致在稍后还原stash时出现合并冲突。
以下命令会把你尚未添加的所有更改都暂存起来。只需使用git add
命令添加需要保存的更改,然后再运行该命令即可。
git stash --keep-index
例如,如果您想将旧提交分割成多个变更集,可以使用以下过程:
git rebase -i <最后一个好的提交>
编辑
。git reset HEAD^
git add <要在此更改中保留的文件>
git stash --keep-index
git add
任何更改。git commit
git stash pop
git rebase --continue
git stash save -k
时,确实保留了索引(git stat
中的绿色),但是整个更改集(包括绿色和红色)都进入了stash。这违反了原帖的请求,“只保存一些更改”。我想只暂存一些红色部分(以备将来使用)。 - Pistosgit stash -p
正是我要找的。我想知道这个选项是不是最近才添加的。 - Pistosgit stash --keep-index
命令存在问题。如果你在此之后继续进行更改,然后尝试 git stash pop
,你会遇到合并冲突,因为存储的快照包括了你保留和修改的文件,而不仅仅是没有保留的文件。例如:我修改了文件 A 和 B,然后储藏了文件 B,因为我想测试 A 的更改;我发现 A 存在问题,于是修复了它;我提交了 A,但现在我无法取出储藏,因为旧版本的 A 没有任何好的理由在其中导致了合并冲突。实际上,A 和 B 可能是许多文件,甚至是二进制图像等,所以我基本上不得不放弃丢失 B。 - rjmunrogit stash push
。git stash push [-m <message>] [--] [<pathspec>...]
pathspec
被提供给'git stash push
'时,新的存储仅记录与路径模式匹配的文件的修改状态。更多信息请参见“将更改存储到特定文件中”。 git stash push path/to/file
test_expect_success 'stash with multiple pathspec arguments' '
>foo &&
>bar &&
>extra &&
git add foo bar extra &&
git stash push -- foo bar &&
test_path_is_missing bar &&
test_path_is_missing foo &&
test_path_is_file extra &&
git stash pop &&
test_path_is_file foo &&
test_path_is_file bar &&
test_path_is_file extra
原始答案(见下文,2010年6月)是关于手动选择您想要存储的内容。
Casebash 评论说:
这很好(
stash --patch
的原始解决方案),但通常我已经修改了很多文件,所以使用打补丁很麻烦。
bukzor的答案(2011年11月被赞同)提供了一个更实用的解决方案,基于
git add
+git stash --keep-index
。
去看看并赞同他的答案,它应该是官方的答案(而不是我的)。
关于该选项,chhh在评论中指出了另一种替代工作流程:
在这样的藏匿之后,你应该"
git reset --soft
",以恢复清晰的暂存区:
为了回到原始状态——即清晰的暂存区并只有一些选择性的未暂存的修改,可以软重置索引以获得(没有像你——bukzor——这样提交任何东西)。
(原始答案2010年6月:手动隐藏)
然而,git stash save --patch
可以让您实现部分隐藏您想要的内容:
使用
--patch
,您可以交互式选择在HEAD和工作树之间的差异中的块进行隐藏。
藏匿条目被构造成其索引状态与您的仓库的索引状态相同,并且其工作树仅包含您交互选择的更改。 然后从您的工作树中回滚所选的更改。
然而,这将保存整个索引(可能不是您想要的,因为它可能包括已经索引的其他文件),以及部分工作树(看起来可能像您想要的工作树)。
git stash --patch --no-keep-index
--patch
无法工作,手动处理可能会更好:git stash
git stash
# 这一次,只有你想要的文件被藏起来了git stash pop stash@{1}
# 重新应用所有文件的修改git checkout -- afile
# 将文件重置为HEAD内容,即本地修改之前的内容git stash --keep-index
,正如在 bukzor 的回答评论中所指出的那样,它并不能做到你想要的效果。创建两个文件 foo
和 bar
,将它们提交。对每个文件添加一行内容。执行 git add foo
,然后执行 git stash --keep-index
。期望的结果是你的 bar
文件的修改被暂存了起来,而你对 foo
文件的修改仍然存在且已经被暂存。但实际上,你对 foo
和 bar
两个文件的修改都被暂存了起来。如果你执行 git reset
并修改 foo
文件,由于冲突,你现在无法执行 git stash pop
。 - Mark Amery使用git stash push
,像这样:
git stash push [--] [<pathspec>...]
例如:git stash push -- my/file.sh
这个功能从Git 2.13开始可用,于2017年春季发布。
git stash push
。而且我在这里详细介绍了新的Git 2.13命令:https://dev59.com/hGct5IYBdhLWcg3wKqQd#42963606。 - VonCgit stash apply
来恢复被隐藏的更改,对吗? - Chad当使用git stash -p
(或带有stash --keep-index
的git add -p
)太麻烦时,我发现使用diff
、checkout
和apply
更容易:
仅“隐藏”特定文件/目录:
git diff path/to/dir > stashed.diff
git checkout path/to/dir
之后
git apply stashed.diff
git add -p
。加一。 - VonCgit diff > file.diff
和git apply
是我通常使用的部分暂存工具。对于较大的更改集,我可能需要考虑切换到git stash -p
。 - thekingoftruthpatch = log --pretty=email --patch-with-stat --reverse --full-index --binary
。请注意,这需要您提交补丁所做的更改。 - void.pointer../../foo/bar.txt
这样的路径,对我来说这种方法并不完美。虽然补丁可以生成,但我需要移动到存储库根目录才能应用补丁。因此,如果您在使用此方法时遇到问题,请确保您是从存储库根目录执行操作。 - Michael Anderson如果您不想使用存储的更改指定消息,请在双破折号后传递文件名。
$ git stash -- filename.ext
如果是未跟踪/新文件,则需要首先将其暂存。
此方法适用于git版本2.13+。
git stash push
。 - sealocal假设你有3个文件
a.rb
b.rb
c.rb
如果您只想存储b.rb和c.rb而不是a.rb,可以像这样操作:
# commit the files temporarily you don't want to stash
git add a.rb
git commit -m "temp"
# then stash the other files
git stash save "stash message"
# then undo the previous temp commit
git reset --soft HEAD^
git reset
完成了!希望对你有所帮助。
如果你只想要贮藏部分修改过的文件,只需将其他文件添加到暂存区,然后执行git stash push --keep-index
。
它将贮藏所有未在暂存区的修改过的文件。
--keep-index
对于存储的内容没有影响。它只是将暂存的文件保持为暂存状态,并且存储会保留哪些文件被存储了的信息。所以如果你想要实际将这些信息还原到你的工作区,你需要使用 pop/apply
并加上 --index
。否则,关于哪些是暂存的信息将被忽略,一切都会被还原为未暂存状态。 - undefined另一种做法:
# Save everything
git stash
# Re-apply everything, but keep the stash
git stash apply
git checkout <"files you don't want in your stash">
# Save only the things you wanted saved
git stash
# Re-apply the original state and drop it from your stash
git stash apply stash@{1}
git stash drop stash@{1}
git checkout <"files you put in your stash">
-p
)后,想出了这个解决方案。你可以简单地这样做:
git stash push "filename"
或带有可选消息
git stash push -m "Some message" "filename"
git stash push -- <filepath>
,这是最近GIT版本(v2.13>)中添加的方法。如果您运行 git status,可以获取 <filepath>。 - Samir K
git diff -- *filename* > ~/patch
将会生成一个补丁文件,然后通过命令git checkout -- *filename*
可以撤销对该文件的改动。之后,你可以使用命令git apply ~/patch
重新应用该补丁。请注意,这里的“filename”是指要操作的文件名。 - neaumusicgit stash push [--] [<pathspec>...]
命令。请注意不改变原意,使语言更加通俗易懂。 - Ohad Schneider