網上關于Git的使用有太多的博客,文章在講解了,大部分是在講解命令的用法,剩下一部分則在講解git的內部原理,看過講解基礎命令使用的文章后,正常的開發使用是沒有什么問題的了,而如果想更深入的了解git“高級”使用,去看第二類講解內部原理(數據結構,源碼實現)的文章,往往感覺過于“高深”,復雜,(而且對git的使用上并不會有太多幫助),其實介于兩者之間的知識可能對于git進階更有幫助。
Git的原理和使用其實很簡單,看懂下面這張圖就可以了:
上圖轉自伯樂在線上的一篇文章,侵刪。
其實我感覺這應該是某一本講解git原理的書上的配圖(由于學習git過程中都是網上搜索和自悟獲取,沒有看過專門的git書籍,不太清楚是那本書)
為了符合文章的標題,這里只簡單說明下右半部分,這個是大部分基礎使用文章忽略的(基礎使用都會著重講解staging area這部分),而高級教程中對于右半邊又都是一筆帶過,或者大家都不會太注意這部分吧。
git clone之后究竟發生了什么?
- remote repository:這個不用過多解釋,雖然git是分布式的代碼管理工具,但大部分公司,組織都會建立一個集中的代碼倉庫服務器。(這里想到區塊鏈到底后面會發展成半集中式還是完全分布式的呢?)該代碼倉庫存儲著所有開發人員push上去的代碼和branchs。
- 開發者鍵入git clone后,git會將遠端所有的代碼和branchs下載到開發者本地。
- 有人會問,可是我git branch只看到一個branch(默認情況應該是master branch。不過倉庫服務端可以進行配置其他任意branch為默認主分支)。git branch的確只能看到一個branch(在本地沒有進行checkout -b參操作的情況下),因為其他branch需要用git banch -r(Git branch -a)才能看到。
- 這時有人又會問,git branch -r看到的不是遠端的分支嗎?好吧,其實本文的唯一有價值的地方就在這里了。git branch -r看到的不是遠端服務的branchs,而是你的本地的遠端 branchs,git clone后在remote/origin repository區保存一份和此時遠端分支一模一樣的代碼和branchs,而且該區域是不能修改的。
- 如果想修改怎么辦,git checkout -b master origin/master相信大家都用過類似的命令,這個是從遠端拉出一個branch嗎?不是,這是從你的本地的遠端區域里的master branch拉出一個branch。而新拉出的branch就是存儲在你的local repository區域里,這個區域是可以修改的,也就是git branch看到的那些branchs。
理解了以上兩個區域后面有些命令的原理就十分清楚了
- git pull做了什么?
- 大家都知道git pull = git fetch + git merge兩個操作。
- git fetch做了什么?
- git fetch其實是更新下你的本地的遠端代碼區域(remote/origin repository)的數據同服務端的代碼保持一致。
- 基于以上的說明,git pull的最后一步,就是把remote/origin repository區域中的相應的branch(已更新到服務端最新代碼) merge到本地區域(local repository)的branch上。
以上是自己對git對代碼管理上的一些理解,不保證正確性,因為我沒有看過一行git源碼,以上的分析只是從各種文章,流程圖,以及實際使用中推理得出的。只是感覺它應該就是這一個樣子的。希望沒有誤導別人。
最后說下我對git的看法:git不僅僅是一個代碼管理工具,它是一種工作方式,基于git的工作流,你可以高效的進行開發工作,通過git的各種命令的組合使用,基本上可以解決你所遇到的所有問題,你可以告別copy n份代碼,管理n個目錄,告別beyond compare。