git fetch 是 Git 中一个非常重要且安全的命令,它的核心功能是从远程仓库获取最新的提交历史、分支和标签信息,但不会自动合并或修改你当前的工作目录。
主要作用和特点
-
获取远程更新:
- 连接到配置的远程仓库(默认是
origin)。 - 下载远程仓库中所有分支的最新提交、对象(文件、树、提交等)和标签,这些内容是你本地仓库还没有的。
- 它让你的本地仓库知道远程仓库当前的状态(比如
main分支在远程指向了哪个新提交)。
- 连接到配置的远程仓库(默认是
-
不修改本地工作:
- 这是
fetch与pull最根本的区别。 git fetch只下载远程的更新信息到你的本地仓库数据库中。- 它不会自动:
- 将远程分支的内容合并到你当前正在工作的本地分支。
- 更新你工作目录中的文件。
- 更新你本地分支的指针(比如你的本地
main分支指针仍然指向原来的提交)。
- 你的本地修改、暂存区状态以及当前分支的位置都保持不变。这使得
fetch非常安全,因为它只是“查看”远程有什么更新。
- 这是
-
更新远程跟踪分支:
- 远程跟踪分支是本地仓库中用来反映远程仓库分支状态的特殊分支。它们的名字通常像
origin/main,origin/develop。 git fetch的主要作用就是更新这些远程跟踪分支。- 例如,执行
git fetch origin后:- 远程的
main分支有了新提交,那么本地的origin/main分支指针就会移动到那个新的提交上。 - 远程新建了一个分支
feature/new-api,那么本地就会创建一个对应的远程跟踪分支origin/feature/new-api。
- 远程的
- 这些
origin/*分支让你可以在本地查看远程分支的状态,而无需直接切换到它们或影响你的工作。
- 远程跟踪分支是本地仓库中用来反映远程仓库分支状态的特殊分支。它们的名字通常像
常用语法
git fetch: 从默认远程仓库(通常是origin)获取所有分支的更新。git fetch <remote-name>: 从指定的远程仓库(如origin,upstream)获取所有分支的更新。git fetch <remote-name> <branch-name>: 仅从指定的远程仓库获取指定分支的更新。git fetch --all: 从所有配置的远程仓库获取所有分支的更新。git fetch --prune或git fetch -p:- 在获取更新的同时,清理本地过时的远程跟踪分支。
- 如果远程仓库上某个分支已经被删除了(比如
feature/old被合并后删掉了),那么本地的origin/feature/old分支通常还会保留。 - 使用
--prune或-p选项会让 Git 检查远程分支的状态,并自动删除本地仓库中那些对应远程分支已经不存在的远程跟踪分支(origin/feature/old)。这是一个很好的习惯,能保持本地仓库的整洁。
为什么使用 git fetch?典型工作流
- 安全地查看变化: 在决定将远程更改合并到你的工作之前,你想先看看其他人提交了什么。
git fetch让你可以做到这一点:git fetch origin git diff main origin/main # 比较你的本地 main 分支和远程 origin/main 分支的差异 git log origin/main..main # 或者查看 origin/main 上有哪些新提交是本地 main 没有的 - 审查后再合并: 获取更新后,你可以决定如何整合这些更改:
- 使用
git merge origin/main将远程main分支的更改合并到你的当前分支。 - 使用
git rebase origin/main将你的提交变基到最新的远程main分支之上。 - 这比直接使用
git pull(它相当于git fetch+git merge)更可控,尤其是在协作环境中,因为你可以先审查代码再合并。
- 使用
- 处理被拒绝的推送: 如果你尝试
git push但被拒绝(通常因为远程分支有你没有的更新),第一步就是git fetch来获取那些你缺失的远程提交,然后决定是合并还是变基来解决差异。 - 查看或切换到远程分支: 要查看或工作在远程分支上,你需要先
git fetch来获取该分支及其最新提交到你的本地仓库。然后你可以:- 基于远程跟踪分支创建并切换到新的本地分支:
git checkout -b <new-local-branch> origin/<remote-branch> - 或者直接切换到远程跟踪分支(进入分离 HEAD 状态):
git checkout origin/<remote-branch>
- 基于远程跟踪分支创建并切换到新的本地分支:
git fetch vs git pull
| 特性 | git fetch | git pull |
|---|---|---|
| 核心动作 | 仅下载远程数据到本地仓库。 | 下载 (fetch) + 合并 (merge 或 rebase)。 |
| 工作目录 | 不修改工作目录或当前分支。绝对安全。 | 修改工作目录和当前分支(尝试自动合并)。可能存在风险(冲突)。 |
| 本地分支 | 不更新你的本地分支指针(如 main)。 | 更新你的本地分支指针(如 main)。 |
| 远程跟踪分支 | 更新远程跟踪分支(如 origin/main)。 | 更新远程跟踪分支(如 origin/main)。 |
| 目的 | 安全获取最新信息,审查后再决定如何整合。 | 快速获取最新信息并立即整合到当前工作分支。 |
| 控制权 | 用户完全控制何时以及如何合并/变基远程更改。 | 自动执行合并/变基,用户可能在合并冲突发生后才介入。 |
| 命令等价 | - | git pull = git fetch + git merge FETCH_HEAD git pull --rebase = git fetch + git rebase FETCH_HEAD |
总结
git fetch 是 Git 协作工作流中的基石命令。它让你在不干扰当前工作的情况下,同步远程仓库的最新状态到你的本地知识库中(更新远程跟踪分支)。它为安全地审查更改、解决潜在的合并冲突以及在准备好时手动整合远程更新提供了基础。养成经常运行 git fetch(尤其是带 --prune)的习惯,是保持本地视图与远程仓库同步且整洁的关键。当你需要安全地“看看远程发生了什么”时,git fetch 是你的首选命令。
1738

被折叠的 条评论
为什么被折叠?



