Git基础08 — 合并后的冲突

说明

在采用 merge 方式合并时,不是任何时候都会合并成功,有时会在合并时产生冲突。我们来看如何解决这种合并冲突的问题。

有这样的一个场景:

开发一个项目,大家都是团队协作一起开发。某天,开发人员 A 和测试人员 B 都 clone 了远程代码库,开发人员 A 首先追加了某个文件最后一行的内容,且推送到了远程代码库成功。此时测试人员 B 也编辑这个文件,也在该文件的末尾追加了一行,push 推到远程代码库直接报错。尝试 pull 与本地的仓库进行合并,发现是 control.txt 在相同的行数大家内容不一致。一般这种情况下都需要和其他人协商,以谁的修改内容为准,修改后重新 commitpush 即可。这种 git 合并冲突在项目中非常常见,当然也与项目负责人的协调性有关系,他是不是将各个模块的开发人员的工作分配到位,否则冲突都需要去协商解决。

如下图所示:

本地仓库模拟合并冲突

步骤一:在 master 分支的最新提交记录上新创建一个分支

PS > cd E:\git-test\

PS > git branch
* master

PS > ls

    Directory: E:\git-test

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           2025/3/15    10:55             36 control.txt
-a---            2025/3/9    21:31             39 lab-file.txt
-a---           2025/3/12    17:08             11 start.log
-a---            2025/3/9    21:31             12 Tmp-File.txt

PS > git log --oneline
6f4b5d9 (HEAD -> master) 对文件control.txt的第三行进行追加
33fca75 新增文件control.txt
4be932e newb1分支中的第一个新文件
8a77771 修改后的lab-file文件
f20abbc lab-file初始内容
47d9368 tmp-file.txt --> Tmp-File.txt
ae6cc9d First commit
9a70355 测试文件

PS > git switch -c features
Switched to a new branch 'features'

步骤二:在 features 分支下新增文件 error.log

PS > new-Item error.log

# `n 在 PowerShell 中表示换行
PS > echo "1111`nERROR`n3333" > error.log

PS > cat .\error.log
1111
ERROR
3333

PS > git add ./

PS > git commit -m "新增三行内容到新文件 error.log"

步骤三:在 master 分支下新增同名的 error.log 文件且第二行文件内容不一样

PS > git switch master

PS > new-Item error.log

PS > echo "1111`nNAME`n3333" > error.log

PS > cat .\error.log
1111
NAME
3333

PS > git add ./

PS > git commit -m "新文件 error.log"

步骤四:将 features 分支合并到 master 分支,出现合并冲突

PS > git switch master

PS > git merge features
Auto-merging error.log
CONFLICT (add/add): Merge conflict in error.log
Automatic merge failed; fix conflicts and then commit the result.

PS > cat .\error.log
1111
<<<<<<< HEAD
NAME
=======
ERROR
>>>>>>> features
3333

如文件所示的那样,会用 "=======" 分割两个分支的内容,其中 "<<<<<<<" 表示当前分支下的文件修改,">>>>>>>" 表示其他分支修改的内容,由于出现了合并冲突,Git 不知道以谁为准,需要人为解决冲突的内容。

步骤五:解决合并冲突

假设我是项目负责人,觉得两个分支下对该文件的修改都是合理的,所以我将保留两个分支下的修改:

# 用编辑器修改文件内容,其内容如下:
PS > cat .\error.log
1111
NAME
ERROR
3333

PS > git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
        both added:      error.log

no changes added to commit (use "git add" and/or "git commit -a")

# 重新提交一次
PS > git add ./
PS > git commit -m "人为解决 error.log 的合并冲突"
PS > git status
On branch master
nothing to commit, working tree clean

PS > ls

    Directory: E:\git-test

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           2025/3/15    10:55             36 control.txt
-a---           2025/3/15    11:22             25 error.log
-a---            2025/3/9    21:31             39 lab-file.txt
-a---           2025/3/12    17:08             11 start.log
-a---            2025/3/9    21:31             12 Tmp-File.txt

PS > cat .\error.log
1111
NAME
ERROR
3333

步骤六:删除已经合并到上游的分支

PS > git branch -d features

PS > git branch
* master
Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇