问题背景
Git 是目前最流行的分布式版本控制系统,在日常开发中不可避免地需要创建分支、切换分支、合并代码等操作。对于刚接触 Git 的开发者来说,可能会遇到以下问题:
- 不清楚各种创建分支命令的区别
- 不知道如何正确切换和合并分支
- 对 origin 等概念感到困惑
- 分支改废后不知道如何删除
解决方案
一、创建分支
方法一:创建并切换到新分支(常用)
git checkout -b <分支名>示例:
git checkout -b feature/login这相当于以下两条命令的组合:
git branch feature/login # 创建分支
git checkout feature/login # 切换到分支方法二:仅创建分支(不切换)
git branch <分支名>方法三:使用 git switch(Git 2.23+ 推荐)
# 创建并切换
git switch -c <分支名>
# 仅创建(不切换)
git switch --create <分支名>二、切换分支
# 使用 checkout
git checkout <分支名>
# 使用 switch(推荐)
git switch <分支名>
# 快速切换到上一个分支
git switch -注意:主分支名称可能是
main或master,取决于项目创建时间。
三、分支合并
基本流程
# 1. 切换到主分支
git switch main
# 2. 拉取最新代码
git pull origin main
# 3. 合并新分支
git merge <分支名>合并类型
| 类型 | 场景 | 说明 |
|---|---|---|
| Fast-forward | main 分支没有新提交 | 自动移动指针 |
| 三方合并 | 两侧都有新提交 | 会创建合并提交 |
合并冲突处理
- 查看冲突文件:
git status - 手动编辑冲突文件,删除
<<<<<<<、\=\=\=\=、>>>>>>标记 - 标记冲突已解决:
git add <文件> - 完成合并提交:
git commit
常用选项
# 禁止快速合并(强制创建合并提交)
git merge --no-ff <分支名>
# 取消合并
git merge --abort
# 使用 rebase 变基
git rebase main⚠️ 注意:rebase 会重写提交历史,不要在公共分支上使用。
四、本地合并后与远程保持一致
当你已经在本地完成了分支合并操作后,需要将本地的更改推送到远程仓库,以保持远程分支与本地一致。
场景一:本地合并后推送到远程
# 1. 确认当前在 main 分支
git switch main
# 2. 拉取远程最新代码(避免冲突)
git pull origin main
# 3. 合并你的功能分支
git merge <功能分支名>
# 4. 如果有冲突,解决后继续
# git add <冲突文件>
# git commit
# 5. 推送到远程
git push origin main场景二:远程 main 有更新,本地需要同步
# 方法一:直接拉取(推荐用于个人分支)
git pull origin main
# 方法二:先 fetch 再 merge(更清晰)
git fetch origin
git merge origin/main
# 方法三:使用 rebase 保持线性历史
git fetch origin
git rebase origin/main场景三:强制推送到远程(谨慎使用)
⚠️ 警告:强制推送会覆盖远程历史,只有在确定要这样做时才使用!
# 强制推送本地 main 到远程(会覆盖远程的 main)
git push -f origin main
# 强制推送到 main 分支的简写
git push -f origin main完整工作流示例
假设你完成了功能开发,需要合并到 main 并保持远程一致:
# 1. 确保主分支最新
git switch main
git pull origin main
# 2. 合并功能分支
git merge feature/my-feature
# 3. 解决可能的冲突后,推送到远程
git push origin main
# 4. (可选)删除功能分支
git branch -d feature/my-feature
git push origin --delete feature/my-feature常见问题
| 问题 | 解决方法 |
|---|---|
| push 被拒绝 | 先 git pull 拉取远程更新再推送 |
| 推送失败提示 “non-fast-forward” | 使用 git pull --rebase 或先合并远程 |
| 远程和本地冲突 | 先解决本地冲突,再推送 |
| 误强制推送 | 联系团队成员,确认后重新推送正确版本 |
💡 最佳实践:
- 在推送前先
git pull确保本地最新- 团队协作时,尽量使用 Pull Request 而非直接推送 main
- 谨慎使用
git push -f,它会覆盖他人的提交
六、删除分支
删除本地分支
# 安全删除(会检查是否已合并)
git branch -d <分支名>
# 强制删除(不检查,直接删除)
git branch -D <分支名>删除远程分支
git push origin --delete <分支名>完整示例
# 1. 先切换到主分支(不能在被删除的分支上)
git switch main
# 2. 删除本地分支
git branch -D feature/bad-branch
# 3. 删除远程分支(如果已推送)
git push origin --delete feature/bad-branch⚠️ 注意:删除分支是不可逆操作,请确保不再需要该分支的所有内容。
七、origin 的含义
origin 是远程仓库的默认别名,它指向克隆(clone)时的那个 URL 地址。
# 查看 origin 对应的地址
git remote -v输出示例:
origin https://github.com/用户名/仓库名.git (fetch)
origin https://github.com/用户名/仓库名.git (push)
八、switch 和 checkout 的区别
| 特性 | git checkout | git switch |
|---|---|---|
| 引入版本 | Git 早期就有 | Git 2.23+ |
| 功能范围 | 多功能:切换分支 + 恢复文件 | 单一功能:仅切换分支 |
| 语义清晰度 | 语义模糊 | 语义明确 |
checkout 的多种用法
# 1. 切换分支
git checkout <分支名>
# 2. 创建并切换
git checkout -b <分支名>
# 3. 恢复文件
git checkout <分支名/提交> -- <文件路径>
# 4. 丢弃工作区修改
git checkout -- <文件名>switch 的用法
# 1. 切换分支
git switch <分支名>
# 2. 创建并切换
git switch -c <分支名>
# 3. 从远程分支创建本地分支并切换
git switch -c <本地分支名> origin/<远程分支名>推荐用法
| 操作 | 推荐命令 |
|---|---|
| 切换分支 | git switch <分支名> |
| 创建并切换 | git switch -c <分支名> |
| 恢复文件 | git restore <文件路径> (Git 2.23+ 推荐) |
总结:
switch是专门为”分支切换”设计的,checkout是”全能选手”。
九、Pull Request(PR)
当通过 VS Code 将本地新分支推送到远程仓库后,如果该分支还没有合并到主分支,VS Code 会提示是否需要创建 Pull Request。
什么是 Pull Request?
Pull Request 是一种代码协作流程:
你 → 提交代码到新分支 → 请求管理员合并到主分支 → 管理员审核 → 合并
团队协作流程
1. 从 main 分支创建新功能分支
↓
2. 在新分支上开发并提交
↓
3. 推送到远程仓库
↓
4. 创建 Pull Request
↓
5. 同事/管理员审核代码
↓
6. 审核通过后合并到 main 分支
| 场景 | 操作 |
|---|---|
| 个人项目 | 可以不创建 PR,直接合并 |
| 团队协作 | 建议创建 PR,让他人审核代码 |
适用场景
- 日常开发:创建功能分支、修复分支
- 团队协作:通过 PR 进行代码审核
- 版本管理:主干开发与特性开发分离
- 问题修复:创建热修复分支
注意事项
- 删除分支前确认:删除操作不可逆
- 主分支名称:可能是
main或master - rebase 谨慎使用:不要在公共分支上使用
- 合并冲突:解决后记得
git add标记已解决 - 未提交的修改:切换分支前先
git stash暂存