Git 实战指南:从分支管理到冲突解决
本文介绍了Git分支管理的核心流程与冲突解决技巧。主要内容包括:1) 分支创建与流转,展示了从main分支到功能分支的衍生关系;2) 远程推送的多种场景及指令解析;3) 重点讲解了合并冲突的处理方法,包括冲突识别、手动编辑和最终提交的完整流程。文章还提供了开发建议,如保持main分支清洁、定期同步等实用技巧。通过清晰的流程图和命令示例,帮助开发者掌握Git协作的关键操作。
Git 实战指南:从分支管理到冲突解决
在项目的开发、测试时,高效的分支管理策略能让代码结构更清晰。本文总结了 Git 分支操作的核心逻辑与常见工作流。
一、 分支的创建与流转
Git 的分支本质上是一个指向提交记录的可移动指针。你可以基于任何现有分支创建新分支。
1. 核心流程图
- 初始化/克隆:本地默认生成
main分支。 - 创建功能分支:基于
main创建clean-main,作为干净的开发基准。 - 多级开发:基于
clean-main创建new-feature。此时,new-feature继承了clean-main的所有代码。
2. 常用指令
- 创建并切换:
git checkout -b <新分支名> - 切换分支:
git checkout <分支名> - 基于特定分支创建:确保你当前在“基准分支”上,再执行创建指令。
二、 远程推送(git push)详解
推送代码时,你需要明确“推送到哪(远程仓库别名)”以及“推送什么(本地与远程的对应关系)”。
| 指令示例 | 含义解析 | 适用场景 |
|---|---|---|
git push origin main |
将本地 main 推送到远程 origin 的 main。 |
最常用的同步方式。 |
git push my_origin clean-main:main |
将本地 clean-main 推送到远程 my_origin 的 main 分支。 |
跨分支推送,或本地命名与远程不一致时使用。 |
知识点:
origin或my_origin只是远程仓库地址的代号(别名)。你可以通过git remote -v查看它们具体指向哪个 URL。
三、 合并与冲突解决
当开发完成后,需要将功能分支(如 new-branch-name)合并回主分支(main)。
1. 合并操作步骤
- 回到目标分支:
git checkout main - 执行合并:
git merge new-branch-name
2. 什么是合并冲突(Conflict)?
冲突发生在多个分支对同一个文件的同一部分进行了不同的修改。Git 无法自动判断哪个版本是正确的,需要人工介入。
当你执行 git merge 发现冲突时,合并并不会直接“终止”或“失败”,它会进入一种**“中间状态”**,也就是直接进入了这个页面
2.1. 执行合并时会发生什么?
当你输入 git merge test 且存在冲突时,终端不会弹出图形化的选择框,而是会直接在命令行显示如下信息:
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
关键点:
- 不会直接退出:Git 已经帮你合并了那些没有冲突的文件,只有冲突的文件被停在了那里。
- 不会自动选择:Git 不敢替你决定保留
main还是new-branch-name的代码,它把决定权交给了你。 - 分支状态变化:你会发现你的终端提示符变了,通常会显示类似
(main|merging),提醒你正处于合并中的状态。
2.2. 什么时候执行 git status?
答案是:看到上面的冲突提示后,立刻执行。
执行 git status 后,你会看到类似这样的输出:
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 modified: index.html
这会清晰地告诉你,到底哪几个文件出了问题(即 both modified 的文件)。
2.3. 如何“选择”保留哪份代码?
Git 不会给你弹窗让你点选,它会直接修改你的源代码文件。
当你打开 index.html 时,你会发现代码变成了这样:
- 手动选择:你需要删掉所有的
<<<<====>>>>标记。 - 决定内容:
- 如果你想要
main的,就删掉new-branch-name的部分。 - 如果你想要
new-branch-name的,就删掉main的部分。 - 如果你觉得两个都要,就重新排列它们。
测试案例中冲突解决如下:
2.4. 解决冲突后的关键步骤
解决冲突不是选完就结束了,你必须走完“三部曲”来告诉 Git 合并完成了:
- 保存文件:在编辑器里改好并保存。
- 标记解决:执行
git add index.html。这步非常重要,它告诉 Git:“这个文件的冲突我已经搞定了”。 - 完成提交:执行
git commit。此时会弹出一个默认的提交信息(类似 “Merge branch…”),直接保存退出即可。
总结流程图
| 动作 | Git 的状态 | 你的任务 |
|---|---|---|
git merge |
发现冲突,停止自动合并 | 查看报错信息 |
git status |
列出所有冲突文件 | 确认需要手动修改的文件清单 |
| 手动编辑 | 文件中出现 <<<< 标记 |
删掉标记,合并代码,保存 |
git add |
冲突标记消失,进入暂存区 | 告诉 Git 该文件已解决 |
git commit |
产生一个新的“合并提交” | 结束合并状态,回到正常开发 |
小贴士:
如果你改乱了,想撤销这次合并回到合并前的样子,可以随时执行:git merge --abort
这会像时光机一样,让你回到执行 merge 命令之前的状态。
3. 冲突解决流程
- 定位文件:使用
git status查看处于both modified状态的文件。 - 手动编辑:打开文件,寻找冲突标记:
<<<<<<< HEAD:当前分支(如main)的代码。=======:分割线。>>>>>>> branch_name:要合并进来的代码。
- 保存并提交:
- 删除标记,保留最终想要的代码。
- 执行
git add <文件名>标记解决。 - 执行
git commit完成合并。
四、 开发进阶小贴士
- 保持 Main 干净:不要直接在
main上写代码,所有新功能都应在独立分支开发。 - 选择性合并:如果你只想合并某个特定的提交,而不是整个分支,可以使用
git cherry-pick <commit-id>。 - 定期同步:在自己的分支开发时,定期执行
git merge main(或git pull origin main),可以提前解决冲突,避免最后合并时压力过大。
更多推荐


所有评论(0)