彭某的技术折腾笔记

彭某的技术折腾笔记

Git 解决冲突

20
2023-07-29

Git 解决冲突

2023年7月29日

摘要

在使用 Git 进行开发的过程中,多个分支并行开发不同的 Feature 再进行合并或是多个开发者同时开发同一个项目都是非常常见的应用场景,在这个过程中,经常会遇到对同一个文件的不同更改,此时便需要解决冲突才能提交。本文将对 Git 的冲突解决进行大致的讲解。

症状

为什么会有冲突已经在摘要中进行了阐述,如果开发需求较为简单,则可能遇不到需要解决冲突的场景。得益于 Git 功能的强大,很多简单的冲突 Git 都可哟自动处理,只有较为有歧义的不同更改才会需要开发者手动处理。在合并分支或是和远程服务器进行数据交换时,如果出现类似以下的提示:

Auto-merging README.md
CONFLICT (add/add): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

则代表需要手动处理冲突。

解决方法

根据冲突的提示就能知道是哪些文件的更改遇到了冲突,但是有时会需要更加详细的说明信息才能更好的知道冲突的情况,此时便可以使用:

git status

进行详细信息的查看,得知哪些文件需要处理冲突,打开这些文件,可以看到文件中多了一些类似以下的内容:

<<<<<<< HEAD
Some Original Exsisted Contents
<<<<<<< HEAD
Something You Added that is Different from Existed Contents
>>>>>>> main

其中,<<<<<<< NAME======= 之间是产生冲突的分支中的原始内容,NAME 是分支名称,而 =======>>>>>>> main 之间是新增的内容。

看似好像在源文件中增加了这样一段提示文字会让人有点不知所措,其实解决冲突在 Git 的操作上十分简单(但是处理代码内逻辑不一定能简单到哪里去),只需要把这段标记内的冲突内容手动解决后,替换包括标记在内的一整段即可(一定移除 Git 生成的冲突提示,即 <<<<<<< HEAD, <<<<<<< HEAD>>>>>>> main)。

在保存文件后,将文件重新添加至暂存区:

git add FILE_NAME

依次解决所有冲突的文件,最后:

git commit -m "Some Commit Notes"

重新提交更改即可解决冲突

停止解决冲突

如果已经进入 merge 状态但是解决了一半不想解决了怎么办,Git 也提供了一个指令来关闭 merge 回到之前的状态,前提是处理的更改还没有 git add 进暂存区。直接使用以下命令即可关闭 merge:

git merge --abort

如果不幸已经 add 了,则只能先使用 git reset 或是 git restore命令来取消 add 才行,关于这两个命令的内容可以查看我的另一片文章。

建议

处理冲突这一件事有时真的挺麻烦的,如果项目较为复杂,建议使用专门的 Git GUI 工具来进行可视化的冲突合并,例如 JetBrains 全家桶自带的内部工具或是全平台通用的开源软件 Gittyup, Gnome 开发的全平台通用开源软件Gitg,或是 Mac 和 Windows 平台最为简单优美的免费软件 Sourcetree,这些工具都可以极大程度的方便 Git 的管理。

  • 0