git fetch 和 git pull 都是用于从远程仓库获取更新的命令,但它们的关键区别在于是否自动合并本地分支。
主要区别
| 特性 | git fetch | git pull |
|---|---|---|
| 行为 | 只下载远程变更,不修改本地文件 | 下载远程变更并自动合并到当前分支 |
| 安全性 | 安全,不会影响本地工作区 | 可能有风险,可能产生冲突 |
| 工作流程 | 查看后再决定是否合并 | 直接获取并合并 |
| 命令实质 | git fetch = 仅获取 | git pull = git fetch + git merge |
详细解释
1. git fetch - 只获取不合并
git fetch origin
- 从远程仓库下载所有最新提交、分支和标签
- 不会修改你的本地工作目录文件
- 更新的是本地仓库中的远程跟踪分支(如
origin/main) - 让你可以查看远程变更后再决定是否合并
2. git pull - 获取并自动合并
git pull origin main
- 相当于执行了:
git fetch origin # 先获取远程变更
git merge origin/main # 再合并到当前分支
- 直接修改你的本地工作目录文件
- 如果远程有新的提交,会自动尝试合并到当前分支
实际工作流示例
使用 git fetch 的推荐工作流
# 1. 先获取远程更新(安全查看)
git fetch origin
# 2. 查看远程分支的变化
git log origin/main..HEAD # 查看本地有什么远程没有
git log HEAD..origin/main # 查看远程有什么本地没有
# 3. 比较差异
git diff origin/main
# 4. 手动合并(谨慎操作)
git merge origin/main
# 或使用 rebase
git rebase origin/main
使用 git pull 的简单场景
# 直接获取并合并(适用于简单、直接的情况)
git pull origin main
# 等同于
git pull origin main --merge
# 使用 rebase 方式拉取
git pull origin main --rebase
为什么推荐多用 git fetch?
- 更安全:不会意外破坏你的本地修改
- 更可控:可以先查看远程变更,再决定如何处理
- 避免冲突:有机会在合并前解决潜在问题
- 适合团队协作:在合并前可以先审查代码变更
实际例子
假设远程仓库有新的提交:
# 场景1:使用 fetch
git fetch # 获取远程更新
git log --oneline --graph --all # 查看所有分支情况
git merge origin/main # 手动合并(或使用rebase)
# 场景2:使用 pull
git pull # 直接获取并合并
# 如果出现冲突,需要手动解决
最佳实践建议
-
日常开发推荐流程:
git fetch git rebase origin/main # 或 git merge origin/main -
何时使用
git pull:- 个人项目,没有未提交的修改
- 确定远程变更不会与本地冲突
- 想要快速同步
-
重要提醒:
- 在执行
git pull前,最好先提交或暂存本地修改 - 可以使用
git pull --rebase保持线性历史 - 在团队项目中,优先使用
fetch + review + merge流程
- 在执行
记忆口诀
fetch = "先看看快递来了什么"
pull = "直接把快递拆了放家里"
简单说:git fetch 让你先预览变更,git pull 让你直接应用变更。