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

Eri*_*got 11 git merge branch git-merge

git merge大多数情况下可以忽略两个分支之间的文件删除和文件重命名,同时仅对两个分支之间来回重命名的文件(并忽略对一个分支中删除的文件的更改)进行后续更改?

因此,我希望能够在两个分支之间合并两种方式的更改.该development分支最初是分支的副本master,但具有大量删除和文件重命名.

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

  • master,我做了一个merge -s ours development(没有文件更改).
  • 同样地development,我做了merge -s ours master(没有文件改变).

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

小智 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
Run Code Online (Sandbox Code Playgroud)

现在您可以使用类似的东西签出master并应用您在/some_folder/patchname.patch中创建的补丁

git am --signoff < /some_folder/patchname.patch
Run Code Online (Sandbox Code Playgroud)

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

git apply --check /some_folder/patchname.patch
Run Code Online (Sandbox Code Playgroud)

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

希望这有助于任何方式.