git pull 与 git fetch 的区别

2020-12-24 22:52:26

再探git基本操作(pull与fetch)的区别

今天恰逢一个实习生不清楚在使用git发生冲突时如何去处理,所以就给他说了git在工作上的一般使用以及拉取与获取的区别,然后自己也温习了一下。

平时使用git都是基于图形化界面 SourceTree 的,很方便。界面上有两个按钮:

  • git pull:拉取。即从远程仓库拉取最新版本文件到本地,自动合并/merge。
  • git fetch:抓取,获取。即从远程获取最新版本文件到本地,不自动合并/merge。

下面来了解两个概念:

  • FETCH_HEAD:版本链接,记录在本地的一个文件中,指向着目前已经从远程仓库取下来的分支的末端版本
  • commit-id:每次本地工作完成后,都会做一个git commit 操作来保存当前工作到本地的repo, 此时会产生一个commit-id,这是一个能唯一标识一个版本的sha1 hash值。

接着我们可以到自己本地的git仓库目录去看看:
随便打开一个仓库然后在命令行中执行命令ls -a查看所有文件。
我们会发现一个叫『.git』的隐藏文件夹,cd 进入这个文件夹,执行ls命令然后会发现一个名为『FETCH_HEAD』的文件,就是上面提到的版本链接,

接着我们可以cat一下文件名查看他的内容。

记录的是一段hash,指向远程仓库一个版本。
然后同级还有一个refs文件夹,里面包含三个文件夹:heads、remotes、tags。
heads 和 remotes 分别记录的就是本地和远程不同仓库的最新 commit id

接下来我们可以直接在代码托管平台对仓库进行修改并提交:
本地测试仓库使用的master分支
1.这里我们测试选用coding平台,先看看历史记录

2.本地查看 commit-id

  • 进入 .git/refs/remotes/origin目录,查看master可以看到远程仓库id值:c4b84ea
  • 进入 .git/refs/heads目录,查看master可以看到本地仓库id值:c4b84ea

3.接着在coding的web端修改readme文件并提交,再次查看项目提交历史

4.本地仓库执行git fetch并查看 commit-id

  • 进入 .git/refs/remotes/origin目录,查看master可以看到新的远程仓库id值:f8dfd95
  • 进入 .git/refs/heads目录,查看master可以看到旧的本地仓库id值:c4b84ea

    这里我们知道:执行git fetch时会把远程仓库的最新commit-id同步到了本地。
    然后查看README文件发现并没有与web端修改的同步。

5.本地仓库执行git pull并查看 commit-id

  • 进入 .git/refs/remotes/origin目录,查看master可以看到新的远程仓库id值:f8dfd95
  • 进入 .git/refs/heads目录,查看master可以看到新的本地仓库id值:f8dfd95

    发现 commit-id 都更新了,然后README文件也是最新内容。

这里我们对拉取与获取的理解就更深刻一些了吧(🐶)。

本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-ND 3.0 许可协议。可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。

扫描下方二维码阅读当前文章

浏览器、微信扫码

评 论:

好文推荐
每天进步一点点~