隨git分發的默認的圖形化工具git gui和版本分支圖形化工具gitk。
一、GIT GUI主界面:
各個按鈕的意思基本與界面文字一致,與git的命令也差別不大。在了解自己所做的操作情況下,各個功能點開看下就知道是怎么操作了。即使不了解,只要不做push操作,所有的操作都在本地,基本也沒什么影響。大不了重新下載整個庫好了,git下載庫的時間確實比svn快很多,這也是git優勢之一。

1.菜單欄:
2.工作區變更、文件差異對比:點擊工作區變更的文件,右側窗口會顯示文件差異對比。吐槽下,對比的時候顯示的差異以上下的格式顯示,差異對比的體驗非常不友好。
3.索引區:使用命令git add或點擊”stage changed”按鈕后,工作區變更會添加到該區域。
4.基本操作按鈕:stage changed:將工作區的所有變更提交到添加到索引區;(其他在菜單欄中都有對應項,介紹菜單欄時一並介紹)
5.Commit信息輸入框:用於commit時輸入變更信息,與svn提交時填寫的信息一樣,主要方便后續查找或了解該次提交的目的。
6.Commit方式:創建一次新的提交或者修改上一次提交。對應於菜單欄中commit項中,new commit和amend last commit相同。
二、GIT GUI菜單欄:
repository:git庫相關操作,基本意思就是字面意思。
1)資源管理器中瀏覽該Git庫工作空間文件,省去查找路徑不斷點擊鼠標的操作。
2)啟動Git bash工具(命令行工具)。
3)查看當前分支文件狀態,不包括未提交的信息。
4)查看某個分支的文件(彈出框中可選擇需要查看的版本、分支或標簽),跟上一條差不多,用的比較少,可能是沒有這方面的額需求。
5)可視化當前分支歷史、可視化所有分支歷史:彈出分支操作歷史,也就是gitk工具,放到gitk工具中介紹。
edit:用於操作commit時操作信息輸入,只能操作文字輸入部分,你沒有看錯。常用的快捷鍵大家都知道,何必要單獨做成基本沒啥用的。本來以為對變更的文件進行批量操作、本來以為可以對未版本跟蹤的文件批量刪除、本來、、、,都說了是本來。
Branch:新建分支(需要選擇其實版本,可以根據版本號、其他分支或標簽來選擇)、檢出分支(覺得切換分支更合適)、重命名分支、刪除分支、當前分支Reset操作(會丟棄所有未提交的變更,包括工作區和索引區,當然了,有彈出框提示危險操作)。
Commit:
1)new Commit:創建一次新的提交,常規提交方式;
2)Amend last commit(修改上次提交):用於合並多次提交,針對為push操作前多次提交合並操作比較有用,在上次提交已經push的情況下可能會造成提交記錄變亂;
3)rescan:用於掃描當前git庫的變更,包括工作區和索引區的變更;
4)Stage To Commit:添加選中的變更文件到索引區;
5)Stage changed files to commit:添加所有改變文件到索引區;
6)Unstage from commit:將選擇文件的變更從索引區撤回工作區;
7)revert changed:撤銷工作區選擇文件的變更,文件將還原為未修改之前的狀態(但是未進行版本跟蹤的文件無法直接刪除,未跟蹤的文件究竟怎么刪除,莫非一定要一個個去找出來刪除?很遺憾沒在這個工具中找到);
8)show less context、show more context:調整文件差異對比區顯示內容;
9)sign off:在commit信息輸入框中添加提交人信息,減少手動輸入;
10)Commit:提交當前變更到本地;
merge:
1)local merge:分支本地合並操作,彈出操作框,選擇要合並的版本(可以選擇版本號、本地分支、遠端分支或者標簽,他們的最新狀態都指向了一個確定的版本)。要注意A和並B與B合並A是不同的,在A分支上操作合並B會將B中的所有的文件與A做差異運算(這個與方向無關),差異部分會匯總到A中,此時B的狀態不會變更。
2)abort merge:終止merge操作。在合並分支操作中產生沖突,當前git庫狀態設置為mergeing狀態,要求解決沖突后進行其他操作。合並出現沖突時,在文件差異對比的區域會顯示出沖突的部分,右鍵可以啟動自定義的差異合並工具。
remote:遠端操作相關,多個遠端倉庫時,呈現多個遠端倉庫
1)fetch:從遠端倉庫獲取更新;
2)remove remote:刪除與遠端庫鏈接;
3)add:添加遠端git庫,彈出添加操作框,輸入遠端庫名(可自定義)和倉庫鏈接(初始clone代碼時的連接);
4)push:推送本地變更到服務器,會彈出push操作的操作框,與基本按鈕區的push按鈕操作相同。推送時git的默認設置只允許推送到與本地分支同名的遠端分支,如果遠端只有一個主分支,本地自建了多個分的的話無法直接完成推送。可以自行修改,不過風險比較大。
5)delete branch:刪除遠端分支,彈出選擇框,選擇遠端庫、遠端分支名及操作選項。
tools:自定義操作命令
二、GITK工具:
顯示版本提交記錄的工具,基本了解過git操作的應該都知道提交記錄,畢竟git的官方文檔就是按提交記錄做分支介紹的,有些人可能與我有同樣的疑問,提交記錄在哪里,只能用命令行看?用命令行看提交記錄是不人道的!
命名行中輸入gitk或者在git gui中選擇“圖形化所有分支歷史”:

Gitk主界面如上圖所示(幾個區域的信息是聯動的):
1. 版本分支圖:后續將詳細講述版本分支圖,經常使用git的應該看下就懂了;
2. 提交人信息:對應提交的提交人的郵件信息;
3. 提交時間:注意是本地提交(commit)時間不是push操作時間;這個是符合git的設計的,但是可能是個坑,沿用SVN的提交記錄的做法,最新的提交就一定在最上面,但在git上推送本地變更到倉庫后,為了確認成功推送,可能就會出現該次操作排到了版本分支圖中間或者根本沒有顯示到一頁上。
4. 版本號:對應提交的SHA1ID,即版本號;
5. 版本信息搜索框:在文本框中輸入需要查找的信息;左右下拉框中的相應類型幫助快速精確定位要查找的信息,可按提交人等類型查找提交記錄;
6. 詳細信息框:最上方為搜索部分:可搜索下方信息展示的相關文字;中部控制區域:根據需要控制下方信息展示框中的內容;信息展示部分:上部有本次提交的提交人郵件、提交時間、本次提交的父子節點、本次提交屬於哪個分支、及跟隨哪個標簽等相關信息。下方是文件差異對比區,上下滾動可查看本次提交所有文件差異(如果做合並操作不會顯示文件差異)。
7. 變更文件框:顯示本次提交的差異文件列表。
四、版本分支圖
git操作歷史組成:整個復雜的版本分支由每次小的提交構成,Git為每次提交(commit)生成SHA1 ID(版本號),每次提交時Git能知道本次提交的父節點。常規的提交操作只會有一個父節點,合並生成的節點會有兩個父節點。相關聯的兩次提交互為父子節點,每次提交可能會有多個父節點和多個子節點。
git中本地分支、遠端分支或追蹤分支、tag都指向一個版本,即一次提交。不同的是分支的指向的版本隨着提交和服務器的數據更新不斷變化的,tag指向不變,類似於給這個版本(SHA1 ID)取了別名,方便查找信息。因此在選擇版本時,可以有多種查找版本的方式,直接通過版本號查找,或通過分支和標簽查找。
版本分支圖:
以git自身的代碼庫操作歷史為例,gitk工具顯示效果如下:

圖上元素信息如下(顏色可能由於自定義設置不同):
圓形節點(版本分支圖中最基本元素):一次提交,節點間有父子關系,橫向藍色部分為該次提交的相關信息。
黃色節點:有且只有唯一一個表示當前工作空間的文件狀態與對應節點一致,時時關注這點就能知道現在工作區的狀態;
不同顏色的線段:連接有父子關系的節點,帶箭頭的方向是由於時間跨度太長,節省空間顯示,點擊箭頭會跳轉到對應的節點;
綠色塊:本地分支。上圖中能看到本地分支:ts、test2,加粗分支名表示當前工作分支,即test2。但工作區狀態不一定必須對應一個分支,分支對應的節點不一定是黃色點,不一定有加粗的分支名。
前淡紅后綠色塊:遠端分支。上圖有遠端分支:remote/origin/maint。
黃色箭頭塊:標簽。上圖有標簽:v2.10.0-rc0、v2.9.3。兩個標簽對應不同的版本。
從圖上還可以看到:
當前標簽v2.9.3、本地分支test2、遠端分支remote/origin/maint同時指向同一個版本。本地分支ts、標簽v2.10.0-rc0分別指向不同的版本。
右鍵菜單介紹:
在本地分支和遠端分支點擊右鍵彈出右鍵菜單:

在提交記錄上右鍵:

從上圖中可以看到,可以直接在此版本的基礎上創建標簽、以此版本為起始版本創建一個分支、對當前分支進行Reset操作(與gui界面的Reset操作功能不一致,此處的Reset與git reset命令對應)、任意兩個版本間進行對比操作等。上下方當前截圖中不可用的功能主要用於對比兩個版本間差異。上方不可用的按鈕用於在當前提交與選擇的提交之間做對比,選中一次提交,在其他的提交上直接點擊右鍵,功能可用。下方的按鈕可用則需要將在mark某次提交,即點擊“mark this commit”。在從SVN切換到git之初,比較疑惑的一點就是怎么進行版本的差異對比,gitk工具的差異對比做的不太好,還是換其他的工具吧。
五、基本操作:
通常來說clone代碼到本地后,除開版本控制的專門人員外,常用的操作不過是更新代碼、提交代碼、提交過程中的沖突處理。以單遠端倉庫origin,單遠端分支master、當前工作分支master的情況下截圖說明。多本地分支和多遠端分支的情況下根據自己的情況調整。
1.更新代碼到當前分支
分為兩步:從遠端庫更新代碼到本地倉庫、本地分支master與遠端master做合並。
用命令操作:git fetch origin、git merge origin/master(或者有設置上行分支時,直接使用git pull,可惜界面上沒有)
菜單欄—remote—fetch from—origin

菜單欄——merge——local merge(分支合並)

在tracking branch中選擇origin/master(取決於當前分支要與哪個遠端分支對齊),完成合並操作,當前分支的代碼已經更新。
2.提交代碼
命令:add/commit/push,提交代碼的界面相關操作基本在git gui界面完成。

選中工作區變更的文件,單個提交到索引區(菜單欄——commit——Stage to commit)或一次添加所有變更文件(基本操作按鈕區Stage changed);
Commit信息輸入框中填寫相關信息,commit按鈕完成提交;
基本按鈕區push按鈕,彈出框如下圖:

選擇需要推送的分支master(當前工作分支),點擊push完成。默認只推送到與本地分支同名的遠端分支。如果遠端允許創建分支情況下,git會在遠端創建一個同名分支,如果不能創建分支,會推送失敗,只有將變更合入到其他分支在做推送。如果需要修改,參考push.default配置。
3.沖突處理:
當合並出現,界面顯示如下,可以手動合並或啟動指定的合並工具合並。

處理完沖突按正常的提交流程就可以了。如果改變注意,放棄合並操作,點擊菜單欄中abort merge,終止合並。
4.分支操作
分支由一系列提交、合並操作組成。一個分支的歷史是從分支指向的版本節點不斷查詢父節點,直到git庫初始化版本。Git gui和gitK中基本都能完成對應操作。
1.創建分支:
菜單欄—branch—create

輸入分支名、選擇分支或輸入起始版本及下方的操作選項,完成分支創建。
或者直接在版本分支圖中右鍵直接以指定的版本號作為起始版本創建分支。
2.檢出分支:(也可以直接檢出指定版本)
菜單欄—branch—checkout
選擇需要檢出的分支,點擊checkout,完成分支檢出操作。
3.刪除本地分支
如果確認該分支的所有提交都已經合並到其他的分支,可以刪除。如果未能完全合並,將丟失部分提交記錄。有A、B兩個分支,A合並了B,A將持有B中所有的提交記錄,此時刪除B,由於B的所有提交在A中仍然被持有,不會刪除提交記錄。如果沒有做過合並,將刪除僅由B持有的所有提交記錄。
Gui界面刪除分支之間要求選擇將提交記錄合並到哪個分支。
5.已經commit操作后怎么回退?
git工作方式與SVN不同的一點就是基本所有的操作都在本地完成,因此commit操作生成的版本,應該是一個功能完備的,在項目中應該至少是一個可完全編譯通過的版本,commit對應於SVN的提交操作。由於commit操作都是在本地實際上在本地是基本沒有差別的,但是倉庫的分支就可能出現隨意檢出版本編譯不通過的情況,當然應該也不會隨意檢出版本。可以將文件還原在做一次提交,但這樣推送到倉庫后,其他人能看到操作記錄。可以在提交時修改上一次提交(如果上一次提交為已推送的提交,可能造成混亂,未試驗),這樣就合並為一次提交。
回到問題,怎么回退?進行Reset操作,Gitk中有對應功能項。注意應該只Reset到本地還未推送的提交。版本分支圖中點擊“reset <分支名> branch to here”,git將該分支的指向選擇的版本,如果Reset操作跨度較大,造成差異項非常多。回退后差異文件有三種方式保留方式:

Soft:保留工作區和索引區;
Mixed:只保留工作區,在soft基礎上,索引區變更回退到工作區,兩者差不多。
Hard:丟棄版本間所有的差異,基本屬於強制調整分支的最新指向版本;
6.在一個分支上,修改了文件未本地提交,現在要按界面更新代碼,提示有差異,無法進行合並操作?
使用git stash工具,git gui中沒有,tortoise git工具中有。
