前言
在使用 Git 进行代码管理时,合并分支是常见的操作之一。然而,在合并过程中可能会遇到冲突问题,尤其是在多人协作开发的场景下。本文将详细介绍如何解决 Git 合并冲突,并结合实际案例分析 git status
的输出含义。
背景
在一次项目开发中,我需要将远程的 master
分支合并到本地的 chenjj
分支上。在执行 git merge origin/master
时,遇到了文件冲突问题。以下是具体的操作步骤和解决方案。
问题描述
在执行以下命令时:git merge origin/master
这条命令的含义是将远程仓库 origin
的 master
分支的更改合并到当前分支中
git merge origin/master
终端输出了多个文件的冲突信息,包括普通文件(如 .js
、.vue
、.json
)和二进制文件(如 .woff2
、.woff
、.ttf
)。最终,git status
显示所有冲突已解决,但没有明确指出普通文件的冲突情况。
解决步骤
Git 合并代码的基本流程
1.切换到目标分支
使用 git checkout <target-branch>
切换到需要合并代码的目标分支。例如:
# 切换到目标分支(Chnejj)git checkout Chnejj
2.执行合并操作
使用 git merge <source-branch>
将源分支的更改合并到目标分支。例如:
# 合并 Chnejj 分支到 master分支git master Chnejj
3.查看当前分支状态
运行以下命令查看当前分支的状态:
git status
输出示例:
92391@DESKTOP-NSDKPQ6 MINGW64 ~/Desktop/app/likeban-applet2 (chenjj|MERGING)
$ git status
On branch chenjj
Your branch and 'origin/chenjj' have diverged,
and have 5 and 20 different commits each, respectively.(use "git pull" to merge the remote branch into yours)You have unmerged paths.(fix conflicts and run "git commit")(use "git merge --abort" to abort the merge)Changes to be committed:modified: common/auth.jsmodified: common/router.jsmodified: common/scanAndQ.jsnew file: components/news-components/news-ad.vuemodified: env_dev.jsmodified: env_prod.jsmodified: pages.jsonmodified: pages/app/index.vuemodified: pages/city/login/index.vuemodified: pages/city/login/login.vuemodified: pages/city/reveal/revealPage.vuemodified: pages/customerService/index.vuemodified: pages/governmentAffairs/hotwireFeedback/index.vuemodified: pages/gxbcyjs/jkzyjs/index.vuemodified: pages/gxbcyjs/yczyjs/index.vuemodified: pages/home/homeBusiness.vuemodified: pages/home/homePage.vuemodified: pages/home/subsistencePayment.vuemodified: pages/newsBusiness/index.vuemodified: pages/payment/heatingGs/history.vuenew file: pages/skipPage/Carousel.vuemodified: pages/skipPage/car.vuenew file: pages/skipPage/pay.vuemodified: pages/venueReservation/components/appointmentDetial.vuemodified: pages/venueReservation/components/bookingDetial.vuenew file: pages/venueReservation/components/notice.vuenew file: pages/venueReservation/feedback.vuemodified: pages/venueReservation/index.vuemodified: pages/venueReservation/my.vuemodified: pages/wuye/WuyeMain.vuemodified: pages/wuye/districtReport/districtReport.vuemodified: store/index.jsUnmerged paths:(use "git add <file>..." to mark resolution)both modified: static/iconfont/iconfont.cssboth modified: static/iconfont/iconfont.ttfboth modified: static/iconfont/iconfont.woffboth modified: static/iconfont/iconfont.woff2
-
解释:
- 当前分支
chenjj
和远程分支origin/chenjj
已经分叉。 - 所有冲突已经解决,但合并尚未完成。
- 列出了即将提交的更改文件。
- 当前分支
4.开始关键性的解决冲突
-
解决二进制文件冲突:
- 保留本地版本:
git checkout --ours -- <文件路径>
- 保留远程版本:
git checkout --theirs -- <文件路径>
- 保留本地版本:
#保留本地文件的指令 (我选择是保留本地的文件)git checkout --ours -- static/iconfont/iconfont.woff2
git checkout --ours -- static/iconfont/iconfont.woff
git checkout --ours -- static/iconfont/iconfont.ttf
git checkout --ours -- static/iconfont/iconfont.css# 保留远程的指令git checkout --theirs -- static/iconfont/iconfont.woff2
git checkout --theirs -- static/iconfont/iconfont.woff
git checkout --theirs -- static/iconfont/iconfont.ttf
git checkout --theirs -- static/iconfont/iconfont.css# 选择完成之后还需要对刚才保留下来的文件进行提交git add static/iconfont/iconfont.woff2
git add static/iconfont/iconfont.woff
git add static/iconfont/iconfont.ttf
git add static/iconfont/iconfont.css
解决冲突的指令:
提交保留下来的文件的指令:
此时我们已经解决完成了冲突,但是我们还是再写入查看当前分支状态的指令,再次确定一下所有的冲突都解决完成了
$ git status
此时输入指令之后,提示信息中没有冲突的提示了,这就证明了我们已经解决了所有的冲突
5. 理解为什么没有显示普通文件的冲突
-
冲突已经解决:
- 在之前的合并过程中,Git 提示了一些普通文件存在内容冲突(如
common/auth.js
、pages.json
等)。 - 我手动编辑了这些文件,删除了冲突标记(
<<<<<<< HEAD
、=======
、>>>>>>> origin/master
),并保留了需要的内容。 - 使用
git add <文件路径>
标记这些文件为已解决。
- 在之前的合并过程中,Git 提示了一些普通文件存在内容冲突(如
-
当前状态是“所有冲突已解决”:
git status
显示All conflicts fixed but you are still merging.
,说明冲突已经解决。- 普通文件现在属于“Changes to be committed”,不会再显示为冲突文件。
-
验证是否还有未解决的冲突
为了确保没有遗漏的冲突,可以运行以下命令:
-
检查是否有未解决的冲突文件:
git diff --name-only --diff-filter=U
执行的 git diff --name-only --diff-filter=U
命令用于列出所有未解决的合并冲突文件。--name-only
参数表示只显示文件名,不显示具体的差异内容,而 --diff-filter=U
参数表示只显示那些存在未解决冲突(Unmerged)的文件。
该命令的输出结果是空的、没有输出任何文件名,这意味着在执行该命令时,已经没有未解决的冲突文件了,或者您可能需要先运行 git add
命令将解决冲突后的文件标记为已解决。
6. 完成合并
在确认所有冲突都已经解决后,运行以下命令完成合并
$ git commit -m "解决合并冲突"
7. 推送更改到远程
完成合并后,将本地分支推送到远程:
$ git push origin chenjj:chenjj
如果远程分支已经有新的提交记录,而你的本地分支没有包含这些记录,Git 可能会拒绝推送。此时需要先拉取远程分支的更改并解决冲突:
git pull origin chenjj