Git:我如何按文件(不是通过提交)拆分分支?

时间:2018-02-28 16:50:24

标签: git branch git-branch git-merge pull-request

底线:

我想将拉取请求拆分为两个较小的拉取请求,这些拉取请求具有不同的文件子集。我不想通过提交拆分,我想按文件拆分。

详细信息:

假设我有一个分支branch_1(在master分支之外)我已经修改了2个文件:file_1file_2。假设这些文件在一个或多个提交中被一起修改(更改不能通过提交分离),并假设这些文件不以任何方式相互引用。

一段时间后,我想将branch_1合并到master,但决定只有file_1可以合并。我可能稍后合并file_2,所以我把它放在一个新的分支上。

所以我创建了branch_2 branch_1branch_2现在包含对file_1file_2的更改。没问题,因为branch_2无论如何都会在branch_1之后合并。

现在,我如何才能很好地还原branch_1以删除对file_2的更改?

如果我继续使用branch_1git checkout master file_2,它就有效,但是:当我将branch_1合并到master,然后master合并到{{} 1}},然后它将删除branch_2。这不是我想要的!

基本上我希望file_2上的file_2永远不存在。

3 个答案:

答案 0 :(得分:2)

一种选择特定文件的便捷方式:

  • branch_2创建master
  • 使用--no-commit和--squash将branch_1合并到branch_2
  • 还原要从新分支(*)中排除的特定文件
  • 提交branch_2中的剩余文件

现在,您可以通过反向文件选择再次重复该过程,立即将两个分支完全拆分,也可以等到branch_2合并成master然后合并master放入branch_1中,可以有效地“快速转发”所选文件并将其从原始branch_1中排除。

(*)许多基于UI的git客户端提供批量还原工具,使该过程相当舒适

编辑:添加了--squash选项,否则来自branch_1的提交可能会以仅包含其实际内容的一部分的master结尾

答案 1 :(得分:0)

而不是从branch_2提出branch_1。我将从branch_2分支发出master并进行更改,将其合并为主文件,然后将branch_2合并到branch_1

这基本上是git workflow(很好的阅读)

答案 2 :(得分:0)

因此,我得出的结论是git对此没有很好的机制,但是使用PyCharm(以及其他一些工具)很容易做到。

要使用pycharm进行此操作,首先git checkout master,然后git checkout branch_3,然后在Pycharm的“项目”工具栏中右键单击项目的根文件夹,然后转到Git -> Compare with Branch,选择{{1 }},然后将要合并的branch_1file_1复制到当前代码(branch_1)中。现在,您可以从branch_3branch_3进行拉取请求。