再探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文件也是最新内容。
这里我们对拉取与获取的理解就更深刻一些了吧(🐶)。