本节目标这一节学习 Git 中非常重要的能力分支。你要理解这些问题什么是分支 为什么不要直接在 master/main 上开发 如何创建自己的功能分支 如何在不同分支之间切换 如何把一个分支的代码合并到另一个分支 Gerrit 工作流中分支有什么作用本节重点命令git branch git switch git switch -c git merge git log --oneline --graph git branch -d1. 分支是什么分支可以理解为从当前代码版本上拉出一条独立的开发线。假设主分支现在是这样A --- B --- C main现在你要开发登录功能不应该直接在main上改而是创建一个新分支A --- B --- C main \ D --- E feature/login这里main是主分支feature/login是你的功能分支D和E是你在功能分支上的提交这样做的好处是你的开发不会影响主分支。 别人也可以继续基于主分支开发。 功能完成后再通过评审和合并进入主分支。2. 为什么不能直接在 main/master 上开发主分支通常代表项目的稳定版本。常见主分支名称有main master develop release如果你直接在主分支开发容易带来几个问题写到一半的代码可能影响别人临时代码可能混进主线功能没有完成就被别人拉走多人同时修改时更容易混乱Gerrit 或 CI 评审流程不好管理真实公司中常见规则是不要直接在 main/master 上开发。 每个任务创建自己的功能分支。 开发完成后提交到 Gerrit 或发起代码评审。 评审通过后再合入目标分支。3. 查看当前分支查看本地所有分支git branch你可能看到* main其中*表示你当前所在的分支。如果看到feature/login * main意思是当前在 main 分支。 本地还有一个 feature/login 分支。也可以用git status它通常会显示On branch main表示你当前在main分支。4. 创建并切换分支创建新分支并立即切换过去git switch -c feature/login这条命令可以拆成两层意思git switch 切换分支 -c create创建新分支 feature/login 新分支名称执行后再查看git branch你会看到* feature/login main表示你现在已经在feature/login分支。老版本 Git 也可以使用git checkout -b feature/login现在更推荐新命令git switch -c feature/login因为switch的语义更清楚它就是用来切换分支的。5. 分支命名习惯分支名要让别人一眼看懂你在做什么。常见命名方式feature/login feature/user-profile bugfix/login-crash hotfix/payment-error release/v1.2.0常见前缀前缀含义feature/新功能bugfix/普通问题修复hotfix/紧急线上修复release/发布准备test/临时测试示例git switch -c feature/student-management表示创建一个用于开发学生管理功能的分支。6. 在分支上开发假设你已经在功能分支git switch -c feature/login然后修改文件echo login feature login.txt查看状态git status提交git add login.txt git commit -m 添加登录功能文件现在这个提交只属于feature/login分支。查看历史git log --oneline如果想看更清楚的分支图git log --oneline --graph --all这个命令非常有用。它可以用图形方式显示分支关系。7. 切换回 main 分支切换回主分支git switch main如果你的主分支叫mastergit switch master切换后再查看文件你会发现在 feature/login 分支创建的文件可能在 main 分支上看不到。这是正常的。因为不同分支代表不同代码状态。你可以理解为切换分支就是切换整个项目目录到另一个版本状态。8. 切换分支前要注意工作区是否干净切换分支前最好先执行git status如果看到nothing to commit, working tree clean表示工作区干净可以安全切换。如果有未提交修改例如Changes not staged for commit这时切换分支可能会失败或者把未提交修改带到另一个分支。所以建议养成习惯切换分支前先看 git status。如果修改已经完成可以提交git add . git commit -m 完成某个修改如果修改暂时不想提交后面会学习git stashstash可以临时保存工作区修改。9. 合并分支git merge当功能分支开发完成后可以把它合并回目标分支。假设当前分支结构是A --- B --- C main \ D --- E feature/login现在要把feature/login合并到main。第一步切换到目标分支git switch main第二步执行合并git merge feature/login合并后可能变成A --- B --- C --- F main \ / D -- E feature/login其中F是一个合并提交。有时候也可能是 fast-forward 合并A --- B --- C --- D --- E main这取决于main分支在你开发期间有没有新的提交。10. Fast-forward 合并Fast-forward 可以理解为主分支没有新的变化只需要把 main 指针往前移动。例如A --- B --- C main \ D --- E feature/login如果main在C之后没有新提交执行git switch main git merge feature/login结果可能是A --- B --- C --- D --- E main, feature/login这种合并不会产生额外的 merge commit。11. 普通 merge commit如果你开发功能时main分支也被别人更新了A --- B --- C --- X --- Y main \ D --- E feature/login这时合并git switch main git merge feature/login可能产生A --- B --- C --- X --- Y --- M main \ / D --- E ---- feature/login其中M是 merge commit。它的作用是把 main 上的新变化和 feature/login 上的新变化合在一起。12. 合并冲突是什么合并时最常见的问题是冲突。冲突通常发生在两个分支修改了同一个文件的同一处内容。 Git 不知道应该保留哪一个。例如main分支把一行改成hello main而feature/login分支把同一行改成hello featureGit 无法自动判断哪个正确就会产生冲突。冲突文件里通常会出现 HEAD hello main hello feature feature/login含义是HEAD表示当前分支的内容上面是当前分支版本下面是被合并分支版本 feature/login表示来自feature/login的内容冲突解决会在下一课详细讲。本节先记住冲突不是错误而是 Git 需要你人工判断最终代码应该是什么。13. 删除已经完成的本地分支功能分支合并完成后可以删除本地分支git branch -d feature/login-d表示安全删除。如果分支还没有被合并Git 通常会阻止删除避免你丢失提交。如果强制删除git branch -D feature/login-D是强制删除。新手阶段不建议随便使用-D。14. Gerrit 工作流中的分支在 Gerrit 中你通常还是会在本地创建功能分支git switch -c feature/login开发完成后提交git add . git commit -m 实现用户登录功能然后推送到 Gerritgit push origin HEAD:refs/for/master这里要注意feature/login 是你的本地开发分支。 refs/for/master 表示你申请合入 Gerrit 远端的 master 分支。如果目标分支是developgit push origin HEAD:refs/for/develop也就是说本地分支叫什么不一定等于目标分支叫什么。本地可以叫feature/login但你可以申请合入master develop release/v1.015. Gerrit 和 GitHub/GitLab 的区别GitHub/GitLab 常见方式git push origin feature/login然后创建 Pull Request 或 Merge Request。流程是本地分支 - 远程功能分支 - PR/MR - 合并Gerrit 常见方式git push origin HEAD:refs/for/master流程是本地提交 - Gerrit Change - Review - Submit所以 Gerrit 更关注每一个 commit 或 Change 的评审质量。而不是只关注某个远程功能分支。16. 实战练习一创建分支并提交创建练习目录mkdir git-branch-demo cd git-branch-demo git init创建初始文件echo # Git Branch Demo readme.md git add readme.md git commit -m 添加项目说明查看当前分支git branch创建功能分支git switch -c feature/login创建登录文件echo login page login.txt git add login.txt git commit -m 添加登录页面文件查看历史图git log --oneline --graph --all17. 实战练习二切换分支切回主分支git switch main如果你的 Git 默认分支是master使用git switch master查看文件dir在 Windows PowerShell 中可以用Get-ChildItem你可能会发现login.txt不见了。这是正常现象。因为login.txt是在feature/login分支上创建的还没有合并到主分支。再切回功能分支git switch feature/login再次查看文件login.txt会回来。18. 实战练习三合并分支切换到主分支git switch main如果主分支叫mastergit switch master合并功能分支git merge feature/login查看历史git log --oneline --graph --all查看文件dir这时你应该能看到login.txt因为它已经被合并到主分支。19. 实战练习四删除已合并分支查看分支git branch删除功能分支git branch -d feature/login再次查看git branch你应该只看到主分支。20. 本节常见错误错误一不知道自己在哪个分支提交前先看git status git branch不要在不知道当前分支的情况下提交代码。错误二直接在主分支开发更好的习惯是git switch -c feature/your-task先创建任务分支再开始开发。错误三切换分支前不看状态切换分支前先执行git status如果工作区不干净先处理修改。错误四分支名没有意义不要这样命名test aaa new mybranch推荐这样命名feature/login bugfix/login-null-error hotfix/order-submit-crash错误五误删未合并分支优先使用git branch -d 分支名不要随便使用git branch -D 分支名21. 本节必须记住的命令git branch git switch 分支名 git switch -c 新分支名 git merge 分支名 git log --oneline --graph --all git branch -d 分支名对应含义git branch 查看本地分支 git switch 分支名 切换到已有分支 git switch -c 新分支名 创建并切换到新分支 git merge 分支名 把指定分支合并到当前分支 git log --oneline --graph --all 图形化查看提交历史 git branch -d 分支名 删除已合并的本地分支22. 工程师习惯总结真正工作中推荐流程是git status git switch main git pull git switch -c feature/my-task # 修改代码 git status git diff git add 文件 git diff --cached git commit -m 清楚描述本次修改如果使用 Gerritgit push origin HEAD:refs/for/master如果目标分支是developgit push origin HEAD:refs/for/develop核心思想主分支保持稳定。 任务分支独立开发。 提交前检查 diff。 评审通过后再合入目标分支。23. 本节总结这一节你学习了 Git 分支的基础能力分支是一条独立开发线不要直接在主分支上开发使用git switch -c创建功能分支使用git switch切换分支使用git merge合并分支使用git log --oneline --graph --all查看分支图使用git branch -d删除已完成分支Gerrit 中本地分支和目标评审分支不是一回事你现在已经开始接近真实团队开发流程。下一节建议学习Git 冲突解决为什么会冲突、如何看冲突标记、如何正确解决 merge conflict。
Git + Gerrit 第三课:分支、切换与合并
发布时间:2026/7/1 4:45:38
本节目标这一节学习 Git 中非常重要的能力分支。你要理解这些问题什么是分支 为什么不要直接在 master/main 上开发 如何创建自己的功能分支 如何在不同分支之间切换 如何把一个分支的代码合并到另一个分支 Gerrit 工作流中分支有什么作用本节重点命令git branch git switch git switch -c git merge git log --oneline --graph git branch -d1. 分支是什么分支可以理解为从当前代码版本上拉出一条独立的开发线。假设主分支现在是这样A --- B --- C main现在你要开发登录功能不应该直接在main上改而是创建一个新分支A --- B --- C main \ D --- E feature/login这里main是主分支feature/login是你的功能分支D和E是你在功能分支上的提交这样做的好处是你的开发不会影响主分支。 别人也可以继续基于主分支开发。 功能完成后再通过评审和合并进入主分支。2. 为什么不能直接在 main/master 上开发主分支通常代表项目的稳定版本。常见主分支名称有main master develop release如果你直接在主分支开发容易带来几个问题写到一半的代码可能影响别人临时代码可能混进主线功能没有完成就被别人拉走多人同时修改时更容易混乱Gerrit 或 CI 评审流程不好管理真实公司中常见规则是不要直接在 main/master 上开发。 每个任务创建自己的功能分支。 开发完成后提交到 Gerrit 或发起代码评审。 评审通过后再合入目标分支。3. 查看当前分支查看本地所有分支git branch你可能看到* main其中*表示你当前所在的分支。如果看到feature/login * main意思是当前在 main 分支。 本地还有一个 feature/login 分支。也可以用git status它通常会显示On branch main表示你当前在main分支。4. 创建并切换分支创建新分支并立即切换过去git switch -c feature/login这条命令可以拆成两层意思git switch 切换分支 -c create创建新分支 feature/login 新分支名称执行后再查看git branch你会看到* feature/login main表示你现在已经在feature/login分支。老版本 Git 也可以使用git checkout -b feature/login现在更推荐新命令git switch -c feature/login因为switch的语义更清楚它就是用来切换分支的。5. 分支命名习惯分支名要让别人一眼看懂你在做什么。常见命名方式feature/login feature/user-profile bugfix/login-crash hotfix/payment-error release/v1.2.0常见前缀前缀含义feature/新功能bugfix/普通问题修复hotfix/紧急线上修复release/发布准备test/临时测试示例git switch -c feature/student-management表示创建一个用于开发学生管理功能的分支。6. 在分支上开发假设你已经在功能分支git switch -c feature/login然后修改文件echo login feature login.txt查看状态git status提交git add login.txt git commit -m 添加登录功能文件现在这个提交只属于feature/login分支。查看历史git log --oneline如果想看更清楚的分支图git log --oneline --graph --all这个命令非常有用。它可以用图形方式显示分支关系。7. 切换回 main 分支切换回主分支git switch main如果你的主分支叫mastergit switch master切换后再查看文件你会发现在 feature/login 分支创建的文件可能在 main 分支上看不到。这是正常的。因为不同分支代表不同代码状态。你可以理解为切换分支就是切换整个项目目录到另一个版本状态。8. 切换分支前要注意工作区是否干净切换分支前最好先执行git status如果看到nothing to commit, working tree clean表示工作区干净可以安全切换。如果有未提交修改例如Changes not staged for commit这时切换分支可能会失败或者把未提交修改带到另一个分支。所以建议养成习惯切换分支前先看 git status。如果修改已经完成可以提交git add . git commit -m 完成某个修改如果修改暂时不想提交后面会学习git stashstash可以临时保存工作区修改。9. 合并分支git merge当功能分支开发完成后可以把它合并回目标分支。假设当前分支结构是A --- B --- C main \ D --- E feature/login现在要把feature/login合并到main。第一步切换到目标分支git switch main第二步执行合并git merge feature/login合并后可能变成A --- B --- C --- F main \ / D -- E feature/login其中F是一个合并提交。有时候也可能是 fast-forward 合并A --- B --- C --- D --- E main这取决于main分支在你开发期间有没有新的提交。10. Fast-forward 合并Fast-forward 可以理解为主分支没有新的变化只需要把 main 指针往前移动。例如A --- B --- C main \ D --- E feature/login如果main在C之后没有新提交执行git switch main git merge feature/login结果可能是A --- B --- C --- D --- E main, feature/login这种合并不会产生额外的 merge commit。11. 普通 merge commit如果你开发功能时main分支也被别人更新了A --- B --- C --- X --- Y main \ D --- E feature/login这时合并git switch main git merge feature/login可能产生A --- B --- C --- X --- Y --- M main \ / D --- E ---- feature/login其中M是 merge commit。它的作用是把 main 上的新变化和 feature/login 上的新变化合在一起。12. 合并冲突是什么合并时最常见的问题是冲突。冲突通常发生在两个分支修改了同一个文件的同一处内容。 Git 不知道应该保留哪一个。例如main分支把一行改成hello main而feature/login分支把同一行改成hello featureGit 无法自动判断哪个正确就会产生冲突。冲突文件里通常会出现 HEAD hello main hello feature feature/login含义是HEAD表示当前分支的内容上面是当前分支版本下面是被合并分支版本 feature/login表示来自feature/login的内容冲突解决会在下一课详细讲。本节先记住冲突不是错误而是 Git 需要你人工判断最终代码应该是什么。13. 删除已经完成的本地分支功能分支合并完成后可以删除本地分支git branch -d feature/login-d表示安全删除。如果分支还没有被合并Git 通常会阻止删除避免你丢失提交。如果强制删除git branch -D feature/login-D是强制删除。新手阶段不建议随便使用-D。14. Gerrit 工作流中的分支在 Gerrit 中你通常还是会在本地创建功能分支git switch -c feature/login开发完成后提交git add . git commit -m 实现用户登录功能然后推送到 Gerritgit push origin HEAD:refs/for/master这里要注意feature/login 是你的本地开发分支。 refs/for/master 表示你申请合入 Gerrit 远端的 master 分支。如果目标分支是developgit push origin HEAD:refs/for/develop也就是说本地分支叫什么不一定等于目标分支叫什么。本地可以叫feature/login但你可以申请合入master develop release/v1.015. Gerrit 和 GitHub/GitLab 的区别GitHub/GitLab 常见方式git push origin feature/login然后创建 Pull Request 或 Merge Request。流程是本地分支 - 远程功能分支 - PR/MR - 合并Gerrit 常见方式git push origin HEAD:refs/for/master流程是本地提交 - Gerrit Change - Review - Submit所以 Gerrit 更关注每一个 commit 或 Change 的评审质量。而不是只关注某个远程功能分支。16. 实战练习一创建分支并提交创建练习目录mkdir git-branch-demo cd git-branch-demo git init创建初始文件echo # Git Branch Demo readme.md git add readme.md git commit -m 添加项目说明查看当前分支git branch创建功能分支git switch -c feature/login创建登录文件echo login page login.txt git add login.txt git commit -m 添加登录页面文件查看历史图git log --oneline --graph --all17. 实战练习二切换分支切回主分支git switch main如果你的 Git 默认分支是master使用git switch master查看文件dir在 Windows PowerShell 中可以用Get-ChildItem你可能会发现login.txt不见了。这是正常现象。因为login.txt是在feature/login分支上创建的还没有合并到主分支。再切回功能分支git switch feature/login再次查看文件login.txt会回来。18. 实战练习三合并分支切换到主分支git switch main如果主分支叫mastergit switch master合并功能分支git merge feature/login查看历史git log --oneline --graph --all查看文件dir这时你应该能看到login.txt因为它已经被合并到主分支。19. 实战练习四删除已合并分支查看分支git branch删除功能分支git branch -d feature/login再次查看git branch你应该只看到主分支。20. 本节常见错误错误一不知道自己在哪个分支提交前先看git status git branch不要在不知道当前分支的情况下提交代码。错误二直接在主分支开发更好的习惯是git switch -c feature/your-task先创建任务分支再开始开发。错误三切换分支前不看状态切换分支前先执行git status如果工作区不干净先处理修改。错误四分支名没有意义不要这样命名test aaa new mybranch推荐这样命名feature/login bugfix/login-null-error hotfix/order-submit-crash错误五误删未合并分支优先使用git branch -d 分支名不要随便使用git branch -D 分支名21. 本节必须记住的命令git branch git switch 分支名 git switch -c 新分支名 git merge 分支名 git log --oneline --graph --all git branch -d 分支名对应含义git branch 查看本地分支 git switch 分支名 切换到已有分支 git switch -c 新分支名 创建并切换到新分支 git merge 分支名 把指定分支合并到当前分支 git log --oneline --graph --all 图形化查看提交历史 git branch -d 分支名 删除已合并的本地分支22. 工程师习惯总结真正工作中推荐流程是git status git switch main git pull git switch -c feature/my-task # 修改代码 git status git diff git add 文件 git diff --cached git commit -m 清楚描述本次修改如果使用 Gerritgit push origin HEAD:refs/for/master如果目标分支是developgit push origin HEAD:refs/for/develop核心思想主分支保持稳定。 任务分支独立开发。 提交前检查 diff。 评审通过后再合入目标分支。23. 本节总结这一节你学习了 Git 分支的基础能力分支是一条独立开发线不要直接在主分支上开发使用git switch -c创建功能分支使用git switch切换分支使用git merge合并分支使用git log --oneline --graph --all查看分支图使用git branch -d删除已完成分支Gerrit 中本地分支和目标评审分支不是一回事你现在已经开始接近真实团队开发流程。下一节建议学习Git 冲突解决为什么会冲突、如何看冲突标记、如何正确解决 merge conflict。