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` 操作,以确保显示最新的远程分支信息。这有助于你获取远程仓库的最新变化,保持同步。

posted @ 2024-09-12 18:45  李小菜丶  阅读(1935)  评论(0)    收藏  举报