什么';在git中合并严重分歧的分支(包括重命名和移动的文件)有什么好策略?

什么';在git中合并严重分歧的分支(包括重命名和移动的文件)有什么好策略?,git,merge,version-control,Git,Merge,Version Control,我有一个git项目,有两个分支,我想合并成一个新的分支。这两个分支在拆分后都包含很多更改: 一个分支主要添加许多新文件并修改现有文件,另一个分支主要删除许多文件,重命名和移动现有文件,并广泛重构其内容 我对高级合并不是很有经验,当我尝试合并时,git没有识别文件重命名/移动,而是列出了已删除/创建的文件。此外,在许多相互冲突的行中,更改发生在许多提交中,因此我常常无法理解更改并找到相关部分 在两个分支(包括重命名/移动的文件)之间进行许多更改的情况下,是否有一个好的合并策略? 谢谢大家! 不幸的

我有一个git项目,有两个分支,我想合并成一个新的分支。这两个分支在拆分后都包含很多更改:

一个分支主要添加许多新文件并修改现有文件,另一个分支主要删除许多文件,重命名和移动现有文件,并广泛重构其内容

我对高级合并不是很有经验,当我尝试合并时,git没有识别文件重命名/移动,而是列出了已删除/创建的文件。此外,在许多相互冲突的行中,更改发生在许多提交中,因此我常常无法理解更改并找到相关部分

在两个分支(包括重命名/移动的文件)之间进行许多更改的情况下,是否有一个好的合并策略?


谢谢大家!

不幸的是,你要经历一段漫长的奋斗

首先,有点澄清

git不跟踪文件移动,而是检测它们

它通过对照已添加的文件检查已删除文件的内容来确定文件是否已移动。这种检查是有限度的,很容易漏掉。帮助git理解正在发生的事情的最好方法是在提交中移动文件而不进行更改,然后在单独的提交中进行更改。因为听上去你有一系列的变化,而你没有这样做,你很可能不得不接受它

使用两个分支机构时

定期将提交给您不处理的分支的更改重新设置基址(或者合并,如果必须的话,但我将从这里开始介绍重新设置基址)到您自己的分支中是很重要的,因此它是另一个分支中更改的最新版本

通常,有一个
master
分支和一个
wip
分支(进行中的工作,或任何你称之为的东西)。
master
上的更改将定期重设为
wip
,完成
wip
后,将更改重设为“master”

这样树枝就不会漂得太远

你需要做什么

根据你的描述,树枝被允许漂得太远而不舒服。要解决这个问题,只需遍历一个分支的提交,并将它们重新定基到另一个分支。这可以手动完成,或者
git-rebase-interactive
将引导您完成,每次提交一次,直到完成

如果您不熟悉
git-rebase
,我建议您仔细阅读它,因为它擅长处理这样的问题

我不推荐这样做,但这可以通过
git merge
来处理——但它不会为您执行提交,并且尝试一次处理所有更改可能会很痛苦(如您所述)。如果要将分支合并为多个部分,则必须单独处理每个提交,或者(如果可能)将它们分组在一起——但是分组可能需要对提交中的内容有深入的了解

参考资料


不幸的是,你要经历一段漫长的奋斗

首先,有点澄清

git不跟踪文件移动,而是检测它们

它通过对照已添加的文件检查已删除文件的内容来确定文件是否已移动。这种检查是有限度的,很容易漏掉。帮助git理解正在发生的事情的最好方法是在提交中移动文件而不进行更改,然后在单独的提交中进行更改。因为听上去你有一系列的变化,而你没有这样做,你很可能不得不接受它

使用两个分支机构时

定期将提交给您不处理的分支的更改重新设置基址(或者合并,如果必须的话,但我将从这里开始介绍重新设置基址)到您自己的分支中是很重要的,因此它是另一个分支中更改的最新版本

通常,有一个
master
分支和一个
wip
分支(进行中的工作,或任何你称之为的东西)。
master
上的更改将定期重设为
wip
,完成
wip
后,将更改重设为“master”

这样树枝就不会漂得太远

你需要做什么

根据你的描述,树枝被允许漂得太远而不舒服。要解决这个问题,只需遍历一个分支的提交,并将它们重新定基到另一个分支。这可以手动完成,或者
git-rebase-interactive
将引导您完成,每次提交一次,直到完成

如果您不熟悉
git-rebase
,我建议您仔细阅读它,因为它擅长处理这样的问题

我不推荐这样做,但这可以通过
git merge
来处理——但它不会为您执行提交,并且尝试一次处理所有更改可能会很痛苦(如您所述)。如果要将分支合并为多个部分,则必须单独处理每个提交,或者(如果可能)将它们分组在一起——但是分组可能需要对提交中的内容有深入的了解

参考资料


假设对两个分支所做的更改如下:

  • master
    :添加许多新文件并修改现有文件
  • 开发
    :删除许多文件,重命名和移动现有文件,并广泛重构其内容
为了自动解决合并冲突并保留重命名的文件,可以通过以下命令合并两个分支:

git checkout develop
git merge master -X theirs
然后这些文件
git add .
git commit