[git]git fetch 和 git pull(区别)

492 阅读3分钟

git fetchgit pull 都是用于从远程仓库获取更新的命令,但它们的关键区别在于是否自动合并本地分支

主要区别

特性git fetchgit 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. 更安全:不会意外破坏你的本地修改
  2. 更可控:可以先查看远程变更,再决定如何处理
  3. 避免冲突:有机会在合并前解决潜在问题
  4. 适合团队协作:在合并前可以先审查代码变更

实际例子

假设远程仓库有新的提交:

# 场景1:使用 fetch
git fetch          # 获取远程更新
git log --oneline --graph --all  # 查看所有分支情况
git merge origin/main  # 手动合并(或使用rebase)

# 场景2:使用 pull
git pull           # 直接获取并合并
# 如果出现冲突,需要手动解决

最佳实践建议

  1. 日常开发推荐流程

    git fetch
    git rebase origin/main  # 或 git merge origin/main
    
  2. 何时使用 git pull

    • 个人项目,没有未提交的修改
    • 确定远程变更不会与本地冲突
    • 想要快速同步
  3. 重要提醒

    • 在执行 git pull 前,最好先提交或暂存本地修改
    • 可以使用 git pull --rebase 保持线性历史
    • 在团队项目中,优先使用 fetch + review + merge 流程

记忆口诀

fetch = "先看看快递来了什么"
pull = "直接把快递拆了放家里"

简单说:git fetch 让你先预览变更,git pull 让你直接应用变更。