跳转到内容

从远程仓库抓取与拉取

在协作开发中,保持你的本地仓库与远程仓库同步至关重要。Git 提供了两个主要命令来获取远程数据:git fetch(抓取)和 git pull(拉取)。理解它们的区别是掌握 Git 协作的关键。

git fetch 是一个安全的操作。它会下载远程仓库中所有你还没有的数据(提交、文件、引用等),并更新你本地的远程跟踪分支(例如 origin/main)。

关键点: git fetch 不会修改你当前的工作目录或当前分支。它只是把数据下载下来放在一边,让你去查看。

Terminal window
# 抓取 origin 的所有更新
git fetch origin

抓取后,你可以通过 git log origin/main 查看远程有了哪些新进展,或者使用 git diff main origin/main 来对比差异。

git pull 是一个便捷命令,它实际上是两个命令的组合。

默认情况下(未配置时):

git pull 等于先 git fetchgit merge

但这不是绝对的!git pull 的行为可通过配置或参数改变:

  • git pull --rebase:使用 rebase 而非 merge,保持线性历史。
  • git pull --ff-only:仅在可以快进合并时执行,否则中止。
  • 配置 pull.rebase=true:使 git pull 默认使用 rebase

当你运行 git pull 时,Git 会:

  1. 自动从远程下载数据 (fetch)。
  2. 尝试将远程分支的更改整合到你当前所在的本地分支(默认使用 merge)。
Terminal window
# 拉取并合并远程 main 分支到当前分支
git pull origin main

让我们通过流程图来看清两者的区别。假设远程仓库有了新的提交 C3,而你本地还停留在 C2

graph TD
subgraph Remote [远程仓库]
R_C1((C1)) --> R_C2((C2)) --> R_C3((C3))
end
subgraph Local_Before["本地仓库 (初始状态)"]
L_C1((C1)) --> L_C2((C2))
HEAD_B[HEAD] --> main_B[main] --> L_C2
origin_main_B[origin/main] --> L_C2
end
subgraph Local_Fetch [执行 git fetch 后]
L2_C1((C1)) --> L2_C2((C2)) --> L2_C3((C3))
HEAD_F[HEAD] --> main_F[main] --> L2_C2
origin_main_F[origin/main] --> L2_C3
end
subgraph Local_Pull [执行 git pull 后]
L3_C1((C1)) --> L3_C2((C2)) --> L3_C3((C3))
HEAD_P[HEAD] --> main_P[main] --> L3_C3
origin_main_P[origin/main] --> L3_C3
end
Remote -.-> Local_Fetch
Remote -.-> Local_Pull
%% 样式类定义 - 适配亮/暗模式
classDef localBranch fill:#4a5568,stroke:#2d3748,color:#fff
classDef remoteBranch fill:#3182ce,stroke:#2c5282,color:#fff
classDef synced fill:#38a169,stroke:#276749,color:#fff
%% 应用样式
class main_F localBranch
class origin_main_F remoteBranch
class main_P,origin_main_P synced
  • Local_Fetch: origin/main 指针向前移动了,但你的 main 指针还在原地。你的工作目录未受影响。
  • Local_Pull: origin/main 移动了,并且你的 main 指针也被更新(合并)到了最新位置。
  • git fetch: 下载更新,更新远程跟踪分支 (origin/xxx),不影响工作目录。安全,用于查看。
  • git pull: 下载更新并尝试合并到当前分支。方便,用于同步。
  • 如果在 pull 时遇到冲突,Git 会停下来让你解决冲突,就像普通的 merge 冲突一样。