sourcetreeapp.com 免費(fèi)好用!
作者:邵磊
juejin.im/post/59bc944d51882519777c5e07
前言
作為使用Sourcetree大于3年的我,已熟知git的每一個(gè)功能,并靈活運(yùn)用利用git解決開發(fā)中各式各樣的場(chǎng)景問(wèn)題,我也曾多次在公司內(nèi)部不同小組間分享Sourcetree使用經(jīng)驗(yàn),接下來(lái)給大家分享下這款工具吧。
本文可能是目前網(wǎng)上最全的一篇可視化使用git工具Sourcetree文章。
可能對(duì)于很多開發(fā)來(lái)說(shuō),只要搞懂git的push、pull、解決一些簡(jiǎn)單的沖突命令就好了,事實(shí)上git的功能十分強(qiáng)大,而通過(guò)背命令很難熟記每個(gè)邏輯。當(dāng)然不同的ide開發(fā)環(huán)境都有各種各樣的git插件,操作方法各不相同,不如直接學(xué)個(gè)跨平臺(tái),不受ide限制的git管理工具Sourcetree。不管你做java,還是python、Android都可以使用。
介紹
官方介紹如下:
A free Git client for Windows and MacSourcetree simplifies how you interact with your Git repositories so you can focus on coding. Visualize and manage your repositories through Sourcetree's simple Git GUI.
譯文:
一款強(qiáng)大的Windows和Mac的免費(fèi)Git客戶端sourcetree簡(jiǎn)化你如何與你的Git存儲(chǔ)庫(kù)使您可以專注于編碼。可視化和通過(guò)Sourcetree簡(jiǎn)單的git GUI管理你的知識(shí)庫(kù)。
一點(diǎn)坑
下載www.sourcetreeapp.com/這款軟件是免費(fèi)的,但是需要注冊(cè),登錄授權(quán)。
一些場(chǎng)景
我大概把一些git高階的應(yīng)用場(chǎng)景和大家分享下:
一個(gè)項(xiàng)目含開發(fā)分支、集成分支、集成分支(穩(wěn)定版)、生產(chǎn)環(huán)境分支等
一個(gè)項(xiàng)目含base分支,按功能分配到各個(gè)分支,各個(gè)開發(fā)管理(十來(lái)個(gè)分支),集成分支、生產(chǎn)環(huán)境分支。(那十來(lái)個(gè)分支內(nèi)只有自己模塊的代碼)
一款產(chǎn)品一個(gè)主分支,對(duì)于每個(gè)公司實(shí)施均有個(gè)性化需求,且需求很難以插件形式實(shí)施,或者插件形式也需要各種個(gè)性化修改的插件,則對(duì)于每個(gè)項(xiàng)目實(shí)施對(duì)應(yīng)每個(gè)分支。
這里,我先簡(jiǎn)單描述這幾種使用場(chǎng)景,具體內(nèi)容,后面會(huì)逐步介紹。
欣賞下git分支:

常見用法
本文會(huì)綜合Windows環(huán)境和mac環(huán)境一起講,但在兩個(gè)平臺(tái)下界面或名詞還是有少許差異,本文會(huì)盡可能的說(shuō)明。
添加倉(cāng)庫(kù)
mac下從url克隆

git remote add orgin http://10.10.100.6:3000/sl/shaolei.git
windows下從url克隆
抓取、獲取分支信息
抓取(mac下的名字)獲取(Windows下的名字)指獲取服務(wù)端git庫(kù)的變更信息,比如落后幾個(gè)版本,超前幾個(gè)版本,我們平常多人協(xié)作的項(xiàng)目,提交代碼前需要先獲取一下,如果服務(wù)端有新的提交,再拉取下別人的更改,可以減少代碼沖突。(菜單欄)
拉取代碼

$ git fetch
$ git merge orgin/master
我先將界面分為 菜單欄、左側(cè)欄、文件欄、變更欄、底部欄以方便下文介紹。
直接點(diǎn)擊菜單欄的拉取按鈕即可將遠(yuǎn)程代碼變更拉取到本地。
提交代碼:
1.正常提交
首先將未暫存的文件選中,點(diǎn)擊后面的暫存所選;或者直接點(diǎn)擊暫存所有。(文件欄)
在下方文本框輸入本次代碼變動(dòng)的說(shuō)明。(底部欄)
sourcetree默認(rèn)不會(huì)推送到遠(yuǎn)程倉(cāng)庫(kù),打勾立即推送變更到origin。(底部欄)
點(diǎn)提交即可(如果沒(méi)有打勾立即推送變更到遠(yuǎn)程,還需手動(dòng)點(diǎn)擊菜單欄的推送)

這里我模擬一些變更,隨便改點(diǎn)代碼,然后保存,再次回到提交界面。

變更欄會(huì)包含本次所有變更,其中+代表本次增加行;-代表本次刪除行;前面2個(gè)行號(hào)依次代碼變更前行號(hào),變更后的行號(hào)。
為了保證代碼變更盡可能的少,我們需要丟棄一些無(wú)意義的變更,如153行的刪了一行<dt></dt>,隨后又增加了一行<dt></dt>,造成這種現(xiàn)象一般是代碼格式化或者不小心增加了某些空格等不可見字符導(dǎo)致,我們可以直接選中那2行,然后點(diǎn)擊上方的丟棄行。

需要注意的是,丟棄不等于刪除,丟棄所丟的東西是那一行的變更,比如是+號(hào),那么丟掉代表不增加這一行,減號(hào)-同理丟的是不刪除這一行,也就是恢復(fù)這一行。
sourcetree會(huì)把所有的變更以區(qū)塊來(lái)分組,所以如果是整個(gè)區(qū)塊的變更都沒(méi)有意義,可直接丟棄整個(gè)塊,如圖:

隨后暫存所選提交(文件欄)
暫存代碼
暫存和丟棄類似,是將代碼片段暫存到本地暫存區(qū) 以備提交,提交時(shí)所提交的代碼就是暫存區(qū)的代碼。
當(dāng)我們某個(gè)功能已經(jīng)實(shí)現(xiàn)了,但是又想優(yōu)化一下代碼,可又擔(dān)心等會(huì)沒(méi)優(yōu)化成功,此時(shí)的代碼丟失,如果沒(méi)有g(shù)it之前,我們可能會(huì)備份一份代碼,這里只需要暫存代碼即可。暫存后,正常修改,后續(xù)的變更會(huì)出現(xiàn)在未暫存文件中的變更欄中。

此時(shí)無(wú)論是丟棄,還是繼續(xù)暫存都是基于上次已暫存的文件。當(dāng)然,你也可以提交代碼,來(lái)實(shí)現(xiàn)類似功能。
1.解決沖突
當(dāng)我和別人改了相同文件的相同行時(shí),(大部分我們多人改變了一個(gè)文件,git都會(huì)幫我們處理掉,自動(dòng)合并,但是當(dāng)改變同一文件的相同行時(shí),在拉取時(shí)就會(huì)有沖突)如圖

我們可以先將我們代碼貯藏起來(lái)(菜單欄),然后再拉取代碼,接著應(yīng)用貯藏,應(yīng)用后沖突的文件會(huì)顯示出來(lái)
$ git stash

這個(gè)時(shí)候,我們需要指定一個(gè)版本,比如是別人的版本為準(zhǔn),還是我的版本,隨后右鍵文件選擇 解決沖突使用我的版本(左側(cè)欄選擇文件狀態(tài)-》工作副本)

變更欄可以看到updated upstream 是別人改的版本,+====下面我改的版本。如果遠(yuǎn)程和本地都有問(wèn)題,建議打開ide工具編輯后提交。
新開分支
在項(xiàng)目中,我們可能分為開發(fā)分支、集成分支、生成環(huán)境分支等,這時(shí)我們只需要在某個(gè)節(jié)點(diǎn)上右鍵選擇分支即可


推送分支
新開的分支不會(huì)在遠(yuǎn)程顯示,所以需要將分支推送到遠(yuǎn)程。
$ git push orgin 測(cè)試分支

切換分支
$ git checkout 3e1e7fc

需要切換到不通分支時(shí),直接雙擊分支。
拉取遠(yuǎn)程分支
和切換分支類似,雙擊遠(yuǎn)程分支即可。
回滾提交
有些時(shí)候,我們提交的代碼有問(wèn)題,需要回滾回去。
git revert *
回滾某次提交
將某次變更(在sourcetree里是某個(gè)節(jié)點(diǎn))右鍵選擇回滾提交。

回滾文件

回滾行

忽略文件
項(xiàng)目中,有一些文件夾是需要忽略,而不需要提交到倉(cāng)庫(kù)里,比如bin目錄下、target目錄下的文件。


這里支持忽略單個(gè)文件、忽略所有擴(kuò)展名、或略文件夾下的一切等。之后,我們不會(huì)看到這些文件變動(dòng)。
需要說(shuō)明的是忽略文件,只能忽略未跟蹤文件,如果已跟蹤文件(之前被提交過(guò)),需要先將這些文件刪除后,提交代碼庫(kù),再次忽略文件。
合并分支

由圖中可以看出,我們的測(cè)試分支代碼落后master分支2個(gè)節(jié)點(diǎn),我們可以在master分支上右鍵選擇合并到當(dāng)前分支

當(dāng)有沖突時(shí),需要和上文中介紹的那樣解決沖突,然后提交;如果沒(méi)有沖突,需要手動(dòng)點(diǎn)擊推送按鈕將合并后的變更提交到遠(yuǎn)程

貯藏(暫存)代碼
$ git stash
上文已有介紹,主要指暫存所有變更,以便于應(yīng)用暫存(windows下叫貯藏)
審查文件
假設(shè)一個(gè)文件被不同的開發(fā)修改過(guò),有段代碼需要找到修改人,我們可以右鍵審查文件查看每一行的作者。
$ git blame

效果如下:

右鍵某一行選擇查看詳細(xì)日志 可以看到該次提交的說(shuō)明。
查看文件變動(dòng)歷史
我們時(shí)常需要查看某個(gè)文件變動(dòng)的歷史,這里我們可以右鍵查看文件的 變更歷史
$ git log

點(diǎn)擊后效果如圖:

按文件打開歷史版本
有些時(shí)候,我們也需要查看文件的歷史版本,這里可以選中節(jié)點(diǎn)后,選擇那個(gè)變更文件,右鍵 打開歷史版本

sourcetree會(huì)生成一個(gè)臨時(shí)文件(歷史版本),以供我們分析。
標(biāo)簽的使用
我們有些時(shí)候需要給一個(gè)變更增加一個(gè)標(biāo)簽,比如穩(wěn)定版1.0的標(biāo)簽
git tag v1
$ git tag -d v1 //移除標(biāo)簽

效果如下:

存檔
存檔指將當(dāng)前版本打包成一個(gè)zip包。

檢出分支
檢出分支意思是將當(dāng)前項(xiàng)目回到選中的版本,這樣我們可以很輕松回到任意一個(gè)版本,來(lái)編譯項(xiàng)目,或者檢查當(dāng)時(shí)項(xiàng)目的問(wèn)題。

其他

合并 一般是用于不通分支間,將某次提交的所有變更合并到當(dāng)前分支。
rebase、交互式變都是變基,主要是將遠(yuǎn)程的這個(gè)分支名里的標(biāo)識(shí)改變,大部分場(chǎng)景用不到
重置到當(dāng)前節(jié)點(diǎn):這個(gè)功能蠻好用的,可以將目前的分支回滾到那一次的分支,然后將所有的文件變更顯示出來(lái),相當(dāng)于回到當(dāng)時(shí)準(zhǔn)備提交的時(shí)候(包含之后的所有變動(dòng))。
遴選 從不同的分支中檢出一個(gè)單獨(dú)的commit , 并把它和你當(dāng)前的分支合并,類似于打補(bǔ)丁,例如,修復(fù)一個(gè)所有分支都有的bug這樣的場(chǎng)合可以適用。
$ git revert
$ git cherry-pick 4a1fd5

分支的拉取推:從遠(yuǎn)程拉取
跟蹤分支:當(dāng)未跟蹤時(shí)表示本地沒(méi)有和遠(yuǎn)程建立分支的聯(lián)系
重命名分支
刪除分支等
如何查看界面上的操作對(duì)應(yīng)命令

設(shè)置后可以看到每部操作的git命令

一些良好的習(xí)慣
盡可能丟棄一些無(wú)意義的變更
盡可能按模塊分配開發(fā)人員任務(wù)
合并分支后需立刻解決掉沖突
減少單個(gè)文件內(nèi)代碼變動(dòng)的區(qū)塊
如果使用我的版本解決問(wèn)題,需告知對(duì)方
總結(jié)
通過(guò)本文介紹,可以解決平時(shí)90%以上的各個(gè)代碼提交問(wèn)題,至于用什么ide環(huán)境,那都不是事,使用ide開發(fā)工具打開sourcetree里的項(xiàng)目即可
