git stash save -u and -p

6

我试图将一个提交分成五个提交。我的计划是使用git stash save -p并储藏除了我想要第一个提交之外的所有内容。然后提交更改,git stash apply,储藏除了我想要第二个提交之外的所有内容等等。然而,我的原始提交包含新添加的文件,似乎我不能同时使用-p选择我想要的内容并使用-u储藏未被跟踪的文件。

$ git stash save -u -p "take 4"
Can't use --patch and --include-untracked or --all at the same time

有没有一种方法可以做到这一点?
2个回答

3

这是一个使用git add -p的经典用例。

请按以下步骤操作:

  • 检出你想要拆分的提交。
  • git reset HEAD~。这将“撤消”提交,但不会丢失其更改。更改将在工作树中未暂存。
  • 重复5次:
    • git add -p(并添加你想要在此“阶段”中保存的更改)。当你来到你想让它们成为一部分的补丁时,你需要git add任何添加到原始提交中的文件。
    • 可选地,运行git diff --staged查看即将提交的内容和/或git diff查看你准备提交的内容。
    • git commit

这样将给你五个单独的提交。你也可以使用git add -i代替git add -p。这种用例不适用于git stash

这个方法利用了Git的“暂存区”(也称为“索引”)的特性。你有许多更改在你的工作副本中。你使用git add来“暂存”更改。然后git commit(不带-a标志)将仅提交已暂存的更改。


1

如前所述,git add -p 绝对是解决原始问题的方法。

关于次要问题:

无法同时使用 --patch 和 --include-untracked 或 --all

在我的情况下,我想包括一些未跟踪的文件,但是同时使用 --patch 来挑选一些被跟踪的东西来存储。让我们称这些的组合为 "diff A"。我所做的是先进行相反的设置:将不属于 diff A 的代码藏起来,这样就可以使用 git add the_untracked_file 然后 git stash push 将跟踪和未跟踪的内容都放入一个存储区。


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