从远程仓库抓取与拉取
在协作开发中,保持你的本地仓库与远程仓库同步至关重要。Git 提供了两个主要命令来获取远程数据:git fetch(抓取)和 git pull(拉取)。理解它们的区别是掌握 Git 协作的关键。
Git Fetch (抓取)
Section titled “Git Fetch (抓取)”git fetch 是一个安全的操作。它会下载远程仓库中所有你还没有的数据(提交、文件、引用等),并更新你本地的远程跟踪分支(例如 origin/main)。
关键点: git fetch 不会修改你当前的工作目录或当前分支。它只是把数据下载下来放在一边,让你去查看。
# 抓取 origin 的所有更新git fetch origin抓取后,你可以通过 git log origin/main 查看远程有了哪些新进展,或者使用 git diff main origin/main 来对比差异。
Git Pull (拉取)
Section titled “Git Pull (拉取)”git pull 是一个便捷命令,它实际上是两个命令的组合。
默认情况下(未配置时):
git pull 等于先 git fetch 再 git merge。
但这不是绝对的!git pull 的行为可通过配置或参数改变:
git pull --rebase:使用rebase而非merge,保持线性历史。git pull --ff-only:仅在可以快进合并时执行,否则中止。- 配置
pull.rebase=true:使git pull默认使用rebase。
当你运行 git pull 时,Git 会:
- 自动从远程下载数据 (
fetch)。 - 尝试将远程分支的更改整合到你当前所在的本地分支(默认使用
merge)。
# 拉取并合并远程 main 分支到当前分支git pull origin main视觉图解:Fetch vs Pull
Section titled “视觉图解:Fetch vs Pull”让我们通过流程图来看清两者的区别。假设远程仓库有了新的提交 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冲突一样。