TortoiseGit冲突解决实战上机练习讲义
一、练习目标
-
掌握TortoiseGit中冲突产生的场景(多分支并行修改同一文件同一位置);
-
熟练使用TortoiseGit图形化工具,完成冲突检测、冲突查看、冲突编辑、冲突提交的全流程;
-
能够区分"可自动合并"与"需手动解决"的冲突类型,规避合并过程中的代码丢失、错乱问题;
-
理解冲突解决的核心逻辑,能应对实际开发中的常见冲突场景。
二、前置准备
2.1 环境准备
-
安装TortoiseGit(版本2.13及以上,附带Git环境),确保右键能看到TortoiseGit菜单(Git Bash、Git Commit等);
-
准备一个本地Git仓库(可新建,也可克隆远程仓库;实操建议新建,避免影响现有项目);
-
文本编辑器(记事本、VS Code均可,用于编辑冲突代码)。
2.2 仓库初始化(实操步骤)
-
新建一个文件夹,命名为「TortoiseGit_Conflict_Practice」,作为本地仓库目录;
-
右键该文件夹,选择「Git Init Here」,初始化本地仓库(文件夹内会生成隐藏的.git目录);
-
在仓库目录下,新建一个文本文件「student.txt」,作为冲突练习的目标文件;
-
右键「student.txt」,选择「TortoiseGit → Add」,将文件添加到暂存区;
-
右键仓库空白处,选择「TortoiseGit → Commit → "master"」,填写提交信息(如"初始化student.txt"),点击「Commit」,完成首次提交(此时master分支有一个初始版本)。
三、冲突场景搭建(核心步骤,必做)
本次练习模拟「多分支并行开发,修改同一文件同一位置」的真实场景,分为3个角色(或3个操作步骤),分别在master分支、dev1分支、dev2分支修改文件,制造冲突。
步骤1:创建并切换到dev1分支
-
右键仓库空白处,选择「TortoiseGit → Switch/Checkout...」;
-
在弹出的窗口中,「Branch」选择「Create new branch」,分支名填写「dev1」,勾选「Working tree will be updated」,点击「OK」,完成分支创建并切换到dev1;
-
打开「student.txt」,编辑内容如下(重点修改第2行):
学号:2024001 ``姓名:张三 ``专业:计算机科学与技术 ``班级:计科2班 -
保存文件,右键仓库空白处,选择「TortoiseGit → Commit → "dev1"」,提交信息填写「dev1分支修改student.txt:添加张三信息」,点击「Commit」,完成dev1分支的提交。
步骤2:切换回master分支,创建并切换到dev2分支
-
右键仓库空白处,选择「TortoiseGit → Switch/Checkout...」,「Branch」选择「master」,点击「OK」,切换回master分支;
-
再次右键选择「Switch/Checkout...」,创建新分支「dev2」(操作同dev1),切换到dev2分支;
-
打开「student.txt」(此时master分支的初始内容,未包含dev1的修改),编辑内容如下(同样修改第2行,与dev1分支冲突):
学号:2024001 ``姓名:李四 ``专业:软件工程 ``班级:软工1班 -
保存文件,右键仓库空白处,选择「TortoiseGit → Commit → "dev2"」,提交信息填写「dev2分支修改student.txt:添加李四信息」,点击「Commit」,完成dev2分支的提交。
步骤3:制造冲突(合并dev1到dev2,触发冲突)
-
确保当前处于「dev2」分支(可通过右键「TortoiseGit → Branch」查看,当前分支前有"*"标记);
-
右键仓库空白处,选择「TortoiseGit → Merge...」;
-
在弹出的窗口中,「Merge from」选择「dev1」分支,其他默认,点击「OK」;
-
此时会弹出「冲突提示窗口」,提示「Conflicts found」(发现冲突),点击「OK」,进入冲突解决环节(核心实操)。
四、冲突解决实操步骤(重点,上机核心)
冲突产生后,TortoiseGit会标记冲突文件(文件图标会变成「红色感叹号」),本次冲突文件为「student.txt」,冲突位置为第2行(姓名字段),需手动编辑解决。
步骤1:查看冲突文件
-
右键冲突文件「student.txt」,选择「TortoiseGit → Edit Conflicts」,会自动打开文本编辑器(如VS Code),显示冲突内容;
-
冲突内容格式说明(TortoiseGit自动标记冲突区域):
学号:2024001<<<<<<< HEAD(当前分支dev2的内容)
姓名:李四
专业:软件工程
班级:软工1班
=======(冲突分隔线,上方是当前分支内容,下方是待合并分支dev1的内容)
姓名:张三
专业:计算机科学与技术
班级:计科2班dev1(待合并分支dev1的内容)
-
解读:当前分支(dev2)的第2-4行,与待合并分支(dev1)的第2-4行存在冲突,无法自动合并,需手动修改。
步骤2:编辑冲突,手动选择并解决(核心操作细节)
手动选择冲突的核心是:明确区分冲突标记对应的分支内容,根据需求选择保留某一分支内容、整合两者内容,或舍弃无用内容,全程需精准操作,避免代码丢失或错乱,具体操作细节如下:
-
第一步:明确冲突标记含义(关键前提) 打开冲突文件后,TortoiseGit自动生成的3类冲突标记,需精准区分,避免误删有用内容: -
<<<<<<< HEAD:标记当前所在分支(本次为dev2分支)的内容,即"本地分支"内容,是当前正在操作的分支版本; -=======:冲突分隔线,上方是当前分支(dev2)内容,下方是待合并分支(dev1)内容,用于区分两个分支的冲突部分; ->>>>>>> dev1:标记待合并分支(本次为dev1分支)的内容,即"待合并版本"内容,是需要合并到当前分支的版本。 这三类标记是Git识别冲突的关键,手动选择冲突后,必须彻底删除,否则提交会失败。 -
第二步:手动选择冲突内容(3种常见场景,贴合实操) 结合本次练习的冲突内容,手动选择冲突主要有3种方式,可根据实际开发需求选择,操作细节如下: 1. 只保留当前分支(dev2)内容:删除
=======及其下方所有内容(含>>>>>>> dev1标记),同时删除<<<<<<< HEAD标记,最终保留内容为:学号:2024001 ``姓名:李四 ``专业:软件工程 ``班级:软工1班; 2. 只保留待合并分支(dev1)内容:删除<<<<<<< HEAD及其下方所有内容(含=======分隔线),同时删除>>>>>>> dev1标记,最终保留内容为:学号:2024001 ``姓名:张三 ``专业:计算机科学与技术 ``班级:计科2班; 3. 整合两个分支内容(本次练习要求):保留两个分支的有效内容,删除冲突标记,对冲突部分进行整合,修改后内容如下(需确保无任何冲突标记):学号:2024001 ``姓名:张三、李四(合并冲突内容) ``专业:计算机科学与技术、软件工程 ``班级:计科2班、软工1班。 补充说明:手动选择时,需逐行核对冲突内容,若存在多处冲突(如多位置冲突练习),需逐个标记区域单独选择,不可遗漏任一冲突点,避免部分冲突未解决导致提交失败。 -
第三步:保存并确认选择结果 手动选择并编辑完成后,务必保存文件(快捷键Ctrl+S),关闭文本编辑器;此时可再次打开冲突文件,核对内容:确认无冲突标记、选择的内容完整、无多余空格或错乱代码,确保手动选择的冲突结果符合需求,避免因保存不及时或编辑失误导致操作无效。
-
根据实际需求,编辑冲突内容(删除冲突标记,保留需要的代码,或整合两者内容);
-
本次练习统一要求:保留两个分支的姓名信息,整合专业和班级,修改后内容如下(删除<<<<<<<、=======、>>>>>>>标记):
学号:2024001 ``姓名:张三、李四(合并冲突内容) ``专业:计算机科学与技术、软件工程 ``班级:计科2班、软工1班 -
保存文件,关闭文本编辑器。
步骤3:标记冲突已解决,提交合并结果
-
右键冲突文件「student.txt」,选择「TortoiseGit → Resolved」,标记该文件冲突已解决(文件图标会从「红色感叹号」变为「绿色对勾」);
-
右键仓库空白处,选择「TortoiseGit → Commit → "dev2"」,此时提交信息会自动填充「Merge branch 'dev1' into dev2」,可补充说明(如"解决dev1与dev2分支student.txt冲突");
-
点击「Commit」,完成冲突合并的提交;
-
验证结果:打开「student.txt」,确认内容为修改后的整合内容,同时右键「TortoiseGit → Log」,可查看合并记录(包含dev1和dev2的提交记录)。
五、拓展练习(可选,强化实战)
练习1:自动合并场景(无冲突)
-
切换到master分支,创建新分支「dev3」;
-
在dev3分支中,编辑「student.txt」,新增第5行(如"联系方式:13800138000"),提交修改;
-
切换回dev2分支,执行「Merge dev3」,观察TortoiseGit是否能自动合并(无冲突提示),提交合并结果后,查看文件是否新增了第5行。
练习2:多位置冲突解决
-
切换到master分支,创建「dev4」「dev5」两个分支;
-
在dev4分支中,修改「student.txt」的第1行(学号改为2024002)和第3行(专业改为物联网工程),提交;
-
在dev5分支中,修改「student.txt」的第1行(学号改为2024003)和第4行(班级改为物联1班),提交;
-
将dev4合并到dev5,解决两处冲突(学号、专业/班级),提交合并结果,验证修改是否正确。
六、注意事项(必看)
-
冲突解决前,务必备份冲突文件(或查看日志),避免误操作导致代码丢失;
-
编辑冲突时,必须删除TortoiseGit自动生成的冲突标记(<<<<<<<、=======、>>>>>>>),否则提交会失败;
-
合并完成后,务必验证文件内容,确认冲突已解决、代码无错乱,再提交;
-
若合并过程中误操作,可右键仓库空白处,选择「TortoiseGit → Abort Merge」,取消合并,恢复到合并前的状态;
-
实际开发中,冲突解决后,建议与相关开发人员确认修改内容,避免不符合业务需求。
七、练习总结
-
冲突产生的核心原因:多分支(或多人)修改了「同一文件的同一位置」,Git无法判断保留哪一份内容,需手动干预;
-
冲突解决的核心流程:触发冲突 → 查看冲突 → 编辑冲突 → 标记已解决 → 提交合并结果;
-
TortoiseGit的核心操作:Merge(合并分支)、Edit Conflicts(编辑冲突)、Resolved(标记冲突解决)、Abort Merge(取消合并)。
八、常见问题排查
-
问题1:合并时提示「No conflicts found」,但文件内容未更新?→ 检查当前分支是否正确,待合并分支是否有未提交的修改,需先提交分支修改再合并;
-
问题2:编辑冲突后,标记「Resolved」失败?→ 检查是否删除了所有冲突标记,文件是否保存成功;
-
问题3:提交合并结果时提示「nothing to commit」?→ 确认冲突已标记为Resolved,且文件有实际修改(未重复提交)。