1. 引言

在 Git 操作中,我们经常使用 git pullgit fetch 来更新本地代码库。虽然它们都能从远程仓库拉取最新变更,但两者的实际行为和用途却截然不同。本文将详细讲解它们之间的差异,并通过示例帮助你更好地理解。

2. Git 项目目录结构概述

在深入了解 git fetchgit pull 的区别之前,先简单回顾一下 Git 项目的目录结构:

  • 本地仓库(Local Repository):即项目目录下的 .git 子目录,保存了所有 Git 的版本信息、对象、引用等
  • 工作目录(Working Directory):也就是我们日常编辑、修改的代码文件

理解这两个部分的区别,有助于我们更清楚地理解 git fetchgit pull 的作用机制。

3. git fetch

git fetch 的作用是 从远程仓库获取变更信息,并更新本地仓库的内容。它不会修改你的工作目录,也就是说,你本地的代码文件不会发生任何变化。

特点总结

  • 仅更新 .git 目录中的内容
  • 不会影响工作目录
  • 适合用于查看远程变更,而不立即合并

3.1 示例演示

假设我们在远程仓库的 main 分支中修改了 file.txt 文件内容如下:

$ cat file.txt
Hello Git

而在本地工作目录中,file.txt 的内容是:

$ cat file.txt
Hello World

此时运行 git diff origin/main不会有任何输出,因为本地仓库还没有更新远程分支的引用。

接下来执行:

$ git fetch

输出大致如下:

remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 904 bytes | 113.00 KiB/s, done.
From https://github.com/yourname/yourrepo
16e7ccf..1efc5e3 main -> origin/main

此时再运行 git diff origin/main,你会看到差异:

diff --git a/file.txt b/file.txt
index 9f4d96d..557db03 100644
--- a/file.txt
+++ b/file.txt
@@ -1 +1 @@
-Hello Git
+Hello World

⚠️ 注意:尽管本地仓库已经更新,但工作目录中的 file.txt 内容仍然是旧的:

$ cat file.txt 
Hello World

4. git pull

git pull 的作用是 先执行 git fetch,再执行 git merge。也就是说,它不仅会更新本地仓库,还会自动将远程变更合并到当前分支,从而更新你的工作目录

特点总结

  • 更新本地仓库
  • 自动合并远程变更到当前分支
  • 直接影响工作目录

4.1 示例演示

我们继续用 foo.txt 做测试。远程仓库中该文件内容为:

$ cat foo.txt
lorem ipsum dolor

本地内容为:

$ cat foo.txt
lorem ipsum

此时运行:

$ git diff origin/main

仍然没有输出,因为本地仓库未更新。

接下来运行:

$ git pull

输出如下:

remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 917 bytes | 70.00 KiB/s, done.
From https://github.com/yourname/yourrepo
   bf860ad..56d817d  main       -> origin/main
Updating bf860ad..56d817d
Fast-forward
 foo.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

此时再次运行:

$ git diff origin/main

依旧没有输出,因为工作目录已经和远程分支同步。

5. 总结对比

操作 更新本地仓库 更新工作目录 是否自动合并 适用场景
git fetch 查看远程变更,准备手动合并
git pull 快速更新并合并远程变更

6. 使用建议与踩坑提醒

  • 建议:在执行合并操作前,先使用 git fetch 查看远程变更,确认无误后再决定是否合并。
  • 避免:在多人协作的开发环境中直接使用 git pull,容易造成冲突且难以追踪。
  • ⚠️ 注意:如果你当前分支没有跟踪远程分支(如未设置 upstream),git pull 会报错,需要先用 git branch --set-upstream-to 设置跟踪关系。

7. 结语

git fetchgit pull 都是 Git 中非常常用的命令,但它们的行为和用途完全不同。理解它们的区别,有助于你更安全、高效地进行版本控制和团队协作。希望本文能帮助你清晰掌握这两个命令的使用场景。


原始标题:What Is the Difference Between ‘git pull’ and ‘git fetch’?