Git问题解决

使用 ourstheirs 解决合并冲突

在使用 git 工程中,合并时产生冲突是很常见的,在使用 mergerebase 合并时都会出现冲突情况,设计到很多文件,而冲突一般是只选择保留一方,这就可通过使用 ourstheirs 解决冲突。

mergerebase 合并的区别

假设 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 会自动在文件中标记出冲突的部分:

<<<<<<< HEAD
<main 的内容(ours)>
=======
<branch_B 的内容(theirs)>
>>>>>>> 提交ID及信息

使用 git checkout --conflict=diff3 <fileName> 通过选项 diff3 git 会用不同版本来标记冲突: 提供 ourstheirsbase 版本,通过设置 merge.conflictstyle 选项为 diff3 做为以后合并冲突的默认选项 : git config --global merge.conflictstyle diff3 , merge (默认选项)选项提供 ourstheirs 版本标记

<<<<<<< ours
<main 的内容(ours)>
||||||| base
<base(基) 的内容>
=======
<branch_B 的内容(theirs)>
>>>>>>> 提交ID及信息

冲突解决步骤

git checkout --ours <fileName>
git add <fileName>
git rebase --continue
git status

当出现多个文件存在冲突可使用脚本解决。
在解决冲突过程中,如果遇到某个提交记录不需要应用,可使用git rebase --skip 忽略,或使用 git rebase --abort 取消本次 rebase 。

git status 中文乱码

git status
....
"38\344\270\273\347\233\256\345\275\225\344\270\213\346\226\207\344\273\266\345\244\271\350\257\264\346\230\216"
....

解决方法:

git config --global core.quotepath false