前言
本地仓库需要获取远程仓库中的更新,需要用到Git命令pull或fetch,这两个命令在实际使用时有何区别,下面详细介绍下。
使用工具
- Git v2.29.2.2
- TortoiseGit v2.4.0.2
pull 和 fetch 区别
git分为本地仓库和远程仓库,本地的git文件夹中存储了本地仓库分支的commit ID和跟踪的远程仓库分支的commit ID
- .git/refs/head/[本地分支]
- .git/refs/remotes/[跟踪的分支]
两个命令的区别如下:
- git fetch 只更新跟踪的远程仓库分支commit ID,本地仓库分支的commit ID保持不变,需要合并(merge)跟踪的远程仓库中的更新到本地仓库;
- git pull 更新所有仓库的commit ID;
git pull = git fetch + git merge ?下面实际测试验证这个等式是否成立。
测试用例
两个本地仓库GitTest-1和GitTest-2,两个本地仓库对同一文件进行修改,GitTest-1提交修改并推送到远程仓库中,GitTest-2需要获取远程仓库中的更新,并且解决文件更新冲突
pull测试
- GitTest-1更改文件change2.txt提交并推送,GitTest-2更改文件change2.txt
![a31f72e75fedae40ce7a352328d49d21.png](https://img-blog.csdnimg.cn/img_convert/a31f72e75fedae40ce7a352328d49d21.png)
2. GitTest-2拉取(git pull)远程更新,得到以下错误
![4e45d7af5b515696ee38fba21036f6c3.png](https://img-blog.csdnimg.cn/img_convert/4e45d7af5b515696ee38fba21036f6c3.png)
3. GitTest-2根据提示储藏本地修改(stash save),本地的全部改动保存到临时仓库,并撤销了本地的所有改动
4. GitTest-2再次拉取远程更新,因为本地修改已保存,不会报错,这个时候GitTest-2的本地仓库与远程仓库的代码保持一致,而临时仓库中的改动还需要更新,因此操作还要继续
![4a2fd1a47282c148a092237e14744770.png](https://img-blog.csdnimg.cn/img_convert/4a2fd1a47282c148a092237e14744770.png)
5. GitTest-2合并临时仓库中的本地修改(stash pop/apply)到本地仓库,检查临时仓库和本地仓库是否有冲突,提示冲突然后手动解决,两个合并命令的区别如下:
-
- stash pop 会清空stash list
- stash apply 不会清空stask list
![7148137ebb7efc182ce879c28e81c32c.png](https://img-blog.csdnimg.cn/img_convert/7148137ebb7efc182ce879c28e81c32c.png)
6. GitTest-2提交并推送本地修改,至此两个本地仓库代码与远程仓库保持一致
![4959d499220c9375800db2c0a01a6b4e.png](https://img-blog.csdnimg.cn/img_convert/4959d499220c9375800db2c0a01a6b4e.png)
fetch测试
- 与之前一致,首先GitTest-1更改文件change2.txt提交并推送,GitTest-2更改文件change2.txt
![a07ea93eabbe8e1481514e72c737a5cc.png](https://img-blog.csdnimg.cn/img_convert/a07ea93eabbe8e1481514e72c737a5cc.png)
2. GitTest-2 fetch远程更新,更新了跟踪的远程仓库(origin/master),本地仓库(master)未更新
![aee1be5323806b9091436d03501867ca.png](https://img-blog.csdnimg.cn/img_convert/aee1be5323806b9091436d03501867ca.png)
![795080bda3862c7083707878668c11de.png](https://img-blog.csdnimg.cn/img_convert/795080bda3862c7083707878668c11de.png)
3. GitTest-2合并本地仓库的修改到跟踪的远程仓库(git merge FETCH_HEAD)
![4bef2548aaedc710a94ba94782bbf94f.png](https://img-blog.csdnimg.cn/img_convert/4bef2548aaedc710a94ba94782bbf94f.png)
4. GitTest-2提交并推送更新到远程仓库
测试总结
从结果上来看,git pull = git fetch + git merge是成立的,不过过程却不同,尤其是本地仓库的更新方式。