fetch、pull 命令详细介绍

这篇具有很好参考价值的文章主要介绍了fetch、pull 命令详细介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

fetch、pull 命令详细介绍

在上一章 使用 GitHub 远程仓库 文章中我们简单介绍了一下 fetch 和 pull 的使用,现在我们来深入了解一下这两个命令。

fetch

回顾一下上一章的可视化图

fetch、pull 命令详细介绍,git,git

我们通过 git fetch 命令更新的只是本地的追踪分支( origin/main )

fetch、pull 命令详细介绍,git,git

分支相关

新增

如果此时远程仓库中多了一个 dev 分支,我们可以通过 git remote show origin 命令来查看远程仓库的分支状态:

fetch、pull 命令详细介绍,git,git

从上面的描述中我们就可以知道远程仓库中新增了一个 dev 分支,并且我们在下一次的 fetch 命令中就会在本地建立一个 remotes/origin/dev 追踪分支。

fetch、pull 命令详细介绍,git,git

我们通过 fetch 命令更新的代码并不会在本地新创建一个分支与新的本地追踪分支建立关系,我们需要手动通过 git checkout <branchName> 命令把这个本地追踪分支取出来并自动帮我们建立起一个同名的「本地分支」,所以我们根本不用担心没有本地分支的情形。

fetch、pull 命令详细介绍,git,git

这时候在执行 git remote show origin 命令就会发现 dev 分支已被追踪了:

fetch、pull 命令详细介绍,git,git

删除

我们把刚刚远程仓库创建的 dev 分支给删除掉:

fetch、pull 命令详细介绍,git,git

我们通过 git remote show origin 命令就可以发现提示 dev 分支过期了:

fetch、pull 命令详细介绍,git,git

此时我们可以通过提示的 git remote prune 或者 git fetch --prune 命令去删除本地的追踪分支(本地分支仍存在)

fetch、pull 命令详细介绍,git,git

git fetch 并不会更新我们的本地分支,也不会修改我们「工作目录」上的文件。理解这一点很重要,因为许多开发人员误以为执行了 git fetch 以后,他们本地仓库就与远程仓库同步了。它可能已经将进行这一操作所需的所有数据都下载了下来,但是并没有修改我们本地的文件。

merge

fast-forward

而我们如果想要更新本地的 main 分支,就要执行 git merge origin/main 命令,在这种情况下,main 分支没有额外的 commit 操作,在执行 merge 命令时只需要修改 .git/refs/heads/master 的内容,将其改为最新的「commit 对象」的 hash 值即可(也就是移动指针)。这样分支的合并线是一条直线,这个过程叫做 fast-forward。

fetch、pull 命令详细介绍,git,git

通常,合并分支时,Git 会用 fast-forward 模式,但这种模式下,删除分支后,会丢掉分支信息。

我们可以来看一个示例:

fetch、pull 命令详细介绍,git,git

此时 dev 和 master 分支都处于同一个 commit,在 dev 分支上提交几次。

fetch、pull 命令详细介绍,git,git

dev 分支领先 master分支两个 commit。

我们使用之前 git 的安装 文件提到的 sourceTree 工具来看看分支图谱:

fetch、pull 命令详细介绍,git,git

可以看到是处于一条直线上的,切换到 master 分支后执行 git merge dev 命令即可实现 fast-forward 合并。

fetch、pull 命令详细介绍,git,git
fetch、pull 命令详细介绍,git,git

如果我们把 dev 删除了,那么之后的历史记录里就没有这个分支记录了。

fetch、pull 命令详细介绍,git,git

no-fast-forward

如果我们想保存分支的记录,可以在 merge 的时候添加 –-no-ff 参数,这样就可以在合并的时候添加多一个 merge 相关的 commit。

fetch、pull 命令详细介绍,git,git
fetch、pull 命令详细介绍,git,git

我们通过 git log 命令可以很明显的看到这个 commit:

fetch、pull 命令详细介绍,git,git

这时候删除 dev 分支,图谱上依旧能明显看到之前是存在一个分支的:

fetch、pull 命令详细介绍,git,git

three way merge

在 git 中分支的概念及使用 文章中提到,合并操作通常都要解决冲突问题:

比如:

fetch、pull 命令详细介绍,git,git

在上图中,远程 main 分支领先本地追踪分支( origin/main ) 3 个 commit,在本地 main 分支中又存在两个 commit,此时执行了 git fetch 命令后,分支情况如下:

fetch、pull 命令详细介绍,git,git

在执行 merge 命令时就会形成如下的结构,跟 no-fast-forward 类似,也会形成一个 merge commit。

fetch、pull 命令详细介绍,git,git

注意:此时 origin/main 的指针并不会变,只有在执行了 push 命令的时候才会更新。

推送到远程仓库后,此时本地分支和本地追踪分支才处于同一状态:

fetch、pull 命令详细介绍,git,git

FETCH_HEAD 文件

我们在执行 fetch 命令的时候,会在 .git 目录下生成一个 FETCH_HEAD 文件。

示例存在 master 、dev、dev-beta 三个分支:

fetch、pull 命令详细介绍,git,git
fetch、pull 命令详细介绍,git,git

上图展示就是的通过 fetch 从远程仓库里的分支最新状态,我们同时可以很明显看到第一行是没有 not-for-merge 标识的,在执行 fetch 命令时当前「工作目录」所处的分支对应的远程分支信息就 FETCH_HEAD 文件里的第一行。

我们切换一下成 dev 分支在 fetch 一下就会发现 FETCH_HEAD 文件的第一行是 远程 dev 分支的信息:

fetch、pull 命令详细介绍,git,git
fetch、pull 命令详细介绍,git,git

至于 not-for-merge 这个标识的作用我们在 pull 命令部分在讲解。

ORIG_HEAD 文件

在执行 pull 或者 merge 命令后会将当前分支最新的一次提交的 hash 值留在 ORIG_HEAD(只存在最新的一条,后续出现的 hash 会覆盖掉原来的)。

比如说我们要合并本地追踪分支的最新状态,先看看 dev 分支最新一次的commit:
fetch、pull 命令详细介绍,git,git

之后执行 git merge origin/dev 进行合并,此时会生成一个 merge commit 同时也会把 dev 分支在合并前的最新那次 commit 的 hash 值(上图中的 53fe05… )记录入到 ORIG_HEAD 文件中。

fetch、pull 命令详细介绍,git,git

fetch、pull 命令详细介绍,git,git

如果不满意此时的合并结果,就可以通过 git reset --hard ORIG_HEAD 命令可以回退到之前的版本。

fetch、pull 命令详细介绍,git,git

可以从 git log 命令看到 dev 分支的最新 commit 又回退到之前的(53fe05…)

pull

上一章 提到 git pull 命令其实包含了 fetch 、 merge 两个命令。

前面说到执行 fetch 命令会生成一个 FETCH_HEAD 文件,里面有些分支会有 not-for-merge 标识,这个就是告诉 Git 这些分支拉取到的新内容不需要自动 merge,只有当前分支才需要 merge:

我们来看个示例:

当前远程 master 和 dev 分支都存在更新,我们在 master 分支执行 pull 命令:

fetch、pull 命令详细介绍,git,git

在上图中第一条红线及绿线都标识了从远程仓库获取到了新内容;第二条红线则是标注了本地的 master 分支进行 merge,是一个 fast-forward。而 dev 却没有 merge,如果我们想要合并,可以切换成 dev 分支后执行 merge 或 fetch 命令。

如果我们不清楚,不确定 git pull 代码是否会存在冲突,可以使用 git fetch,然后使用 git diff origin/<branchName> 查看差异之后自行合并文章来源地址https://www.toymoban.com/news/detail-822899.html

到了这里,关于fetch、pull 命令详细介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【git 使用】git pull 和 git fetch 的区别

    恕我直言,我一直都用 git pull 从来没有用过 git fetch git fetch , git pull 都可以 用于获取远程仓库的内容,但它们有不同的作用和用法。 git fetch 用途 : git fetch 用于从远程仓库获取最新的提交,但不会自动合并或更新本地分支。 操作方式 :它会将远程仓库中的提交下载到本地

    2024年02月22日
    浏览(57)
  • git fetch, git pull, git merge, git rebase

    背景: 我们发现很多同学习惯性用git pull拉取远端仓库代码, 但是这会带来一个问题,如果有了本地commit再git pull的话,会产生一个merge commit, 这样的merge commit会导致git log分支节点很多,很乱。 首先聊一聊git pull,git merge,git rebase这些常听到的命令吧,初入git的同学一定还

    2024年02月03日
    浏览(58)
  • 0065__git fetch, git pull, git merge, git rebase

    git fetch, git pull, git merge, git rebase_git pull和merge_送你一朵小莲花的博客-CSDN博客

    2024年02月09日
    浏览(58)
  • git pull无效,显示 * branch master -> FETCH_HEADAlready up to date. pull无效解决方法

    本地文件夹中删除文件后 ,git pull无效。显示如下: 命令如下: 比如错删a.txt: 一个命令恢复全部文件: 参考文章如下: 【Git 教程系列第 22 篇】删除本地文件后,使用 git pull 命令从远程仓库无法拉取到被删除文件的解决方案_git 删除本地文件再pull没有_Allen Su的博客-CSDN博客

    2024年02月15日
    浏览(57)
  • SSH连接下Git fetch/pull/push 速度太慢的一些解决办法

    有时候某些git的代码库在fetch远端的时候会非常慢,速度只有几十k或者几k。这个速度拉取一整个代码库可能要花费一晚上或者一天时间。甚至在每天更新已有代码库时候也会花上十分钟。可以尝试一下这些方法来提升拉取远端代码的速度: 1. Git 版本过低的话可能会导致这个

    2024年02月10日
    浏览(55)
  • git常用命令之Fetch

    Further Reading : git git fetch 、git fetch origin、 git fetch origin master 区别 Further Reading : git fetch时 FETCH_HEAD和.gitrefsremotesorigin会有哪些变化 拓展:Git常用命令汇总

    2024年02月11日
    浏览(38)
  • git pull & git push的详细使用

    git pull 常用 pull意为拉,这里引申为拉取代码。 在Git命令中使用pull,会将你的远程代码拉取到本地并进行合并 格式: 如果远程分支是与当前分支合并,则冒号后面的部分可以省略。 比如一般的,在公司中,我们都会自己在本地建一个和公司分支名相同的分支,这里取名为

    2024年02月06日
    浏览(49)
  • (已解决) 使用git pull命令拉取别人的代码后,本地代码消失不见的问题

    今天在写项目的时候,我在写完后习惯性的把本地代码提交到远程仓库,提交前需要先pull一下。 以往pull几乎没遇到过什么问题,而这次pull完以后我发现花了一晚上写的组件居然没有了!!心急如焚的我立刻上网寻找解决方法,好在最后终于解决了问题,长吁一口气 下面把

    2024年04月15日
    浏览(66)
  • 删除本地文件后,使用 git pull 命令从远程仓库无法拉取到被删除文件的解决方案

    一、问题描述: 从git上拉取文件后,在本地有修改文件,导致文件爆红。然后修改的内容又不想提交,就把爆红的文件删除掉了,想重新从git上拉取,但是此时却拉取不成功了。(虽显示已更新,但并未成功)  1.git pull 2.git status查看当前的状态,也提示了有被删除的文件。 二

    2024年01月18日
    浏览(64)
  • Git的常用命令介绍

    Git整体工作流程: Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 一、版本仓库:  1.通过命令 git init 把这个目录变成git可以管理的仓库(这就欧科啦) (会生成.git 文件)默认.git 文件不显示 2. git add  xxxxx  (将工作区的指定文件添加

    2023年04月08日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包