Git:如何提出仅包含文件子集(不提交)的选择性拉取请求

Git: How to raise a selective Pull Request containing only subset of files (not commits)

在正常 gitflow 之后,我有一个 master 分支,我从中分叉了一个 feature 分支用于开发目的。在 feature 分支中,我做了很多更改(添加了新文件),现在需要合并回 master。请注意,feature 分支中的这些更改已经发生了数周,其中包含数百次提交。

但是,由于要求,我可以使用 文件子集 ,这些文件 edited/added 跨越多个提交。

问题是 - 如何提出从 featuremaster 的拉取请求,仅包含上述文件子集并忽略可能 added/edited 的任何其他文件?

请注意,不可能进行 GIT cherry pick 次提交,因为

  1. feature 分支中有数百个提交
  2. 这些提交中的任何一个都可以包含要合并回的文件以及不必合并回的文件。

谢谢

您想从 master 创建一个新的 feature2 并在其中仅包含您的 sub-set 个文件,从中创建 PR,对其进行测试和审查。

要从现有分支中的某些文件(不是提交)创建这样的分支:

git checkout -b feature2 master 
# optionally git rm any checked in files in master that shouldn't be there (were removed in feature)
git checkout feature -- <path> [ <path> ... ]
git commit

其中 <path>s 是您要包含的原始 feature 分支中文件子集的路径。

其他选项可能是 cherry-pick 但为此您需要确定这些文件添加到 feature 分支的提交,并且可能会执行 partial cherry-picks.

没有这样的事情。 Git 在 commit-by-commit 的基础上工作。如果您的提交不是您想要的,您必须进行新的、不同的提交。

通常,您可以这样做的方法是创建一个新分支,其当前提交与您喜欢的提交集的起点相同(例如,也是从 master) 的顶端开始,然后从特定提交中显式提取特定文件,如 中所示。注意这里不需要git commit -a。我个人认为使用 git commit -a 是一个坏习惯,因为它会在您创建 new 文件时给您带来麻烦。

(注意,顺便说一句,每个提交都包含 每个文件 ,或者更准确地说,每个文件 Git 在你或任何人知道的时候,进行了提交。它们以特殊的 read-only、Git-only、压缩和 de-duplicated 格式存储,因此 last 提交的事实feature 可能与 feature 中的数百个早期提交具有相同文件的相同副本,这意味着 de-duplication 已经保存了很多 space。)