git fetch用法
绝大部分的人都会直接 pull,偶尔 fetch。但是这 2 个到底有什么不同呢?

应该用 Fetch 还是 Pull
应该 Pull 是绝大部分的情况。
针对 Git 使用的是分支管理代码,可以这样理解,在你对你的分支进行 Pull 之前,Git 就会 fetch 一下,当然这个 Fetch 只 Fetch 你的分支,如果你还需要看看其他的分支的话,那么你最好执行下 Fetch 命令。
git fetch
可以理解的就是 fetch 就是把本地仓库和远程仓库同步下,把远程仓库中的修改拉到你本地仓库里面来,但是不会做任何操作。
一旦远程主机的版本库有了更新(Git术语叫做commit),需要将这些更新取回本地,这时就要用到git fetch命令。
将某个远程主机的更新全部取回本地
git fetch 命令通常查看其他人的进程,因为取回的代码对你本地的分支开发代码没有应影响。
➜ git-test git:(main) git fetch origin
From xxxxxx
* [new branch] bb -> origin/bb
* [new branch] test1 -> origin/test1
* [new branch] test2 -> origin/test2
取回特定分支的更新
$ git fetch [远程主机名] [分支名]
例如,取回origin主机的main分支,如下:
➜ git-test git:(main) git fetch origin main
From xxxxxx
* branch main -> FETCH_HEAD
注意:取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取。比如origin主机的master,就要用origin/master读取。
将远程仓库的特定分支拉取到本地
git fetch origin branch_name:local_branch_name
这里 `origin` 是远程仓库的默认名称,`branch_name` 是你想要拉取的分支名称,,`local_branch_name` 是你本地想要创建的分支名称。
切换到该分支
git checkout local_branch_name
git fetch origin branch_name:branch_name和git fetch origin branch_name的区别
- `git fetch origin branch_name:branch_name` 会从远程获取指定分支并更新本地同名分支。如果本地没有同名分支,会创建一个新的。
- `git fetch origin branch_name` 仅从远程获取指定分支的更新,但不会更改本地分支的状态,也不会创建本地分支。
简而言之,前者更新和创建本地分支,后者只获取远程数据。
代码合并
在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支。
$ git fetch origin master:temp
比较本地代码与刚刚从远程下载下来的代码的区别。
$ git diff temp
合并temp分支到本地的master分支。
$ git merge temp
如果不想保留temp分支,删除。
$ git branch -d temp
图解剖析
git clone命令会为你自动将远程主机命名为 origin,拉取它的所有数据,创建一个指向它的 master 分支的指针,并且在本地将其命名为 origin/master。同时git也会给你一个与 origin 的master 分支在指向同一个地方的本地 master 分支,这样你就有工作的基础。

然后,远程库有人推送,提交了C0和C1:

本地提交了D0和D1,只要你不与 origin 服务器连接,你的 origin/master 指针就不会移动。

如果要同步远程库到你的工作,运行命令:
git fetch origin
注意:这个命令查找 “origin” 是哪一个服务器,从中抓取本地没有的数据,并且更新本地数据库,移动 origin/master 指针指向新的、更新后的位置。

要特别注意的一点是 fetch 抓取到新的远程跟踪分支时,本地的工作区(workspace)不会自动生成一份可编辑的副本,抓取结果是直接送到版本库(Repository)中。打个比方,在远程库 origin 新建了一个分支 dev,git fetch 后本地不会生成一个新的分支 dev(可用 git branch 查看),只有一个不可以修改的 origin/dev 指针。
如果想要在 origin/master 分支上工作,可以新建分支 test 并将其建立在远程跟踪分支之上:
git checkout -b test origin/master
这会给你新建一个用于工作的本地分支 test,并且起点位于 origin/master。

如果想把拉取的结果合并到本地分支,需要手动合并。使用如下命令:
git chekout master
git merge origin/master

然而,看到上面的合并结果会想到命令 git pull 。
在大多数情况下它的含义是一个 git fetch 紧接着一个 git merge 命令,即 git pull 是 git fetch 和 git merge 的两步的和。但是由于 git pull 的使用经常令人困惑,所以通常单独显式地使用 fetch 与 merge 命令会更好一些。
本地 master分支 和 origin/master 有什么区别
本地 `master`**:你在本地机器上工作的分支,包含你本地的提交历史。
`origin/master`**:远程仓库(通常为 GitHub、GitLab 等)上 `master` 分支的快照,可以理解为是一个远程跟踪分支,表示最后一次从远程获取的状态。
用途
- 本地 `master`**:用于开发和提交代码。你可以在上面进行修改、添加新功能或修复 bug。
- `origin/master`**:用于跟踪远程 `master` 分支的状态,帮助你了解远程分支的最新变化。
同步
- 本地分支可以通过 `git push` 将更改推送到 `origin/master`,或通过 `git pull` 合并远程更改到本地分支。
更新
- 使用 `git fetch` 更新 `origin/master` 的信息,但不自动合并;使用 `git pull` 则会更新并合并。
总结来说,本地 `master` 是你的开发环境,而 `origin/master` 是远程的参考,用于协作和同步代码。
注意:VSCode 的 GitLens 插件会在你查看远程分支时自动执行 `fetch` 操作,以确保显示最新的远程分支信息。这有助于你获取远程仓库的最新变化,保持同步。

浙公网安备 33010602011771号