首页 > 其他分享 >一文读懂 Git fetch 和 Git pull 的终极区别(带实验结果)

一文读懂 Git fetch 和 Git pull 的终极区别(带实验结果)

时间:2024-09-29 14:49:58浏览次数:6  
标签:pull Git git 本地 远端 fetch

Git pull 是一个 Git 命令用来同时执行 git fetch 和 git merge。本文分享了这两个命令的区别和用法。

Git 命令是非常流行的,尤其是在分布式版本控制系统中,可以对远端的仓库进行同步。开发者需要根据项目实际所需来选择合适的命令。在本文章中,我们将解释 git fetch 和 git pull 之间的区别,并且为两者不同的使用场景做一个详述。

Git fetch 和 git pull 的基本知识

Git fetch 和 git pull 都是用来从远端仓库更新信息的 Git 命令。所以,他们有什么区别呢?Git fetch 将更新从远端仓库下载到本地,但是不会对当前工作目录做任何变更。因为变更并没有被合入到本地分支,因此你可以在不打断当前工作流的情况下从远端仓库检出变更。另一方面,git pull 也能像 git fetch 一样从远端仓库拉取最新的变更,但是它却会把变更自动合入到当前分支。相比于 git fetch,git pull 直接将远端仓库的变更应用到本地工作目录中。

什么是 git fetch

git fetch 从远端仓库拉取最新的提交历史,但是不会对当前的本地工作目录产生任何影响。即使在获取(fetch)远端变更后,这些变更也不会在本地分支上有所反应。它的主要用途是:当你想要从远端仓库获取最新的状态,然后对变更被合入到本地仓库之前对变更做预览。为了将获取的变更应用到本地分支,你还需要手动执行 git merge 或者 git rebase。

什么是 git pull

git pull 命令是将 git fetch和 git merge(或 git rebase)结合在了一起。这能够让你从远端仓库拉取(fetch)变更并且将变更自动应用到当前的本地分支上。

当用 git fetch 从远端仓库获取变更时,变更并没有应用到本地分支,而执行 git pull 命令会自动将变更从远端仓库应用到本地分支上。

Git pull 特别适合将远程变更快速反映到本地分支上,但这可能会导致冲突,因此要小心使用,特别是当多人协作时。

什么时候用 git fetch

Git fetch 是一个从远端仓库拉取最新变更信息的命令。获取的信息并不直接反映在本地分支。使用 git pull 命令则会将所有的变更都反映到本地分支上,包括不正确的或者有问题的变更,统统搞到本地分支上。

当变更同时在远端和本地分支上进行时,或者当团队内的新入职员工进行操作时,使用 git fetch 是比较安全的,可以先用 git fetch 获取变更内容,然后再执行 merge 或者 rebase 命令。

什么时候用 git pull

Git pull 是一个比 git fetch 执行更多流程的命令。Git pull 可以同时执行 git fetch 和 git merge 或 git rebase 命令。因此,当你特别希望远端变更能及时反映到本地分支上的时候,就用 git pull 吧。

实验验证

在极狐GitLab 上创建一个 Repo,存储一个 README.md 和 1.txt 文件,其中 1.txt 文件内容如下:

cat 1.txt
1111
2222
3333

首先,保持本地和远端仓库的一致性。然后在远端仓库上将 2222改为 2233。这时候远端仓库和本地仓库之间的代码就存在差异了,本地仓库落后远端仓库一个 commit:

file

Git fetch 验证

根据前面文章的描述,执行 git fetch命令会拉取远端仓库的最新信息,但是不会将其合并到被爱分支。也就是说在本地执行 git fetch命令后,会看到变更拉取的信息,但是查看 1.txt 的内容,依旧是 2222,验证一下结论:


# fetch 变更
git fetch
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Unpacking objects: 100% (3/3), 315 bytes | 315.00 KiB/s, done.
From jhma.jihulab.net:devsecops1/ai
   d143d7e..75eadda  main       -> origin/main

# 查看 1.txt 内容
cat 1.txt
1111
2222
3333

可以看到 1.txt 中依旧是 2222。然后手动执行一下 git merge或者 git rebase,再查看结果:

# 执行 git rebase 命令
git rebase
Successfully rebased and updated refs/heads/main.

# 查看 1.txt 内容
cat 1.txt
1111
2233
3333

Git pull 验证

再对远端代码做一下修改,将 1.txt 中的 3333改为 3322。先确定本地分支上的内容,然后执行 git pull,最后再确认本地分支上的内容:

# 本地分支内容查看
cat 1.txt
1111
2233
3333

# git pull 命令
git pull
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Unpacking objects: 100% (3/3), 321 bytes | 321.00 KiB/s, done.
From jhma.jihulab.net:devsecops1/ai
   75eadda..e66df87  main       -> origin/main
Updating 75eadda..e66df87
Fast-forward
 1.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

 # 再次查看本地分支内容
 1111
2233
3322

可以看到远端分支的 3333直接变成了 3322,直接反映在了本地分支上。

进阶试验

下面来制造一个冲突,来进一步查看 git fetch 和 git pull 之间的差别。整体测试流程为:

  1. 在远端仓库新建一个 branch-1分支;
  2. 将远端仓库中 branch-1分支上的 3333改为 4444;
  3. 将本地 branch-1分支上的 3333改为 5555;
  4. 分别执行 git fetch 和 git pull 命令查看结果

首先看执行 git fetch 的结果:

# 执行 git fetch 命令
git fetch origin branch-1
From jhma.jihulab.net:devsecops1/ai
 * branch            branch-1   -> FETCH_HEAD

# 查看 branch-1 分支上的内容
cat 1.txt
1111
2222
5555

可以看到 1.txt 文件中的 3333 变成了 5555。这个符合预期,因为 git fetch 会拉取变更,但是不会合并到本地分支,接着执行 git merge 或者 git rebase 命令:

git merge
Auto-merging 1.txt
CONFLICT (content): Merge conflict in 1.txt
Automatic merge failed; fix conflicts and then commit the result.

提示冲突,然后打开 1.txt 文件查看:

1111
2222
<<<<<<< HEAD
5555
=======
4444
>>>>>>> refs/remotes/origin/branch-1

可以看到冲突的内容,此时解决冲突的时候,只要确保保留哪些内容即可,比如保留 4444那就把 5555删除,然后重新提交代即可:

# 提交代码
git add . && git commit -m "fix confilict"
[branch-1 77f28b1] fix confilict

# 推动代码
git push origin branch-1
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 2 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 511 bytes | 511.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
remote:
remote: To create a merge request for branch-1, visit:
remote:   http://jhma.jihulab.net/devsecops1/ai/-/merge_requests/new?merge_request%5Bsource_branch%5D=branch-1
remote:
To jhma.jihulab.net:devsecops1/ai.git
   55ce9b9..77f28b1  branch-1 -> branch-1

前面是 git fetch 在面对冲突时候的表现。还是最开始的条件,如果直接执行 git pull 会有什么不同吗?

# 远端 branch-1 分支内容
1111
2222
5555

# 本地 branch-1 分支内容
1111
2222
4444

# git pull 命令
Auto-merging 1.txt
CONFLICT (content): Merge conflict in 1.txt
Automatic merge failed; fix conflicts and then commit the result.

# 查看冲突内容
1111
2222
<<<<<<< HEAD
5555
=======
4444
>>>>>>> a91c399bb2772f5a121830638d138264df27c9ee

剩下的冲突解决和上面的就一样了。

总结

Git fetch 和 Git pull 虽然都是从远端仓库将变更拉取到本地的命令,但是两者在作用上有所不同,简言之:Git fetch 拉取变更但是不将变更应用到本地分支;Git pull 拉取变更同时将变更应用到本地分支,可以理解为 Git pull = Git fetch + Git merge(or rebase)

本文由博客群发一文多发等运营工具平台 OpenWrite 发布

标签:pull,Git,git,本地,远端,fetch
From: https://www.cnblogs.com/jihugitlab/p/18439820

相关文章

  • Git仓库代码在不同操作系统里结尾^M问题的记录
    每次按键盘上的Return时,会插入一个称为行结束符的不可见字符^M。不同的操作系统处理行结束符的方式不同。在使用Git或者GitHub协作处理项目时,Git可能产生意外结果。例如,您在Windows计算机上操作,而您的协作者是在macOS或者Linux中做的更改。您可以将Git配置为自动处理行结束符,以......
  • IDEA更改远程git仓库地址
    前言我们在使用IDEA开发时,一般会配置好对应的git仓库,这样就比较容易对代码进行控制以及协同开发。 但有时候,我们远程的仓库地址由于这样那样的原因,需要迁移(这在爱折腾的企业是常有的事情)。那么,我们该如何在IDEA中更新远程仓库地址呢?如何设置首先,我们点击上方的【Git】按钮,打......
  • Repo:高效管理多Git仓库的工具
    目录一、概述1.1.背景与目的1.2.功能与特点1.3.应用场景1.4.优势与挑战二、初始化项目repoinit 三、同步代码reposync四、分支管理4.1.repostart4.2.repocheckout4.3.repobranch五、代码提交与审核5.1.repoupload5.2.repodownload(概念性)六、其......
  • Linux环境下git仓库的搭建
    (1).参考文献官网在线教程:https://git-scm.com/book/zh/v2官方网站:https://git-scm.com/(2).实验环境2核2GCentOS7.6.1810(3).安装git1)yum或dnf安装[root@VM-0-17-centos~]#dnf-yinstallgit-all2)源码安装安装依赖包[root@VM-0-17-centos~]#dnf......
  • dremio 25.1 github 代码变动
    dremio25.1已经发布了好几个礼拜了,以前说过github社区版25.1版本的没有提交最新的,最近看了下github已经提交新的了而且这次应该是比较完整的构建上的一些问题jdk依赖这个保持不变,同时看官方一些信息对于maven构建已经调整了,有了不错的支持ui组件目前@dremio/dremi......
  • 一些超好用的 GitHub 插件和技巧
    聊聊我平时使用GitHub时学到的一些插件、技巧。‍‍浏览器插件在我的另一篇博客浏览器插件推荐里提到过跟GitHub相关的一些插件,这里重复下:Sourcegraph:在线打开项目,方便阅读,将GitHub变得和IDE一般,集成各种功能,参考爱了爱了,这个GitHub的Chrome神仙插件把我整的......
  • 使用 git reset 命令回退历史
    基于:gitreset命令详解(一)——Git学习笔记07建议先阅读Git工作区、暂存区和版本库、Git分支本质及与commit、HEAD、tag的关系。简介gitreset命令是用来将当前branch重置到另外一个commit的,也就是用来回退到指定commit,根据不同的参数,这个动作可能同时影响到Ind......
  • 使用 Git 帮助文档
    聊聊如何更好地查阅官方文档。‍githelp学习某个工具,官方文档是少不了的,也是最权威的。我们可以使用githelp来查看帮助,该命令会列举出常用的命令和介绍:>githelpusage:git[--version][--help][-C<path>][-c<name>=<value>][--exec-path[=<path>]][-......
  • 2款.NET开源且免费的Git可视化管理工具
    Git是什么?Git是一种分布式版本控制系统,它可以记录文件的修改历史和版本变化,并可以支持多人协同开发。Git最初是由Linux开发者LinusTorvalds创建的,它具有高效、灵活、稳定等优点,如今已成为软件开发领域中最流行的版本控制系统之一。Git使用一种名为“仓库”的数据结构来保存代码......
  • GitHub每日最火火火项目(9.27)
    项目名称:localsend/localsend项目介绍:“localsend/localsend”是一个极具价值的开源项目。它为用户提供了一种跨平台的文件传输替代方案,可媲美AirDrop。在当今数字化时代,人们常常需要在不同操作系统的设备之间传输文件,但并非所有设备都能使用AirDrop。这个项目的出......