使用 ours 和 theirs 解决合并冲突
在使用 git 工程中,合并时产生冲突是很常见的,在使用 merge 和 rebase 合并时都会出现冲突情况,设计到很多文件,而冲突一般是只选择保留一方,这就可通过使用 ours 和 theirs 解决冲突。
merge 与 rebase 合并的区别
假设 main 主分支基础上生成了分支 branch_B 各自都有一些提交,现需要将 branch_B 合并到 main
执行 git merge branch_B main 后分支状态:
main —— A —— B ——- D (main)
\ /
\ branch_B —— C /
merge 会抽取两个分支上新增的提交,并将其合并在一起,产生一个新的提交D,生成的D节点有两个父节点,在合并的过程中可能会发生冲突
执行 git rebase branch_B main
main —— A —— B —— C’ —— D (main)
\ /
\ branch_B —— C /
rebase 会以branch_B为参照,提取 branch_B 分支上的提交,将这些修改作用在 main 分支上,最终结果不会产生新的提交节点。在将提取的修改作用在 main 的过程中可能会发生冲突
通常使用过程中最常用的是 rebase 。
rebase 冲突解决
产生冲突后 git 会自动在文件中标记出冲突的部分:
1 | <<<<<<< HEAD |
使用 git checkout --conflict=diff3 <fileName> 通过选项 diff3 git 会用不同版本来标记冲突: 提供 ours 、 theirs 和 base 版本,通过设置 merge.conflictstyle 选项为 diff3 做为以后合并冲突的默认选项 : git config --global merge.conflictstyle diff3 , merge (默认选项)选项提供 ours 和 theirs 版本标记
1 | <<<<<<< ours |
冲突解决步骤
- 使用
oers或theirs选择要保留一方的提交,git将自动将保留修改 - 将修改后的文件添加
- 使用
--continue选项继续执行rebase合并 - 查看冲突状态
1 | git checkout --ours <fileName> |
当出现多个文件存在冲突可使用脚本解决。
在解决冲突过程中,如果遇到某个提交记录不需要应用,可使用git rebase --skip 忽略,或使用 git rebase --abort 取消本次 rebase 。
git status 中文乱码
1 | git status |
解决方法:
1 | git config --global core.quotepath false |