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

问题描述

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

但是,由于要求,我被允许采用文件子集,这些子集已在多个提交中进行了编辑/添加

问题是-我该如何从featuremaster发出仅包含上述文件子集的拉取请求,而忽略可能已添加/编辑的任何其他文件

请注意,无法进行提交的GIT cherry pick,因为

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

谢谢

解决方法

您想从feature2创建一个新的master,并仅在其中包含文件的子集,从中创建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>是您要包括的原始feature分支中文件子集的路径。

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

,

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

通常,执行此操作的方法是创建一个新分支,该分支的当前提交与您喜欢的一组提交的起点相同(例如,也从master的提示,然后从特定提交中显式提取特定文件,如blami's answer中所示。请注意,您在这里不需要git commit -a。我个人认为使用git commit -a是个坏习惯,因为在创建 new 文件时,这会给您带来麻烦。

(顺便说一下,请注意,每个提交都包含每个文件,或更准确地说,是您或任何人进行提交时Git知道的每个文件。这些文件都存储在一个特殊的,只读的,仅Git的,压缩和重复数据删除格式,因此feature中的 last 提交可能与数百个以前的文件具有相同的副本。在feature中提交意味着重复数据删除节省了大量空间。)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...