基础
理解fetch和pull的前提是理解remote仓库和local仓库以及origin/master
remote仓库保存一个 origin/master
local仓库保存一个 origin/master
local仓库还有一个 master
1.当我们使用
fetch
时,本质是将remote的 origin/master和local 的 origin/master进行更新,而没有触动 local的master
我们可以继续使用
merge
来融合local master 和 local origin/master
2.而
pull
则相当于做了以上两个操作
git fetch
git-fetch – Download objects and refs from another repository
从远程下载仓库,并建立一个origin/master的分支,此分支不可修改。fetch之后,本地修改,而远程仓库未修改则可以直接push,这个是所说的fast-forward。如果fetch之后,本地修改,而远程仓库也修改了,则需要再次fetch,然后merge,才能push。
git fetch origin rbranch:lbranch
origin:远程仓库
rbranch:远程分支
lbranch:本地分支,如果本地没有该分支,默认会创建一个分支
1.冲突解决1
本地
pull
remote仓库后,master 分支本地进行了一次提交,而remote仓库也被别人进行了一次提交,则会看到
[ahead 1, behind 1]
。意思是本地仓库的最新
commit1
领先本地的
origin/master
1次,而remote仓库的
origin/master
(本地对应的,既上次pull的)距离最新的提交落后1次。如果修改的是同一个文件,则可能产生冲突。
$ git branch -v
dev c58cc5a d
* master 7ef62bb [ahead 1, behind 1] m
$ git status -v
On branch master
Your branch is ahead of 'origin/master' by 1 commit. # 只提示了本地,而branch还提示了remote
(use "git push" to publish your local commits)
nothing to commit, working tree clean
$ git fetch -v
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From 192.168.1.103:xyw/test
3805326..3708617 master -> origin/master # 不同步
= [up to date] dev -> origin/dev # 本地的origin/dev 和远程的origin/dev 同步(up to date)
这时如果使用
push
则会产生冲突:因为local版本库和remote版本库commit链式结构不同,
$ git push
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'git@/test.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
因此需要使用remote版本仓库,来更新local版本仓库。首先我们使用
pull
:
$ git pull
Auto-merging master.txt
CONFLICT (content): Merge conflict in master.txt
Automatic merge failed; fix conflicts and then commit the result.
可以看到提示有冲突,这时需要我们手动解决冲突,然后再进行
commit
提交
<<<<<<< HEAD # 这个是本地提交的内容
dev3
======= # ==上面是本地提交的内容,下面是远程提交的内容,需要手动修改,把这些提示(<<<<<< ===== >>>>>)去掉和冲突(dev3 dev2)解决
dev2
>>>>>>> 370861755... # 这个是远程仓库的内用
master2
除了
pull
之外,我们还可以使用
fetch
来手动先将remote仓库的分支获取,这时本地会有新的分支
orign/master
然后再
merge
origin/mater
分支。
git fetch <远程主机名> <分支名>
git merge origin/mater
无论
pull
还是
fetch merge
操作,在解决冲突后,都要重新
commit
,然后再
push
2.冲突解决2
另一种方法是新建一个分支
git fetch origin master:tmp
//在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支
git diff tmp
//来比较本地代码与刚刚从远程下载下来的代码的区别
git merge tmp
//合并temp分支到本地的master分支
git branch -d temp
//如果不想保留temp分支 可以用这步删除
git fetch [<options>] [<repository> [<refspec>…]]
git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)…]
git fetch --all [<options>]
git fetch <远程主机名>
git fetch <远程主机名> <分支名>
git pull
git-pull – Fetch from and integrate with another repository or a local branch
git pull origin rbranch:lbranch
git pull [options] [<repository> [<refspec>…]]
git pull = git fetch + git merge
参考文献:
详解git pull和git fetch的区别
https://git-scm.com/docs/git-fetch
https://git-scm.com/docs/git-pull
https://blog.csdn.net/qq_16123279/article/details/82858962