真正理解 git fetch, git pull git
要講清楚git fetch,git pull,必需要附加講清楚git remote,git merge 、遠程repo, branch 、 commit-id 以及 FETCH_HEAD。ruby
1. 【git remote】首先, git是一個分佈式的結構,這意味着本地和遠程是一個相對的名稱。分佈式
本地的repo倉庫要與遠程的repo配合完成版本對應必需要有 git remote子命令,經過git remote add來添加當前本地長度的遠程repo, 有了這個動做本地的repo就知道了當遇到git push 的時候應該往哪裏提交代碼。fetch
2. 【git branch】其次,git天生就是爲了多版本分支管理而創造的,所以分支一說,不得不提, 分支就至關因而爲了單獨記錄軟件的某一個發佈版本而存在的,既然git是分佈式的,便有了本地分支和遠程分支一說,git branch 能夠查看本地分支, git branch -r 能夠用來查看遠程分支。 本地分支和遠程分支在git push 的時候能夠隨意指定,交錯對應,只要不出現版本從圖便可。spa
3. 【git merge】再者,git的分佈式結構也很是適合多人合做開發不一樣的功能模塊,此時若是每一個人都在其各自的分支上開發一個相對獨立的模塊的話,在每次release製做時都需先將各成員的模塊作一個合併操做,用於合併各成員的工做成果,完成集成。 此時須要的就是git merge.開發
4.【git push 和 commit-id】在每次本地工做完成後,都會作一個git commit 操做來保存當前工做到本地的repo, 此時會產生一個commit-id,這是一個能惟一標識一個版本的序列號。 在使用git push後,這個序列號還會同步到遠程repo。rem
在理解了以上git要素以後,分析git fetch 和 git pull 就再也不困難了。 同步
首先,git fetch 有四種基本用法it
1. git fetch →→ 這將更新git remote 中全部的遠程repo 所包含分支的最新commit-id, 將其記錄到.git/FETCH_HEAD文件中io
2. git fetch remote_repo →→ 這將更新名稱爲remote_repo 的遠程repo上的全部branch的最新commit-id,將其記錄。
3. git fetch remote_repo remote_branch_name →→ 這將這將更新名稱爲remote_repo 的遠程repo上的分支: remote_branch_name
4. git fetch remote_repo remote_branch_name:local_branch_name →→ 這將這將更新名稱爲remote_repo 的遠程repo上的分支: remote_branch_name ,並在本地建立local_branch_name 本地分支保存遠端分支的全部數據。
FETCH_HEAD: 是一個版本連接,記錄在本地的一個文件中,指向着目前已經從遠程倉庫取下來的分支的末端版本。
git pull 的運行過程:
git pull : 首先,基於本地的FETCH_HEAD記錄,比對本地的FETCH_HEAD記錄與遠程倉庫的版本號,而後git fetch 得到當前指向的遠程分支的後續版本的數據,而後再利用git merge將其與本地的當前分支合併。
參考連接 :
1.https://ruby-china.org/topics/4768
2.http://stackoverflow.com/questions/9237348/what-does-fetch-head-in-git-mean