Bash 如何自动解决git rebase中的所有冲突;吉特加上;
我正在处理的项目是一个带有父模块和子模块的maven应用程序。对父模块的更改转到开发分支。每个子模块都有自己的分支,该分支在开发过程中被重定基础以继承这些更改 从现在开始,我正在尝试设置一个重基脚本。为此,我正试图找到一种方法,能够自动解决任何冲突,而不会中断。作为我测试的一部分,我通过始终默认为“他们的”更改,对开发中的一个测试分支进行了重定: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
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编译了差异引擎,可以通过命令行传递各种难以实现的选项,但原理相同:
- 如果左侧删除文件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在记录高级别冲突的实际内容方面做得很差(几乎不存在)。它打印了公司