gpt4 book ai didi

git - 如何仅 merge 在特定修订后添加的更改(双向)?

转载 作者:IT王子 更新时间:2023-10-29 00:54:55 26 4
gpt4 key购买 nike

git merge 能否主要忽略两个分支之间的一些文件删除和文件重命名,同时仅 merge 对重命名文件的后续更改(并忽略对文件的更改在一个分支中被删除),在两个分支之间来回?

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

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

  • master 上,我做了一个merge -s ours development(没有文件改变)。
  • 开发类似,我做了merge -s ours master(没有更改文件)。

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

最佳答案

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

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

我的理解是:你有一个项目,比如一棵大树和很多文件。在开发功能时,您希望专注于那些您将要修改的文件,因此您删除了一些文件,重新排列它们以便于处理,处理它们,然后希望将更改集成到 master 分支中。这显然不是 merge 的目的。命令没有选项只是告诉它从特定点向前开始 merge

但是,您可以通过组合使用 git format-patchgit apply/git am 来稍微改变一下策略来达到预期的效果首先,当分支相同时,在development中,删除所有不需要的文件但保留结构。开始处理您想要的文件。

当更改准备好提交给 master 时,假设您到那时已经提交了 5 次。执行类似的东西:

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

现在您可以 check out master 并使用类似

的方式应用您在/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 )手动选择要在两个分支之间传输的提交。

希望这对您有所帮助。

关于git - 如何仅 merge 在特定修订后添加的更改(双向)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32005846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com