Bash 如何自动解决git rebase中的所有冲突;吉特加上;

Bash 如何自动解决git rebase中的所有冲突;吉特加上;,bash,git,rebase,git-rebase,git-add,Bash,Git,Rebase,Git Rebase,Git Add,我正在处理的项目是一个带有父模块和子模块的maven应用程序。对父模块的更改转到开发分支。每个子模块都有自己的分支,该分支在开发过程中被重定基础以继承这些更改 从现在开始,我正在尝试设置一个重基脚本。为此,我正试图找到一种方法,能够自动解决任何冲突,而不会中断。作为我测试的一部分,我通过始终默认为“他们的”更改,对开发中的一个测试分支进行了重定: git ls-files -z *_child | xargs -0 git update-index --skip-worktree #I do n

我正在处理的项目是一个带有父模块和子模块的maven应用程序。对父模块的更改转到开发分支。每个子模块都有自己的分支,该分支在开发过程中被重定基础以继承这些更改

从现在开始,我正在尝试设置一个重基脚本。为此,我正试图找到一种方法,能够自动解决任何冲突,而不会中断。作为我测试的一部分,我通过始终默认为“他们的”更改,对开发中的一个测试分支进行了重定:

git ls-files -z *_child | xargs -0 git update-index --skip-worktree #I do not want the child module to be touched

git rebase -X theirs development
然而,重新定基过程仍然被冲突打断,通常是因为几个月前已经解决的非常旧的承诺。要解决此问题,我使用:

git add .
git rebase --continue
这一直有效,直到我遇到另一个冲突。现在,我正在研究使用
git-rere
记录我采取的解决措施:

git config --local rerere.enabled true

然而,我仍在试图弄清楚这实际上是如何与重定基址一起工作的。您是否有任何建议,使用git-reere或其他git命令来解决此问题?理想情况下,我希望将
git add.
全部删除,并始终将默认冲突添加到“他们的”更改中。

重要的第一点:您的
git更新索引在这里不是很实用。如果基础合并操作需要触摸标记为
--skip worktree
的文件,则Rebase将需要触摸这些文件。如果没有,它就不会碰他们。在cherry pick操作期间,标记这些文件可能会导致一个有用的错误(我没有测试过,但您可以自己测试)


rebase是重复的
git cherry pick
(有时是等效的)。每个cherry pick都使用我喜欢称之为merge的合并过程作为动词,或者合并,正如您所看到的,合并可能会有合并冲突。
git cherry pick
与普通合并不同的两种方式是:

  • 合并基只是所选提交的父级
  • 最后将进行的提交是常规(非合并)提交
  • 启用
    rere
    将与任何其他
    git merge
    具有相同的效果,因为重复使用记录的分辨率的方式相同。它对您的案例没有帮助,因为您已经在使用
    -X-theres
    ,这可以避免
    重新出现
    可能解决的冲突

    合并过程中的冲突可能来自我所说的对整个文件树的高级操作,也可能来自低级合并工作。我使用这两个短语来区分Git合并引擎中的两个不同代码部分。实际上,合并通过运行两个
    git diff
    操作来工作:

    git diff --find-renames <base> <tip1>
    git diff --find-renames <base> <tip2>
    
    git diff--查找重命名
    git diff--查找重命名
    
    这些差异是git merge
    的内部差异,git merge编译了差异引擎,可以通过命令行传递各种难以实现的选项,但原理相同:

  • 重命名查找查看添加和/或删除的文件,并尝试将左侧(合并基侧)“已删除”文件与右侧“已添加”文件相匹配。如果是这样,Git将决定重命名此文件

  • 这样匹配文件名会产生标识映射:名为FB的基本文件的左侧有新名称FL,右侧有新名称FR。所有三个名称可能相等,或者两个或所有三个名称可能不同,但无论如何,这都是“同一”文件。它还为我们留下了在任意一侧添加和/或删除的文件,以及在一侧或两侧可能修改或不修改的文件

  • 现在我们必须结合所有的变化。。。但这首先发生在文件名和存在级别:

    • 如果左侧删除文件Fd,而右侧不更改它,则可以。但是,如果左侧删除它,右侧修改它,则会出现删除/修改冲突。(如果右侧删除它,而左侧修改它,则会产生相同的冲突,相反。)

    • 如果左侧重命名一个文件,而右侧将其删除(或在交换了边的情况下删除),则存在重命名/删除冲突

    • 如果双方从头开始添加一个新文件,但名称相同,则存在添加/添加冲突

    • 如果双方都重命名基本文件FB,但将其重命名为两个不同的名称*FL和FR,则存在重命名/重命名冲突


    Git本身无法解决这些冲突。这些是高层冲突

    在解决或不解决任何高级树操作后,我们现在遇到了这样的情况:相同的文件已从基本端传送到两个分支提示,使用“相同的文件”进行重命名,如上所述,但已被双方修改。Git现在从名为
    llmerge.c
    :低级合并代码的单独文件运行代码

    LLMerge允许用户定义合并驱动程序。使用这些文件时,整个操作由合并驱动程序完成,它只获取所有三个输入文件的数据(base、left/HEAD和right/theres)。使用内置合并驱动程序时,可以使用扩展选项
    -X
    自动解决冲突:
    -X他们的
    选择右侧更改,放弃左侧(底部对头部)更改<代码>-X我们的选择左侧更改。如果没有这些选项,Git只会在更改重叠或相邻时声明冲突

  • 由于您使用的是
    -X-theres
    ,因此会产生冲突,因此我们可以得出结论,您一定会遇到高级冲突。Git的Reerre代码不记录也不能重复使用这些分辨率

    要在合并因冲突而停止后发现这些文件,可以使用
    git status
    或使用
    git ls files--stage检查索引/暂存区域。不幸的是,Git在记录高级别冲突的实际内容方面做得很差(几乎不存在)。它打印了公司