對於Git的初學者,個人建議先學習Git命令行,然後再去使用圖形化工具,這樣才會對整個Git的工作流有一個完整的了解。今天我們要來學習的工具是SourceTree,一款非常好用的Git可視化工具。我今天的操作都將在Mac上進行,並且以iOS項目作為演示。因為對於使用Git的公司,SourceTree還是非常流行的。
(1)在這裡,我們把遠程倉庫搭建在Github上面,現在我的遠程倉庫為: https://github.com/chenyufeng1991/UseSourceTree 。
(2)打開SourceTree,點擊New Repository-->Clone from URL, 然後復制倉庫地址 https://github.com/chenyufeng1991/UseSourceTree.git 到SourceTree中的Source URL中,本地倉庫的位置和名稱可以隨意修改。如圖:點擊clone即可。這樣就能把遠程倉庫中的項目clone到本地了。
。
(3)clone項目完成後,SourceTree中看到如下:
上面的任務欄分別有commit(提交)、Pull(更新代碼)、Push(推送代碼)、Fetch(抓取代碼),Branch(新建分支)、Merge(合並代碼)、Stash(暫存代碼狀態)。
左側中的WORKSPACE表示本地的工作區,file status中可以看到本地文件的改變狀態,History中是commit歷史。下面的BRANCHES顯示的是本地的分支。REMOTES顯示的是遠程的分支。
下方的狀態欄顯示本次提交的修改文件。以及修改文件中修改的代碼。
(4)如果上述是別人的一個項目,那麼此時你就可以在本地進行開發了。但是如果是你自己要在遠程創建自己的項目,那麼下面你要在本地先創建一個項目。我以Xcode創建一個iOS項目為例,我創建的項目名稱為UseSourceTree_iOS. 然後把該項目拖入到clone下來的本地倉庫中。拖入完成後,SourceTree就顯示如下:
。
可以在SourceTree中可以看到工作區中的改變,比如哪些文件被修改,以及修改的內容。
(5)本地做了修改後,可以看到文件都還是在Unstaged files中,勾選你要提交的文件,然後文件就會到Staged file中,這個操作對應的命令就是git add ,即把文件從工作區放到暫存區。操作完成後,如下所示:
。
(6)此時就可以進行commit操作了。點擊左上角的commit。在commit的時候強烈推薦寫上注釋。
。
完成comm之後,提交歷史就會變成如下所示。1 ahead表示本地提交比遠程提交領先一次commit。
。
來到不同的分支,比如master分支,點擊不同的commit History,可以查看到文件的修改,非常的方便。可視化工具對於code review非常有利。
。
(7)本地完成commit之後,就需要向遠程倉庫提交代碼了。個人建議,在Push之前,先進行Pull。
但是要注意,pull = fetch + merge,你拉取代碼的時候選擇的是pull還是fetch,還是使用rebase,這個要根據你的個人習慣,最主要的是要根據你團隊的Git工作流來操作。個人的建議是用git pull --rebase命令,相當於使用git fetch + git rebase命令,而不是使用merge,這主要是為了保持樹結構和歷史的干淨(推薦去了解一下git merge 和git rebase的區別)。
點擊上方的Pull拉取代碼。
。
在進行PUll的時候,可以選擇遠程的分支,同時如果勾選了最後一個“Rebase instead of merge”,表示使用rebase命令,而不是merge。
(8)完成更新代碼後 ,就可以向遠程提交代碼了。點擊上方的Push,彈出如下對話框。
。
在提交的時候,選擇要提交的分支即可。此時可能需要你輸入Github或者其他的遠程的用戶名和密碼,輸入即可。(注意:此時輸入的用戶名和密碼與.git配置裡面的name和email不是同一個概念。此時要你輸入的用戶名和密碼只和你的遠程服務器有關,和git無關,因為你要向服務器推送代碼,必然要有權限,這個用戶名和密碼相當於權限。但是.git裡面的name和email只是作為你git這個工具標記而已,和遠程服務器沒有關系。)
。
(9)Push完代碼後,可以在提交歷史中看到自己和別人的提交。如圖:
。
此時,本地和遠程已經保持了同步,所以原來的1 aHead就消失了。來到Github中,發現代碼已經成功提交了。
。
(10)此時,如果其他開發者向遠程倉庫提交了代碼,那麼在你的SourceTree中就會顯示如下,
。
在你本地的master分支下,可以看到1 behind,表示你本地的分支已經落後於遠程分支1 commit了。可以選擇Pull來更新代碼。
(11)如果遠程倉庫有其他的分支,那麼我需要checkout(檢出)遠程分支到本地,如圖,遠程有dev分支,雙擊左側遠程的dev分支,即可檢出。檢出的時候還可以重命名本地該分支的名字:
。
checkout完成後,本地也就有dev分支了:
。
(12)在SourceTree中經常會出現track這個詞,表示“跟蹤”,表示本地某個分支跟蹤遠程某個對應的分支。所以,判斷是ahead還是behind commit的時候,都是去和track的那個分支進行比較的。雙擊本地的某個分支即可完成分支切換。
(13)當你在本地新建某個分支的時候,也可以推送到遠程,然後遠程就會有該分支了。如下所示,我在SourceTree中新建了release分支,但是遠程沒有release分支。我把該分支進行Push:
。
然後就發現遠程也有release分支了:你要確定是否有某個分支,你也可以去Github或者其他遠程服務器查看。
。
(14)當然你也可以在SourceTree中刪除本地或者遠程的一個分支,刪除分支是個很謹慎的操作,需要慎重。
。
總結下,Git是一個分布式的版本控制工具,功能非常強大,推薦大家先好好掌握命令行,再去使用GUI,就會發現特別簡單。圖形操作和命令行也是能夠一一對應的。我今天講到的SourceTree功能,也只是其中一部分,但是這一部分也是最為常用的。熟練使用還是需要在團隊協作中去掌握。下面的貼出的Git供大家查詢和比對。