【git】git冲突解决详解

  • Post author:
  • Post category:其他

git merge时,不免产生各种各样的冲突,可是我们连如何选择版本都晕半天,这里进行详细解答。

本文参考
git merge冲突解决,该文章描述了更多冲突情况,但需要一定git基础,而本文仔细到每一步操作,
适合新手

案例:我们的远程仓库上有main和master两个分支,我们想将master合并到main上,然后删除master,但是两边都存在README.MD,我们想保留master分支那个

方法1:pull下来然后修改冲突文件

创建并进入工作目录
初始化

$ git init   #初始化本地仓库

将一个远程仓库添加到本地的仓库当中

$ git remote add origin https://gitee.com/用户个性地址/xxx.git   #之后origin相当于这个url的“别名”,可以用origin来代替整个url

把main分支添加进来,git pull 命令基本上就是 git fetch 和 git merge 命令的组合体,Git 从指定的远程仓库中抓取内容,然后马上尝试将其合并进你所在的分支中

git pull origin main

如果两个分支毫无渊源,要加上后面的–allow-unrelated-histories,否则合并时报错

git pull origin master --allow-unrelated-histories

此时已经进入MERGING状态,查看冲突文件

git status

也可以采用命令:git ls-files -s,查看冲突文件该命令输出的第二列的值如果为0表示对应的文件没有冲突,合并成功,如果不为0,则表示产生了合并的冲突,其中具体的值对应的意义是:1表示两个用户之前一个共同版本的对应文件内容;2表示当前用户对应的文件版本;3表示合并后的文件对应的远程版本
在这里插入图片描述
然后使用git mergetool命令或git show :n:filename(n替换为上述数字)查看对应文件的对应版本的内容
在这里插入图片描述

比较各版本,用vscode打开冲突文件,上方会弹出选择版本的选项,选择需要保留的版本

冲突解决,添加已经解决冲突的文件

git add -A   #添加全部文件

再次git status查看状态,全部都changes to be committed即可提交

git commit -m "提交信息"

push回远程仓库的main分支

git push -u origin main:main  #意思是推送本地的main到远程的main,同名情况可以省略":main"

最后删除远程仓库中多余的master分支

git push origin --delete master

方法2: cherry-pick然后checkout

在本地main分支下执行

git cherry-pick master

git status获取当前信息

git status

显示:
Not currently on any branch.
You are currently cherry-picking commit 53e5374.
  (fix conflicts and run "git cherry-pick --continue")
  (use "git cherry-pick --abort" to cancel the cherry-pick operation)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
 	both modified: file1.txt

继续

git cherry-pick --continue

提示README.MD有更新,确定替换为远程仓库master的文件,因此这里用theirs(反之则用ours)

git checkout --theirs README.MD

然后添加到本地仓库

git add -A

最后继续cherry-pick

git cherry-pick --continue

版权声明:本文为m0_51371693原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。