git fetch & pull

  • Post author:
  • Post category:其他




基础

理解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



版权声明:本文为claroja原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。