如何仅合并一定修订后添加的更改(两种方式)?

时间:2015-08-14 08:42:14

标签: git merge branch git-merge

git merge可以忽略一些文件删除和两个分支之间的文件重命名,同时仅将后续更改合并到已重命名的文件中(并忽略对已删除文件的更改)一个分支),在两个分支之间来回?

因此,我希望能够在两个分支之间双向合并。 development分支最初是master分支的副本,但有大量删除和文件重命名。

最后一点是打破了我尝试的方法:

  • master,我做了merge -s ours development(没有更改文件)。
  • 同样在development上,我做了merge -s ours master(没有更改文件)。

我希望这会以某种方式定义一些起点,以便来自任何分支的任何后续git merge 仅应用自上述两个合并之后所做的更改。相反,合并导致分支变得相同(据我所见),而我需要保持development分支精简和干净(更少的文件,更好的文件位置)和master分支完成(所有文件,在适合部署的位置) - 同时能够导入所有更改(在初始删除和重命名之后)两种方式。这可以用git完成吗?

1 个答案:

答案 0 :(得分:8)

仔细阅读https://www.kernel.org/pub/software/scm/git/docs/git-merge.html上的文档:

在某种意义上,合并的主要思想是通过将since they diverged中的一个发生的更改合并到另一个分支中来实际尝试使当前分支与另一个分支或另一个分支中的特定提交相同另外,这正是你得到的行为。关键词是"分歧"。您可以指定要合并的提交,最多可以'但是不是提交,因为当你想要合并时,合并总是在历史记录中回溯到两个线程相同或者它们开头的那一刻,然后在合并目标上再次重放合并源中发生的更改。行为的这一部分(首先尝试为两个点找到共同的祖先并从该点重放更改)不能通过merge命令中的任何选项更改,没有合并策略可以更改它。 ours指示它忽略来自其他分支的更改,并且总是最终将当前分支的树作为最终结果。 recursive -Xours使其在冲突中合并并支持当前分支的版本,但两者首先返回公共点或合并源的历史开头。

我理解的是:你有一个项目,说一棵大树和很多文件。在开发功能时,您需要专注于要修改的文件,以便删除某些文件,重新排列它们以便于处理,处理它们,然后将更改集成到主分支中。这根本不是合并意图明显做的事情。该命令没有选项只是告诉它从特定的前点开始合并

但是,通过一小部分策略,您可以通过git format-patchgit apply / git am的组合实现预期的效果 首先,当分支相同时,在development中,删除所有不必要的文件但保留结构。开始处理您想要的文件。

当更改准备好进入高手时,让我们说你已经做了5次提交。执行类似的事情:

git format patch -5 --stdout > /some_folder/patchname.patch

现在您可以使用类似

之类的内容检出主人并应用您在/some_folder/patchname.patch中创建的补丁
git am --signoff < /some_folder/patchname.patch

首先,你可能想通过运行检查一切是否正常:

git apply --check /some_folder/patchname.patch

另一种方法是使用git cherry-pick(请参阅https://www.kernel.org/pub/software/scm/git/docs/git-cherry-pick.html)手动选择要在两个分支之间传输的提交。

希望这会有所帮助。