Git使用 从入门到入土 收藏吃灰系列 (十) 详谈push、fetch、pull

353 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

本节内容速览

  • 二:git push使用
  • 三:git fetch使用、为什么存在git fetch机制
  • 四:git pull使用、git fetchgit pull区别

一、前言

讲讲小张的感受:我没有接触过Git,所以看了很多视频,对于入门使用确实只要知道git clone,git add,git commit,git push,git merge ,确实也就足够了。但是我很好奇背后的原理,为什么要用git add到暂存区而不是直接git commit?很多指令之间为什么要按一定的顺序执行?所以这个系列我以初学的时候,小白的角度从安装到工作原理(有的是我自己的见解,如果感觉不对,欢迎指正),再到实际应用!另外,推荐看一遍第三个参考视频,然后看一下第四个参考视频,对工作原理的讲解和实际应用确实不错!

二、git push上传新的分支

正常情况下直接git push就可以提交到远程仓库。但是在本地新建了一个分支4.0,在git push的时候报错,如下

img-EGvLWshz-1644722586689

这个错误就是 表示本地分支与远程分支之间没有连接起来,所以在git push的时候报错

解决方法 1 只需要在输入 git push -u origin dev(分支名)。这样就可以成功push

解决方法 2

按照git 的提示,执行以下命令:

 git push --set-upstream origin dev

表示将远程 dev 分支和本地 dev 分支相关联。一般新建的分支在push的时候都需要执行这个命令和远端相关联

三、git fetch 拉取远程仓库

新建两个文件夹,分别clone我的一个仓库。模拟两台机器

image-20220119202333836

新建一个分支,当前分支仅存在于本地。而远端没有这个分支,执行git push

image-20220119203733093

img-ksGMb2AT-164472253433

总结:如果本地分支是新建的,也就是说没有设置上流分支,则需要使用git push --set-upstream origin <name>,先设置上流分支。之后的所有提交直接使用git push即可

现在小王想要使用小张这个分支。使用git fetch查看新分支,仅是查看信息,并没有下载本地

image-20220119205117266

利用git branch查看当前本地的分支信息

在这里插入图片描述

通过checkout切换到新分支,现在本地仓库的文件就切换成了新分支。==注意==必须先git fetch,否则checkout无效

img-CHf0DNV2-1644722534338

这里新分支并不需要重新设置上流分支,直接push即可。因为从远程仓库切的分支,git知道它的来源

Q:为什么需要fetch机制

A:每次checkout的时候,Git直接去远程仓库检测是否有该分支。理论上可以,但是实际工作中,使用git是在本地切来切去。只有在团队协作时才需要和远程仓库交互。所以每次checkout都检测远程仓库,浪费网络资源

四、git pull 拉取远程仓库

如果此时小张修改了分支内的内容,再次push到了远程仓库。小王如何将新的变更更新到本地?可以fetch+merge,也可以pull。下载代码并快速合并,如果有冲突,手动合并并提交

# 拉取并合并当前分支	注意:只是当前分支!
git pull 

或者

# 先拉取指定分支,后合并
git fetch origin master # 从远程主机的master分支拉取最新内容 
git merge FETCH_HEAD    # 将拉取下来的最新内容合并到当前所在的分支中

再或者

# 先拉取,后合并
git fetch				# 从远程主机拉取所有分支的最新内容 
git merge <分支名> 	  # 将拉取下来的最新内容合并到当前所在的分支中

另一种情况是如果小张push到远程仓库后,小王把小张的程序修改了,小王是对旧版本做了更改,也push远程仓库就会报错。正常情况下先git pull到本地查看文件改动,如果有冲突,手动改动后再提交(先输入的命令后查看的文本,这里我上下截图顺序错了) image-20220121181717995 以下是后来对文章的改动,因为单独在git merge 发过解决冲突,所以没有截图。避免有小伙伴不会解决冲突,单独解释一下

<<<HEAD 合并前的内容 = = = = = = = = 合并后,远程的内容 '>>>>>>> commitID

打开文本将文本修改为自己想要的样子

自己想要的样子xxxxxxx

然后执行git add .git commit -mgit push

总结

所以建议使用fetch+merge,可以先git fetch,查看远程是否有新的更新?如果没有更新,不返回仍何值

image-20220123181152099

如果有更新再用git merge origin <branch-name>将本地仓库与远程仓库合并

在这里插入图片描述 解决冲突后再进行git push

附三篇我认为不错的文章

详解git pull和git fetch的区别:_马恩光的博客-CSDN博客_git pull和fetch的区别

Git fetch & pull 详解_MuffinFish的博客-CSDN博客_git pull

使用git fetch和git rebase处理多人开发同一分支的问题_azureternite的专栏-CSDN博客

在本节

  • 三、git fetch 拉取远程仓库 部分下载云端分支需要通过git checkout下载仓库中的分支,但是当远程有多个分支需要全部下载下来呢?
  • 或者git clone默认克隆的只是main分支,需要一次下载所有的分支呢?

下节介绍

  • 如何下载指定的云端分支
  • 如何下载所有的云端分支