Git储藏可用于打补丁,包括未跟踪的文件。

18

如何使用 Git stash 命令将未被跟踪的文件暂存,将其推送到补丁并在另一台计算机上还原。

git stash save -u feature
git stash show -p > patch
git apply patch

但是路径下没有未被跟踪的文件


你可以尝试使用 git stash show -p stash@{0} > patch 命令来创建补丁文件。 - donut
@donut:这并没有帮助;git stash show 只是将工作树提交与其父提交进行比较。 - torek
1个回答

23

一个普通的 git stash 创建了一个stash bag,其中包含两个提交:索引和工作树。

使用 -u-a(或它们的其他拼写方式)创建了一个three-commit stash bag。第三个提交仅包含未跟踪的 (-u) 或未跟踪和被忽略/“全部”(-a) 的文件,即省略了所有已跟踪的文件。

如果你需要以补丁形式进行,请使用以下技巧创建两个补丁:

  • 已跟踪文件的更改:git stash show -p(目前的内容),再加上
  • 第三个提交的全部内容作为一个补丁。

获取第二个项目的最简单方法是使用git diff将第三次提交与空树进行比较。Git 在每个存储库中始终有一个ID为魔术数字4b825dc642cb6eb9a060e54bf8d69288fbee4904的空树。因此,该树与stash^3之间的差异将包含一系列添加未跟踪文件的git补丁:

git diff 4b825dc642cb6eb9a060e54bf8d69288fbee4904 stash^3

你可以将这两个补丁简单地合并成一个:
git stash show -p > patch
git diff 4b825dc642cb6eb9a060e54bf8d69288fbee4904 stash^3 >> patch

(请参考上面的链接,以避免在空树中硬编码魔数。如果您只想查看u提交,请使用git show:例如git show stash^3。)

我执行了以下命令: git stash save --all 但是当我执行 git diff stash^3 时,终端显示:zsh: no matches found: stash^3如果我理解正确的话,我需要执行以下三个步骤? git stash save --all git stash show -p > patch git diff 4b825dc642cb6eb9a060e54bf8d69288fbee4904 stash^3 >> patch - ButuzGOL
zsh 正试图自行处理 ^3,而不是将其传递给 git。您必须使用反斜杠或引号来保护 ^,例如,使用 'stash^3' 而不是仅使用 stash^3。(不同的 shell 具有不同的特殊字符,sh 和 bash 不需要此操作。) - torek
谢谢,我刚刚转到了zsh。所以,在执行git diff 4b825dc642cb6eb9a060e54bf8d69288fbee4904 stash^3 >> patch之后,我得到了一个补丁文件,但它也包含了.gitignore中忽略的文件? - ButuzGOL
1
如果你记不住sha,就把它写在一张索引卡上,在每晚入睡前喃喃自语。 - xdhmoore
1
为了仅从特定目录树中获取文件/路径并将其直接传递到git applygit diff 4b825dc642cb6eb9a060e54bf8d69288fbee4904 stash^3 [<path spec>] | git apply - - AndOs
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接