你不能做一个只有部分变更集的拉取请求——变更集在 Mercurial 和 Git 中都是不可分离的。
您也不能在不拉动所有祖先的情况下推送或拉动(或请求拉动)变更集,因此即使提交两次不同的时间,每次使用不同的文件,如果您提交这些东西,也不会得到您想要的你不想在你做的事情之前推/拉/提交。
这就是为什么您需要使用功能分支将您的提交分成逻辑上不同的开发线。
如果上游仓库看起来像这样:
[A]---[B]---[C]---[D]
然后你克隆它,所以现在你有了这个:
[A]---[B]---[C]---[D]
然后你创建一个变更集,其中包含一些你想作为拉取请求提交的东西,而一些你不想提交的东西:
[A]---[B]---[C]---[D]---[E]
你不走运。你不能推动 E 的一部分而不推动它的全部。您需要将要推送到一个变更集 (F) 的内容和您不想(还?)想要推送(或请求拉入)另一个变更集 (E) 的内容分开:
[A]---[B]---[C]---[D]---[E]---[F]
您仍然不走运,因为您不能在不包括 E 的情况下推动(或请求拉动 F),因为 E 是 F 的祖先。
相反,您需要让您的 E 和 F 工作兄弟姐妹,而不是父母孩子。像这样:
[A]---[B]---[C]---[D]---[E]
\
--[F]
现在你可以在没有 E 的情况下将 F 推到你的分叉上,并且可以在他们甚至没有看到 E 的情况下请求拉入 F。
无论您使用 Mercurial,该分支命令看起来都不同:
hg clone THEIRS # now you have A through D
... work ...
hg commit # now you created E, which you don't want to push
hg update D # current directory no longer shows E
... work ...
hg commit # now you have F which is a child of D and a sibling of E
hg push -r . # send F (but not E)
或混帐:
git clone THEIRS # now you have A through D
git checkout -b feature_e
... work ...
git commit # now you have created E, which you don't want to push
git checkout master # current directory no longer shows E
git checkout -b feature_f
... work ...
git commit # now you have created F, which you do want to share
git push -u origin feature_f # send F but not E
现在你将在那里有一个只有 F 工作而不是 E 工作的分支,并且可以发出你想要的拉取请求。
TL;DR:当你在同一个提交或分支中混合了贡献和非贡献时,你就不走运了。您需要将它们分开或创建补丁并提交补丁而不是拉取请求。