1. 分支不是文件夹:先建立正确的操作心智
绝大多数人对 Git 分支的误解,都始于把它当成"文件夹的复制"。我刚开始接触 Git 时也是这样——以为创建分支就是把代码复制一份,然后在副本上改,改完再合并回去。这个理解不能说是错的,但它会带来两个非常麻烦的后果:一是你会在"切换分支和保存进度"之间反复犯迷糊,二是你会对 Git 偶尔出现的"诡异行为"感到完全无法理解。
分支的本质其实是一条可移动的指针,它指向某一次提交。当你执行git branch feature-login时,Git 做的只是创建一个新的指针,指向当前所在的提交。真正"复制"出来的代码工作区内容,在你git checkout/git switch切换过去之前,根本不会有任何变化。这也是为什么创建分支是瞬间完成、完全不占空间的根本原因。
理解了指针这个模型,一个常见困惑就迎刃而解了:为什么在分支 A 上修改了文件,切到分支 B 后改动"不见了"?不是因为你的代码丢了,而是每个分支的指针指向不同的提交,工作区的内容会跟着指针走。你之所以经常在切换分支后找不到刚才的修改,多半是忘记提交了,或者压根没意识到"未提交的改动会跟随工作区,而不是跟随分支"。
另一个需要纠正的直觉是"分支的最终归宿一定是合并"。在实际开发中,很多分支生命周期很短,合并完删掉很正常,但也有不少分支是用来做实验、验证想法、跑数据任务的,跑完直接弃用或删除,并不存在合并的必要。把分支当成一种"低成本的工作上下文切换机制",比当成"必须合流的支流"更符合真实使用场景。
记住一句话:分支是便宜的、临时的、可丢弃的,而提交记录才是你真正需要小心维护的资产。带着这个心智再往下看任何命令,都会顺手很多。
还有一个常用的速查概念:HEAD指向你当前所在的分支。git branch会在当前分支名前加一个星号,git status也会在第一行告诉你处于哪个分支。几乎所有分支相关操作的前提都是"明确自己现在在哪",所以我把"先确认位置"列成了一条铁律,后面会反复提到。
2. 本地分支的创建、切换与提交:高频操作的完整套路
本地分支操作是每天使用频率最高的场景。我不打算列一个完整的命令大全,而是给出一套我自己验证过、在团队协作里也不会出错的组合拳。
2.1 创建与切换的姿势选择
创建分支有两种常见姿势:
# 姿势一:创建后仍停留在当前分支 git branch feature/payment # 姿势二:创建并立即切换过去 git checkout -b feature/payment # 或者新版命令 git switch -c feature/payment大多数时候我应该用姿势二。因为单独执行git branch feature/payment而不切过去,唯一的用途是"我想记下当前这个提交点,但还不想离开现在的工作现场"。这种需求确实存在,比如你正在一个分支上改到一半,突然需要回头验证另一个路径,但你并不想提交当前改动——此时记一个分支指针是最优雅的。
git switch是 Git 2.23 之后引入的新命令,和git checkout在分支切换这件事上是等价的。习惯上我现在全面转向switch系列,因为checkout的职责太杂了(既能切分支,又能恢复文件),新手很容易被绕晕。switch只干一件事,心智负担小很多。
创建分支时还有一个容易忽略的起点问题:新分支默认从当前 HEAD 处拉出来,如果你想从某个历史提交、某个远程分支或某个 tag 拉分支,就需要显式指定起点:
git checkout -b hotfix/urgent-bug origin/main git branch debug/test-scenario 3f2e1a5第一种写法是从远程 main 分支的状态拉一个修复分支,适合线上出 bug 需要立刻基于最新主干开修的场景;第二种写法是从指定提交哈希拉一个调试分支,适合回溯历史版本做验证。
2.2 切完分支先处理一个动作:同步上游信息
如果你是从远程仓库协作的,切换一个刚拉取下来的远程分支时,可能遇到git switch直接失败的情况,提示让你指定--track。比较省心的做法是直接带上启动跟踪参数:
git switch -c feature/login --track origin/feature/login这样本地分支和远程分支之间的关联就建立起来了,之后的git push/git pull都能省去指定远程分支的麻烦。对于经常忘记这一步的人,可以设置全局默认行为,让git push直接推送到同名的远程分支:
git config --global push.default current git config --global --get-regexp branch\..*\.remote2.3 分支上做提交的正确节奏
分支内提交代码的标准流程没问题,但我特别想强调一个很多人不习惯的动作:提交前先用git diff检查,提交后立刻用git log -1确认。
git diff # 检查未暂存改动 git add . git commit -m "feat: 完成支付网关接入" git log -1 --stat # 确认刚提交的内容确实是自己想要的这组动作看起来啰嗦,却能挡掉相当大比例的"把密钥提交上去了""把临时调试代码一起提交了""提交信息写错分支了"之类的低级事故。尤其是git diff,在可视化工具里虽然也能看,但命令行里扫一眼新增的行数和文件列表,比想象中更能帮你建立对本次改动的整体感知。
2.4 忘了切分支就改了代码?用 stash 兜底
每个用 Git 的人都会遇到这么一刻:在 develop 分支上改了半个小时的代码,突然发现这里应该开新分支改。直接切分支会报错,因为工作区有未提交的改动。此时标准解法是用git stash:
git stash push -m "登录功能改造未完成" # 或者简写 git stash git checkout -b feature/login git stash popstash相当于把工作区的改动打包存到一边,分支切换干净了,再弹出恢复。我有一个常用的微习惯:git stash pop之后立刻执行git status和git diff --stat,确认改动确实回来了,并且没有因为补丁冲突而悄悄丢失部分内容。
如果你同时改了好几个文件,但只想把其中一部分带走,用git stash push -- <路径>可以指定文件入栈,这样比全部打包更适合精细化处理。需要注意 stash 是全局的,不区分分支,默认弹出的是最近一次,所以养成带描述信息的好习惯非常重要。
3. 合并与变基:两种整合思路的取舍逻辑
分支建好、代码写完,接下来必然是整合。Git 里整合分支的主流方式就两条路:git merge和git rebase。网上吵这两个谁优谁劣的文章多得能出书,但真正在项目里做决定时,只需要搞清楚两件事:提交历史是是"如实记录"还是"整理叙事",团队成员是否共享同一个分支。
3.1 git merge:保留真实的汇合点
git merge的逻辑是在当前分支上新生成一个合并提交,把目标分支的历史完整接进来。它尊重开发过程的时间线,你什么时候开的特性分支、中途同步过几次主干、最终何时合入,全部清清楚楚。
git checkout main git pull origin main git merge feature/payment执行合并前,我总会先做两个动作:先切到目标分支并拉取最新代码,再在合并分支上执行一遍测试。很多人在合并时遇到大量冲突,本质原因是长时间没同步主干,两边文件差距过大。把"合并前先同步目标分支"养成肌肉记忆后,冲突概率会下降一大截。
合并之后还有个动作容易被忽略——善用--no-ff。默认情况下,如果一个分支领先目标分支若干个提交,且没有分叉,Git 会执行快进合并(fast-forward),直接把目标分支指针挪过去,不产生额外提交。这样历史是线性的,很干净,但代价是丢失了"这是一个完整功能合入"的边界信息。团队追求可回滚粒度时,我会约定合并到 main 分支一律用--no-ff:
git merge --no-ff feature/payment它强制生成一个合并提交,这个提交就是你回滚整个功能的锚点。这个约定在项目发布策略里非常实用,推荐采用。
3.2 git rebase:把你的工作重放到最新基线上
rebase的语义是:把你当前分支上的提交一个个摘下来,以目标分支的最新状态为新的基底,依次重新落下去。结果是历史完全线性的,仿佛你的特性分支就是在最新主干的基础上开发的一样。
git fetch origin git rebase origin/mainrebase 最典型的投放场景是自己的特性分支——你想把主干上的最新改动同步到自己还没合并的分支里,同时保持这条分支的提交历史干净。交出去的 PR / MR 里,诊断信息、代码风格、提交粒度都是你精心整理过的,这就是 rebase 的主场。
不过凡事有利有弊,rebase 最大的禁忌是:绝不 rebase 那些已经推送到远端、并且被别人拉取过的分支。因为 rebase 会重新生成提交哈希,其他人基于旧哈希的工作会在下一次同步时产生意想不到的重复提交和冲突。说严重点,这属于团队协作事故,不在技术讨论范围内。
3.3 冲突处理的完整链路:从定位到解决
不管哪种方式,只要两边改过同一个文件,冲突就会出现。遇到冲突不要慌,不要一上来就想着"暴力解决",我一般按下面这套链路走:
- 用
git status看冲突文件清单,记住"Unmerged paths"区块下列出的才是真正需要处理的。 - 打开冲突文件,搜索
<<<<<<<、=======、>>>>>>>这些标记。它们分别表示当前分支的内容、分隔线、被并入分支的内容。 - 根据业务语义决定保留哪边、合并哪边、还是两边都改。不要机械地"全删掉"。
- 改完后,用
git add将文件标记为已解决。 - 如果是 merge 冲突,最后执行
git commit生成提交;如果是 rebase 冲突,解决后执行git rebase --continue继续,直到所有提交都重放完成。
我见过太多人在冲突处理时只盯着代码文本,完全不看上下文。但实际上大部分冲突的根因不是"两边改得不可调和",而是"两边改了相邻区域各自的结构调整",这时候你需要同时理解两边的意图,才能做出正确的合并结果。所以冲突其实是一个难得的理解他人代码的机会,处理多了,你对团队代码演进的敏感度会明显提升。
如果真的改糊涂了,git merge --abort和git rebase --abort是后悔药,可以让你退回冲突之前的状态。这两个命令我一直建议团队里的新人务必背下来,它存在的意义不是鼓励放弃,而是告诉你可以毫无心理负担地尝试。
3.4 只想要部分功能?cherry-pick 是精准手术刀
有时候你不需要把一个分支整体合并进来,只需要其中某几个提交。这种场景在支持多版本并行、热修复挑选需求时特别常见。git cherry-pick就是干这个的:
git cherry-pick a1b2c3d git cherry-pick e4f5g6h 7a8b9c0这条命令会把指定提交的改动作为新的提交应用到当前分支上。它和 merge 的本质区别是:merge 是把一段历史接过来,cherry-pick 是只搬运具体的改动内容。
用 cherry-pick 时有个最常见的坑——先把基础分支切到目标分支上,再执行 cherry-pick。我有一次想从特性分支上摘一个提交到主干,结果人还站在特性分支上就直接执行了,改动就这么不声不响地落在了特性分支自己头上,浪费了半天排查。
还有一种场景值得单独说:你想把 A 分支的某个"功能"搬过来,但这个功能分散在好几个提交里,甚至中间还夹杂着无关改动。这种情况直接用git cherry-pick A..B按范围搬,或者看提交粒度太碎,就先对该功能做一次git rebase -i把提交整理合并成一个,再 cherry-pick 过去。操作虽繁,但胜在结果干净。
4. 分支清理与误删恢复:每个人都该会的善后操作
分支用得越勤,仓库里堆积的废弃分支就越多。定期清理分支不只是为了让git branch输出好看,更是为了减少切换时的心智干扰——一长串几十个分支列在那里,光看名字就很难判断哪个是活的、哪个是试完不要的。
4.1 本地分支的删除与安全保护
删除本地分支的命令很简单:
git branch -d feature/old-function注意我用的是小写-d,它带有一个内置保护:只有该分支的提交已经被合并到当前分支或上下游时,才会允许删除。如果 Git 检测到分支里还有未合并的提交,它会拒绝执行并提示你。这时候如果你确认这些提交确实不要了,才用大写-D强制删除:
git branch -D feature/abandoned-experiment我给自己定的一条规矩是:-D只用于"我连 diff 都不想再看一眼"的分支。凡是还有一丁点可能要用回来的代码,我都会先打个 tag 或者把分支名字记下来再删。因为-d能保护你,而-D是无情的。
4.2 远程分支的删除与追踪分支清理
远程分支的删除稍微不同,需要用到 push 操作:
git push origin --delete feature/merged-work这条命令执行后,远端仓库的该分支会被移除。本地虽然删除不了远端,但本地还保留着对该分支的追踪记录,特别是那些"别人已经删掉、但本地还残留"的远程分支信息,需要通过git remote prune origin或者直接执行git fetch --prune来清理。很多人在git branch -a里看到一堆奇怪的远程分支残留,多半就是这个原因。
顺便提醒一句,远程仓库里删掉的分支,相关 PR / MR 往往也会随之关闭或标记为已合并,这属于平台行为,各平台略有差异,但大方向是"删分支该合并的先合并,该验证的先验证,别随手乱删"。
4.3 误删分支后的黄金五分钟
删除之后立刻发现自己还有提交被一起删了,这种事故在团队里真的发生过。好消息是所幸 Git 的回收机制非常友好,被删除分支所指向的提交,只要还没有被垃圾回收(git gc/ 长时间未使用),就仍然存在于对象库里,只是没有引用指向它。
恢复的办法很简单:
git reflogreflog会列出 HEAD 的历史移动记录,每一行都包含一个提交哈希。你只需要找到删除分支前最后一次"切换到那个分支"的记录(信息里通常能看到分支名和操作行为),拿到那个哈希,然后从它重新拉回分支:
git checkout -b feature/recovered 3f2e1a5如果 reflog 记录也过期了,还有一个办法是通过git fsck --lost-found找出所有未被引用的悬空提交,然后逐个检查。这个操作要花点时间,但比 reflog 记得更深一层。
我个人建议团队每个人都把git reflog这个命令刻在脑子里。它就像一个时光机,绝大多数"好像丢了东西"的场景,都靠它救回来过不止一次。
4.4 合理的事项清理:大批量删除时的小技巧
批量清理分支时,一个个敲删除命令太慢了。比较实用的做法是先用管道把要删的分支列表过滤出来,再批量执行:
git branch --merged | grep -v "main\|develop" | xargs git branch -d这条命令的意思是:把所有已经被合并到当前分支的分支列出来,排除掉主干和开发分支,逐条执行安全删除。写之前一定先不要带xargs,单独跑一遍第一段,看清楚列表里都是谁再动手。批量操作的共同铁律就是"先预览,后执行"。
5. 多分支并行开发:从原理到 IDE 集成的实战细节
热词里频繁出现的几个场景——"idea 切换分支""tortoisegit 切换分支""vscode 同项目多分支同时开发"——本质上都是在问同一件事:多分支并行开发时,怎么在工具层面做得顺手又不会搞乱。
5.1 并行工作区的两种策略
并行开发的第一个问题是物理层面的:同一份代码,我要同时维护两个不同版本的改动,应该怎么办?
方案一:串行切换。在同一份本地目录里,用git switch在不同分支之间来回切换。优点是简单、只占一份磁盘空间;缺点也很明显,每次切换都要处理一个心智切换的成本,而且如果有未提交改动,切换是会被拒绝的。
方案二:多个工作目录。这是进阶玩法,直接在文件系统层面克隆多份仓库,每份目录 checkout 一个独立分支。比如同时维护feature-a和feature-b两份代码,各自独立跑测试、独立改代码,只在需要时拉取最新主干。git worktree命令就是为这个场景设计的:
git worktree add ../project-feature-a feature-a git worktree add ../project-feature-b feature-bworktree的强大之处在于,它允许同一个仓库同时被多个工作目录关联,每个目录都可以独立切换分支、提交代码,完全互不干扰。这个功能在需要同时验证两个不兼容的改动、或前端需要分别调试多版本场景时,简直救命。我自己的经验是,一旦用过 worktree,几乎就不太愿意回到"串行切换"的老路上去了。
5.2 IDE 里切换分支前的三秒检查
不管用什么 IDE,切换分支这个动作在所有图形工具里都对应同一个底层操作: checkout / switch。IDE 的图形按钮只是把命令包了一层,底层的规则没有任何变化。所以最重要的不是记住按钮在哪,而是记住切分支前先确认三件事:
- 当前分支有没有未提交的改动?有的话先 commit、stash、或选择带回(IDE 通常会给选项)。
- 当前分支有没有未推送的提交?切走后这些提交还在,不会丢,但容易忘记。
- 目标分支是否存在?远程分支需要先 fetch,否则本地列表里看不到。
IntelliJ IDEA 里切换分支的位置在右下角的 Git 分支小图标,点开后你能看到本地分支列表和远程分支列表。远程分支单独显示在 Remote Branches 目录下,双击可以直接切换,IDEA 会自动帮你创建对应的追踪本地分支。TortoiseGit 在 Windows 资源管理器里右键就能看到 Switch/Checkout 菜单,弹出的对话框里可以选分支,也可以选择远程分支并自动建立本地追踪关系。VS Code 左下角的源控制面板点击分支名称就能切换,也可以用快捷键Ctrl+Shift+P输入 "Git: Checkout to..." 快速操作。工具虽然不同,底层逻辑完全一致。
5.3 同项目多分支同时开发的真实场景拆解
前端同学在 VS Code 里同项目多分支同时开发的典型操作流是这样的:起一个主工作目录,跑着 main 分支的开发服务器;再起一个 worktree 目录,跑着 feature 分支的验证环境。两份代码独立监听不同端口,互不影响。这种方式比"在一个目录里来回 switch"更适合被反复打断的日常开发节奏。
这个流程里有一个容易踩坑的地方是node_modules。worktree 创建的目录不会自动复制依赖包,切换过去之后要先执行一次依赖安装。如果你同时维护两个分支且依赖差异较大,可以只给其中一个目录安装依赖,另一个用与仓库无关的构建缓存来处理。这个属于工程化细节,团队内部可以约定统一口径。
5.4 可视化工具的隐藏能力:比较、合并与历史追溯
IDE 里最有价值的往往不是切换分支的按钮,而是分支的对比和合并操作。IDEA 在 Git 面板里选中两个分支,右键选择 Compare,会清晰列出所有差异文件列表,逐文件 diff 非常高效。合并时 IDEA 会弹出三路合并窗口,左边当前分支、右边引入分支、中间结果区,冲突块高亮展示,解决起来比命令行直观不少。
但我也要泼一盆冷水:IDE 的三路合并虽然方便,它不会替你判断业务意图。很多合并错误正是因为在图形界面里"看着很快、点得很快",却没有仔细理解每一块冲突为何存在。所以我的建议是:可视化工具适合查看和初步解决,涉及复杂逻辑的冲突,把它们从窗口里拽到编辑器里,上下文完整了再动手。
6. amend、reflog 与疑难现象:提升分支操作段位的几个深水区
到了这个阶段,分支的日常操作你已经很顺了。但实战中总有一些"看起来不对、又说不清为什么"的疑难现象,以及一些能大幅提升效率的进阶命令。这一节专门聊这些。
6.1 git commit --amend 的正确用法
git commit --amend的作用是修改上一次提交,它最原汁原味的应用场景是:提交完发现漏了一个文件、或者提交信息里写错字了,不想为此多产生一条"fix typo"之类的冗余提交。
git add forgotten-file.txt git commit --amend --no-edit--no-edit表示沿用原提交信息,如果你只是想补充提交内容,这个参数能省掉打开编辑器的麻烦。但这里有个非常重要的警告:amend 会改写提交哈希。如果你此前已经把这次提交推送到了远端,再 amend 之后直接git push会被拒绝,因为历史不一致了。解决方法是强制推送git push --force-with-lease,但强制推送本身就意味着你正在改写远端历史,除非是自己在独立的分支上操作,否则不建议在共享分支上乱用。
6.2 "fatal: not a git repository" 现象排查
这个报错几乎每个 Git 新手都见过,提示信息直译是"这不是一个 git 仓库(或者其任意父目录都不是)"。它出现的原因基本就两类:一是在仓库外目录执行了 git 命令;二是仓库的.git目录出了问题。
排查思路很直接:先执行pwd看当前路径,再用ls -la确认目录里是否有.git文件或.git目录。如果仓库本身没问题,通常只是终端当前目录不对,切换到仓库根目录再执行就行。如果.git确实丢失(比如误删或复制项目时漏了),就需要从远端重新克隆,或者把本地代码保存到临时目录后重新关联远端,这个操作不在文章范围内,但记住一点:.git是整个版本历史的载体,丢了就真的丢了历史,只能从远端拉取恢复。
6.3 为什么改完代码切分支总是被拒绝?
这个问题本质上就是"未提交改动与切换目标分支之间存在冲突"。可以这样理解:当前工作区里的改动还没落地,而这些改动所基于的位置和目标分支的位置可能不一致,Git 无法保证切过去之后改动还能干净地保留。此时 Git 会锁定切换操作,强迫你先处理掉工作区状态。
处理方式上面已经提过:commit 或 stash。这里我补充一个技巧:如果只是临时想去别的分支看个东西,用git stash最轻量;如果你想把这些改动完整保留在当前分支上,可以用git commit -m "wip"再切走——我管这个叫"临时落地",虽然提交信息很丑,但至少改动有了明确的归属。回来之后再soft reset或者 amend 整理都来得及。
6.4 分支名和文件同名时的 switch 歧义
有一个很少人注意、但碰到就会卡住的场景:当你执行git checkout feature时,如果当前目录里恰好有一个叫feature的文件或文件夹,Git 会把它理解成"恢复这个文件",而不是"切换到这个分支",于是你会得到奇怪的报错或行为。解决方法是强制指定切换分支语义:
git checkout feature --branch feature git switch feature # switch 不存在这种歧义这也是我为什么一直推荐用git switch代替git checkout的原因之一,底层行为做了语义分离,能避开好几种历史遗留的歧义。
6.5 大文件导致 clone 卡住?认识 git lfs 场景
热词里出现了好多次 git lfs,大文件场景在分支操作里确实会带来具体可感知的干扰:clone 卡住、切换分支时卡住、合并时卡住。本质原因是 Git 的 diff 机制对待大二进制文件非常不友好,哪怕一个 50MB 的模型文件只改了一个字节,整个文件都会被重新纳入计算。git lfs 的思路是把大文件的实际内容存到远端单独存储,仓库里只保留一个指针引用,这样 clone 时仓库主体轻快很多,按需拉取大文件。
分支操作里与 LFS 相关的常见困惑是 clone 卡住 / 切换分支时明明只改了一行却要拉几百 MB 的 LFS 对象。这类问题通常不是命令层面能解决的,而是仓库结构和缓存策略层面的。一个可以立刻尝试的补救是清理未使用的 LFS 缓存,以及检查是否设置了lfs.fetchexclude排除规则。这里顺便回应热词里出现过的git config --global --unset lfs.fetchexclude——它就是一条移除 LFS 排除规则的命令,如果你之前设置了排除某些目录的 LFS 拉取,现在想恢复完整拉取,这条命令正好对症。用得不多,但见过它说明你已经在 lfs 配置这个深水区门口了。
6.6 SSH 认证失败与分支操作的关系
ssh 认证失败 git在热词里也出现了。分支操作本身不认识 SSH,但 fetch / push 阶段如果触发默认的 SSH 认证,就有可能出现报错。最常见的处理是重新配置密钥并注册到远端平台,或者测试连通性:
ssh -T git@gitee.com如果认证失败,优先检查密钥路径、是否把公钥添加到远端平台账户、以及~/.ssh/config的配置是否正确。这里不展开安全细节,但可以告诉你一个经验:如果你换过电脑、重装过系统,90% 的 SSH 认证失败都是因为本机密钥没有重新配置,而不是远端问题。
7. 关于分支工作流的最后几条实战建议
写了这么多,终归还是要把分支这件事落回到日常开发流程里。以下几条建议是我在几个团队里推行过、并且反复验证有用的一些规则,供参考。
第一,分支命名要一眼看懂生命周期。比如feature/前缀表示新功能,bugfix/表示修复,hotfix/表示紧急修复,release/表示发布准备,chore/表示维护性工作。命名统一后,无论是自己翻历史还是别人接手项目,信息获取成本都会大幅降低。这个成本每天都在发生,累积起来很可观。
第二,主干分支养成"合并前拉取、合并后验证"的习惯。拉取是为了确保基线最新,验证是为了确保合并没有引入回归。这两个动作单看很小,但它们能把"冲突地狱"和"上线即事故"这两大问题挡在门外。
第三,不要害怕删除分支。分支本身是一种廉价的指针,删除分支不等于删除代码,真正的提交都躺在仓库对象里。需要用的时候,git reflog总能在黄金期内帮你找回来。真正该怕的是从来不清理分支,让仓库变成一堆无法判断状态的僵尸分支集合。
第四,提交信息写清楚"为什么"。这一点在分支合并和 cherry-pick 时体现得特别明显——当你需要比较多个提交来挑选功能迁移时,写得含糊的提交信息会让你被迫打开 diff 逐个看,而写得好的提交信息能让你直接精确锁定该搬哪几个提交。很多团队的分支管理很规范,但败在提交信息上。
第五,多版本并行时优先考虑 worktree。同一份代码在不同分支之间来回切换,心智成本远比想象的大。worktree 让每个分支有独立的物理空间,测试、调试、环境依赖都互不干扰,是最适合并行开发的轻度方案。
在大量团队场景里,我观察到一个普遍的规律:分支命令本身不难学,真正拉开差距的是对"指针模型"的理解程度、对提交历史的维护意识、以及遇到异常时能不能冷静运用 reflog 这类工具找出路。把本文涉及的这些命令在真实项目里各跑几遍,特别是有意识地用 switch 代替 checkout、用 stash 处理切换打断、用 cherry-pick 搬运具体提交,你的分支操作就没有明显的死角了。