Git问题解决
使用 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 会自动在文件中标记出冲突的部分:
<<<<<<< HEAD
<main 的内容(ours)>
=======
<branch_B 的内容(theirs)>
>>>>>>> 提交ID及信息
使用 git checkout --conflict=diff3 <fileName> 通过选项 diff3 git 会用不同版本来标记冲突: 提供 ours 、 theirs 和 base 版本,通过设置 merge.conflictstyle 选项为 diff3 做为以后合并冲突的默认选项 : git config --global merge.conflictstyle diff3 , merge (默认选项)选项提供 ours 和 theirs 版本标记
<<<<<<< ours
<main 的内容(ours)>
||||||| base
<base(基) 的内容>
=======
<branch_B 的内容(theirs)>
>>>>>>> 提交ID及信息
冲突解决步骤
- 使用
oers或theirs选择要保留一方的提交,git将自动将保留修改 - 将修改后的文件添加
- 使用
--continue选项继续执行rebase合并 - 查看冲突状态
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