免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

05 — 分支与合并:怎么试新想法还不弄坏主线

05 — 分支与合并:怎么试新想法还不弄坏主线 05 — 分支与合并怎么试新想法还不弄坏主线写在前面这一章要解决什么写到一半想试个新写法又怕把能跑的版本改坏了——这就是分支要解决的问题。分支让你复制出一条「平行宇宙」在里头随便试主线不受影响。试成了再「合并」回去试不成直接扔掉。但合并时如果两边都改了同一处Git 不会瞎猜会停下来让你亲手决定——这就是「冲突」。本章带你第一次解决冲突。学完后你应该能用大白话解释分支是什么新建分支、切换分支、合并分支看懂git log --graph的分叉图解决一次文本冲突知道什么时候该用分支读者设定大一同学会基本工作流和撤销还没碰过团队协作。1. 定位为什么要单开一章讲分支1.1 一句话先记住分支 给某一次提交贴的张「便利贴」可以随便撕、随便贴。很多人以为分支是「复制整个项目文件夹」其实不是。分支就是一个名字比如feature/login指向某次提交。创建分支几乎不占空间。1.2 没有分支会怎样场景没有分支有分支想试新写法直接改主线改坏了难回开个分支试坏了直接删同时改两块功能互相覆盖各开一条分支想保留「能跑的版本」不敢动主线就是能跑的1.3 生活里的类比你已经会的分支对应影印一份草稿再乱改分支但 Git 更省空间「另存为」副本分支但 Git 共用未改的部分平行宇宙设定在另一条时间线改主线不动游戏存档点主线一个档试错一个档1.4 本章内容目标目标你能做到理解分支说清「分支是名字不是文件夹拷贝」操作建、切、并、删分支看图读懂git log --graph的分叉解决冲突处理一次标记心态敢试因为不怕改坏2. 本质分支到底是什么2.1 一张图先建立感觉图main和feature两条线从同一次提交分叉最后合并成一个双亲节点。2.2 用白话拆开提交是历史里的一个点像存档。分支是给某个提交贴的「名字标签」。HEAD是「你现在在哪条分支上」的指示牌。合并把两条分支的改动汇成一条历史。创建分支 贴一张新名字标签不复制文件。2.3 两种合并快进 vs 真合并情况结果一边没动过快进直接把分支指针挪过去不新建提交两边都改了真合并新建一个「合并提交」它有两个父提交2.4 冲突是什么如果两边改了同一个文件的同一处Git 没法自动决定要哪个就停下来让你选。文件里会出现标记图和之间是冲突的两份版本分隔。冲突不是报错是 Git 在说「这一处我帮你停下了你来定」。2.5 几条硬规矩规矩白话分支是名字不是文件夹拷贝创建几乎不占空间切换分支前最好工作区干净否则改动可能跟着飘过去合并冲突要手动解决Git 不会瞎猜删分支删的是名字提交可能还在别怕删错主线只合并「试成了」的分支保持主线稳定2.6 新手最常踩的坑坑表现办法一直在main上干活改坏了没退路先开分支再试切换时工作区脏改动飘过来或报错切换前status脏了就提交或藏起来冲突标记留在文件里提交了带标记的代码提交前搜索以为冲突是 Git 坏了慌着乱按冲突是正常的照着标记改就行3. 建议学习顺序建分支 → 切过去改 → 切回主线 → 合并先试快进→ 故意制造冲突 → 解决 → 删分支4. 动手准备mkdirlab-branchcdlab-branchgitinit-bmaingitconfig user.nameAda Examplegitconfig user.emailadaexample.comprintfbase\nf.txtgitaddf.txtgitcommit-minit: 基础版本5. 跟着做一次完整分支实验5.1 建分支并切过去gitbranch feature/hellogitswitch feature/hellogit branch 名字创建分支但不切过去git switch 名字切过去。也可以一步到位gitswitch-cfeature/hello-c是 create新建的意思。5.2 在分支上改printffeature line\nf.txtgitaddf.txtgitcommit-mfeat: 在分支上加一行5.3 切回主线也改一下gitswitch mainprintfmain line\nf.txtgitaddf.txtgitcommit-mfeat: 在主线加一行5.4 看分叉图gitlog--oneline--graph--all* 399c46d feat: 在主线加一行 | * 744af9b feat: 在分支上加一行 |/ * a1819a3 init: 基础版本怎么读这张图最下面a1819a3是共同起点往上分两条线主线加了一行、分支加了一行/和\表示分叉5.5 合并这次会冲突gitmerge feature/hello-m合并 feature 分支Auto-merging f.txt CONFLICT (content): Merge conflict in f.txt Automatic merge failed; fix conflicts and then commit the result.白话翻译两边都改了f.txtGit 自动合不了停下来等你定。5.6 看冲突文件catf.txtbase HEAD main line feature line feature/hello三段含义标记含义 HEAD当前分支main的版本开始分界线 feature/hello传入分支的版本结束5.7 解决冲突你要做的就一件事把文件改成你最终想要的样子然后删掉所有、、标记。比如两行都保留printfbase\nmain line\nfeature line\nf.txt然后告诉 Git「我改好了」gitaddf.txtgitcommit-m合并 feature/hello已解决冲突5.8 看合并后的图gitlog--oneline--graph--all* 511c441 合并 feature/hello已解决冲突 |\ | * 744af9b feat: 在分支上加一行 * | 399c46d feat: 在主线加一行 |/ * a1819a3 init: 基础版本怎么读最上面511c441是合并提交它有两条线汇入两个父提交所以前面有|\。5.9 删掉用完的分支gitbranch-dfeature/hello-d是 delete删除已合并的分支。没合并想强删用-D。图再看一遍——分叉、并行、合并成一个双亲节点。6. 命令按「用途」分组6.1 分支生命周期命令干什么git branch列出本地分支git branch 名字在当前提交创建分支git switch 名字切换到该分支git switch -c 名字新建并切换git branch -d 名字删除已合并分支git branch -D 名字强制删除6.2 合并命令干什么git merge 分支把该分支并入当前分支git merge --abort冲突中放弃合并回到合并前git log --oneline --graph --all看分叉图6.3 解决冲突命令干什么git status看哪些文件冲突手动编辑改成最终样子删标记git add 文件标记「这个我改好了」git commit完成合并提交7. 对照表降低记忆负担7.1 分支操作对照想干啥用什么看有哪些分支git branch建分支git branch 名字或git switch -c 名字切过去git switch 名字删已合并git branch -d 名字强删git branch -D 名字7.2 两种合并对照情况结果图上长啥样一边没动快进只挪指针一条直线两边都动真合并新建合并提交出现 7.3 冲突三段标记标记是谁的版本 HEAD到当前分支到 名字传入分支8. 安全习惯8.1 建议这样做习惯原因切换前git status避免改动飘走主线只合并试成了的分支保持主线能跑合并后删掉用完的分支减少噪音冲突解决后搜索标记别提交带标记的代码小步在分支上提交冲突面更小8.2 推荐工作流个人项目1. 在 main 上有个能跑的版本 2. git switch -c feature/新功能 3. 在分支上改、提交若干次 4. 切回 main 5. git merge feature/新功能 6. 有冲突就解决 7. 删掉分支git branch -d feature/新功能9. 真实场景9.1 课程大作业分功能做主线保持「能跑的演示版」开feature/登录页、feature/排行榜各自试试成一个合并一个9.2 想试个新写法怕改坏gitswitch-ctry/新算法# 随便改# 不行就 git switch main 回去删掉分支gitbranch-Dtry/新算法9.3 和同学协作之前各自在自己分支上改合并时如果冲突约好谁先合谁后合协作上传是后面远程章节9.4 不想合并只想看一眼分支gitswitch 别的分支# 看一眼gitswitch main切换分支会改你的工作区文件所以切换前最好干净。10. 稍微多懂一点点可选分支是个文件在.git/refs/heads/下存的就是一个提交哈希。合并提交有两个父提交所以图上是|\。快进合并不新建提交只是把指针挪过去。变基rebase是另一种合并思路进阶章再讲本章先会 merge。11. 小实验请一定动手实验甲快进合并建仓主线提交一次。建分支在分支提交一次。切回主线主线没动过合并。看图应该是一条直线没有|\。实验乙制造并解决冲突按本章第 5 节走一遍。故意让两边改同一行。合并、解决、提交。看图出现|\。实验丙放弃合并合并冲突后不解决直接git merge --abort。确认回到合并前状态。通过标准能独立制造并解决一次冲突不再害怕。12. 常见问题问 1分支占空间吗几乎不占。分支就是一个名字指向提交不复制文件。问 2我可以开很多分支吗可以。但用完就删免得乱。问 3冲突是 Git 坏了吗不是是正常的。两边改了同一处Git 让你定。问 4合并错了能退吗能。git reset --hard HEAD~1退一格小心会清工作区或git reset --mixed HEAD~1保留改动。问 5main和master有啥区别只是默认分支名不同。现代推荐main用git config --global init.defaultBranch main统一。问 6分支名怎么起好用feature/名字、fix/名字、try/名字这种前缀一眼知道是干嘛的。问 7合并一定要在main上吗不一定。也可以把main合并进feature。看你要什么效果。问 8冲突解决一半能停吗能git merge --abort放弃这次合并。13. 总结、学习路线与思维升华13.1 这一章请记住的点记住什么分支本质名字标签不是文件夹拷贝创建git switch -c 名字合并git merge 分支冲突标记手动改后addcommit看图git log --oneline --graph --all删分支git branch -d 名字下一章远程协作和别人的分支合并13.2 在整个系列中的位置01 认识 Git 02 三区模型 03 基本工作流 04 安全地撤销 05 分支与合并 ← 当前 06 远程协作 ……13.3 思维升华分支是「敢试」的底气。主线永远留着能跑的版本新想法开个分支试成了合并不成扔掉。冲突不是 Git 坏了是它在请你做决定。13.4 参考资料Pro Git 中文版 — 分支简介Pro Git 中文版 — 分支的新建与合并git branch 说明git switch 说明git merge 说明本仓库图示署名assets/diagrams/ATTRIBUTION.md命令输出样例验证环境Git 2.43.0演示作者信息为虚构Ada Example adaexample.com。13.5 本章检查清单能说清「分支是名字标签不是拷贝文件夹」会用git switch -c新建并切换会用git merge合并读懂git log --graph的分叉独立解决过一次冲突提交前会搜索标记用完分支会删敢试是分支给你的底气。下一章我们把分支带到「远程」——和同学的分支合并。
返回列表