1. git fetch 和 pull 的区别
1.1 核心区别
git fetch(只下载,不合并)
- 动作:它只会把你远端仓库最新的所有提交(Commit)下载到本地的缓存区(即远程追踪分支,如 origin/main),但绝对不会动你当前正在写代码的分支(工作区)。
- 状态:执行完后,你的本地代码没有任何变化,安全系数极高
git pull(下载 + 自动合并)
- 动作:它会直接一步到位。先执行 fetch 把远程最新代码拉下来,紧接着立刻自动执行 merge,把你当前所在的本地分支和远程对应的分支进行合并。
- 状态:你的本地工作区会瞬间被更新。如果远端和本地修改了同一个文件的同一行,此时会直接触发冲突(Conflict),需要你立即解决。
1.2 底层原理
我们可以把 Git 的仓库结构拆解为三个部分:
- 工作区(Working Directory):你正在修改的局部代码。
- 本地历史(Local Repository):你已经 commit 但可能还没 push 的记录。
- 远程追踪分支(Remote Tracking Branches):本地记录的远程分支状态(如 origin/master)。
执行 git fetch 时:
Git 只更新了 远程追踪分支。
java
远程仓库 (Remote) ──> [git fetch] ──> 本地远程追踪分支 (origin/master)
│
(到此为止,工作区未受影响)
此时你可以通过 git log log origin/master 来查看远程有哪些新提交,或者通过 git diff origin/master 对比自己和远端代码的差异。
执行 git pull 时:
Git 连续完成了两步:
java
远程仓库 (Remote) ──> [1. fetch] ──> 远程追踪分支 ──> [2. merge] ──> 本地当前分支 & 工作区
1.3 怎么合理使用
我们每有一个需求时,就会新创建一个分支进行开发。开发完成后才合并到master上,那么在开发期间git pull和gitfetch怎么合理使用?
场景一:对主干 master ------ 多用 fetch,谨慎 pull
- 你在写自己的需求,master 是别人合并代码的地方。
- 合理做法:使用 git fetch origin master。
为什么:它只把别人新合进 master 的代码下载到你本地的临时缓存区(origin/master),完全不影响你当前正在写的代码。你可以安全地用 IDEA 的 Version Control 界面去瞅一眼:"呀,张三昨天下午合了一个大重构,改到了我正在用的公共类。" 做到心中有数。
场景二 :把 master 的新代码同步到你的需求分支 ------ 用 merge 或 rebase
当你用 fetch 看到 master 有了重要更新,决定把这些更新同步进你的 feature-login 分支时:
- 合理做法:不要直接在当前分支执行 git pull origin master(这容易把本地历史搞乱)。推荐在你的需求分支下执行:
java
git fetch origin master
git rebase origin/master # 或者 git merge origin/master
场景三:对自己的需求分支 ------ 视情况用 pull
-
如果你是单人开发这个需求:你不需要对自己的分支执行 git pull。因为远程的 feature-login 只由你一个人推上去,本地永远是最新的。
-
如果是两个人协作开发同一个需求:每天早晨开工,必须在你的需求分支下执行 git pull(推荐 git pull --rebase),把队友昨天写完推上去的代码拉下来。
java
git fetch origin:获取远程仓库 所有分支 的更新。
git fetch origin master:只获取远程仓库 master 这一个分支 的更新。
"每日开发工作流"推荐
刚到工位,喝口水,第一件事不是直接写代码,而是刷新一下远程状态:
bash
git fetch --all --prune
这会把远程所有分支(包括 master、其他队友的分支)的最新提交记录都抓取到本地。此时打开 IDEA 的 Git 图形提交树,你能清晰地看到整个团队昨天的战果,而你的本地代码依然稳如泰山。
中午或傍晚:顺手同步主干(Fetch + Rebase)
发现 master 往前推进了,为了防止最后一天提 MR 时冲突太多,主动合一次:
bash
git fetch origin master
git rebase origin/master
需求开发完毕,准备合并前:最后总攻(Pull)
代码写完了,准备在 GitLab/GitHub 上提 Merge Request 之前,做最后一次对齐:
1.切换到本地 master 并拉到最新:
java
git checkout master
git pull
2.切回需求分支,把最新 master 顶在最下面:
java
git checkout feature-login
git rebase master
- 确保本地编译、测试全过,放心推送到远端,提 MR。