【Git】git fetch 命令使用介绍

git fetch 是 Git 中一个非常重要且安全的命令,它的核心功能是从远程仓库获取最新的提交历史、分支和标签信息,但不会自动合并或修改你当前的工作目录

主要作用和特点

  1. 获取远程更新:

    • 连接到配置的远程仓库(默认是 origin)。
    • 下载远程仓库中所有分支的最新提交、对象(文件、树、提交等)和标签,这些内容是你本地仓库还没有的。
    • 它让你的本地仓库知道远程仓库当前的状态(比如 main 分支在远程指向了哪个新提交)。
  2. 不修改本地工作:

    • 这是 fetchpull 最根本的区别。
    • git fetch 只下载远程的更新信息到你的本地仓库数据库中。
    • 不会自动:
      • 将远程分支的内容合并到你当前正在工作的本地分支。
      • 更新你工作目录中的文件。
      • 更新你本地分支的指针(比如你的本地 main 分支指针仍然指向原来的提交)。
    • 你的本地修改、暂存区状态以及当前分支的位置都保持不变。这使得 fetch 非常安全,因为它只是“查看”远程有什么更新。
  3. 更新远程跟踪分支:

    • 远程跟踪分支是本地仓库中用来反映远程仓库分支状态的特殊分支。它们的名字通常像 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 --prunegit fetch -p:
    • 在获取更新的同时,清理本地过时的远程跟踪分支
    • 如果远程仓库上某个分支已经被删除了(比如 feature/old 被合并后删掉了),那么本地的 origin/feature/old 分支通常还会保留。
    • 使用 --prune-p 选项会让 Git 检查远程分支的状态,并自动删除本地仓库中那些对应远程分支已经不存在的远程跟踪分支(origin/feature/old)。这是一个很好的习惯,能保持本地仓库的整洁。

为什么使用 git fetch?典型工作流

  1. 安全地查看变化: 在决定将远程更改合并到你的工作之前,你想先看看其他人提交了什么。git fetch 让你可以做到这一点:
    git fetch origin
    git diff main origin/main # 比较你的本地 main 分支和远程 origin/main 分支的差异
    git log origin/main..main # 或者查看 origin/main 上有哪些新提交是本地 main 没有的
    
  2. 审查后再合并: 获取更新后,你可以决定如何整合这些更改:
    • 使用 git merge origin/main 将远程 main 分支的更改合并到你的当前分支。
    • 使用 git rebase origin/main 将你的提交变基到最新的远程 main 分支之上。
    • 这比直接使用 git pull(它相当于 git fetch + git merge)更可控,尤其是在协作环境中,因为你可以先审查代码再合并。
  3. 处理被拒绝的推送: 如果你尝试 git push 但被拒绝(通常因为远程分支有你没有的更新),第一步就是 git fetch 来获取那些你缺失的远程提交,然后决定是合并还是变基来解决差异。
  4. 查看或切换到远程分支: 要查看或工作在远程分支上,你需要先 git fetch 来获取该分支及其最新提交到你的本地仓库。然后你可以:
    • 基于远程跟踪分支创建并切换到新的本地分支:git checkout -b <new-local-branch> origin/<remote-branch>
    • 或者直接切换到远程跟踪分支(进入分离 HEAD 状态):git checkout origin/<remote-branch>

git fetch vs git pull

特性git fetchgit pull
核心动作仅下载远程数据到本地仓库。下载 (fetch) + 合并 (mergerebase)
工作目录不修改工作目录或当前分支。绝对安全。修改工作目录和当前分支(尝试自动合并)。可能存在风险(冲突)。
本地分支不更新你的本地分支指针(如 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 是你的首选命令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晴雨日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值