git fetch与git pull的区别详解
gitfetch和gitpull都可以将远端仓库更新至本地那么他们之间有何区别?想要弄清楚这个问题有有几个概念不得不提。
FETCH_HEAD:是一个版本链接,记录在本地的一个文件中,指向着目前已经从远程仓库取下来的分支的末端版本。
commit-id:在每次本地工作完成后,都会做一个gitcommit操作来保存当前工作到本地的repo,此时会产生一个commit-id,这是一个能唯一标识一个版本的序列号。在使用gitpush后,这个序列号还会同步到远程仓库。
有了以上的概念再来说说gitfetch
gitfetch:这将更新gitremote中所有的远程仓库所包含分支的最新commit-id,将其记录到.git/FETCH_HEAD文件中
gitfetch更新远程仓库的方式如下:
gitfetchoriginmaster:tmp //在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支 gitdifftmp //来比较本地代码与刚刚从远程下载下来的代码的区别 gitmergetmp //合并temp分支到本地的master分支 gitbranch-dtemp //如果不想保留temp分支可以用这步删除
(1)如果直接使用gitfetch,则步骤如下:
- 创建并更新本地远程分支。即创建并更新origin/xxx分支,拉取代码到origin/xxx分支上。
- 在FETCH_HEAD中设定当前分支-origin/当前分支对应,如直接到时候gitmerge就可以将origin/abc合并到abc分支上。
(2)gitfetchorigin
只是手动指定了要fetch的remote。在不指定分支时通常默认为master
(3)gitfetchorigindev
指定远程remote和FETCH_HEAD,并且只拉取该分支的提交。
这个命令会访问远程仓库,从中拉取所有你还没有的数据。执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
如果你使用gitclone命令克隆了一个仓库,命令会自动将其添加为远程仓库(gitremote-v)并默认以“origin”为简写。所以,gitfetchorigin会抓取克隆(或上一次抓取)后新推送的所有工作。必须注意gitfetch命令会将数据拉取到你的本地仓库-它并不会自动合并或修改你当前的工作。当准备好时你必须手动将其合并入你的工作。
如果你有一个分支设置为跟踪一个远程分支,可以使用gitpull命令来自动的抓取然后合并远程分支到当前分支。这对你来说可能是一个更简单或更舒服的工作流程;默认情况下,gitclone命令会自动设置本地master分支跟踪克隆的远程仓库的master分支(或不管是什么名字的默认分支)。运行gitpull通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
gitpull:首先,基于本地的FETCH_HEAD记录,比对本地的FETCH_HEAD记录与远程仓库的版本号,然后gitfetch获得当前指向的远程分支的后续版本的数据,然后再利用gitmerge将其与本地的当前分支合并。所以可以认为gitpull是gitfetch和gitmerge两个步骤的结合。
gitpull的用法如下:
gitpull<远程主机名><远程分支名>:<本地分支名> //取回远程主机某个分支的更新,再与本地的指定分支合并。
因此,与gitpull相比gitfetch相当于是从远程获取最新版本到本地,但不会自动merge。如果需要有选择的合并gitfetch是更好的选择。效果相同时gitpull将更为快捷。
注:用gitpull更新代码的话就比较简单暴力了但是根据commitID来看的话,他们实际的实现原理是不一样的,所以不要用gitpull,用gitfetch和gitmerge更加安全。
到此这篇关于gitfetch与gitpull的区别详解的文章就介绍到这了,更多相关gitfetch与gitpull区别内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!