问题背景

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 -

注意:主分支名称可能是 mainmaster,取决于项目创建时间。

三、分支合并

基本流程

# 1. 切换到主分支
git switch main
 
# 2. 拉取最新代码
git pull origin main
 
# 3. 合并新分支
git merge <分支>

合并类型

类型场景说明
Fast-forwardmain 分支没有新提交自动移动指针
三方合并两侧都有新提交会创建合并提交

合并冲突处理

  1. 查看冲突文件:git status
  2. 手动编辑冲突文件,删除 <<<<<<<\=\=\=\=>>>>>> 标记
  3. 标记冲突已解决:git add <文件>
  4. 完成合并提交: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 checkoutgit 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,让他人审核代码

适用场景

  1. 日常开发:创建功能分支、修复分支
  2. 团队协作:通过 PR 进行代码审核
  3. 版本管理:主干开发与特性开发分离
  4. 问题修复:创建热修复分支

注意事项

  1. 删除分支前确认:删除操作不可逆
  2. 主分支名称:可能是 mainmaster
  3. rebase 谨慎使用:不要在公共分支上使用
  4. 合并冲突:解决后记得 git add 标记已解决
  5. 未提交的修改:切换分支前先 git stash 暂存

参考资料