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