2016年10月20日 星期四

連猴子都會用 Git

連猴子都會用 Git


前言:
進行Git學習與操作,請讀者發揮一點想像力,如果可以,盡量讓思緒保持請清晰。因為所謂版控,就是把 - 原本很單純的單線程檔案管理,變成多線程(branch),多節點(commit),多開發者(dev),以達到半自動化的管理,與程式的一致性,讓開發者不會發生改了又改,改了又改,改了又改的狀況(小編之前真的遇過)。當然隨著需求與操作習慣的不同,複雜度也會隨之不同,也可以極有條理,與優雅的版控程式,之所以這麼說,只是想先幫各為打個預防針,如果你準備好了,那就開始吧。
安裝Git
當然,沒有主程式我們玩個毛阿,在Window環境下,主程式 Git 下載安裝即可
俗話說得好:工欲善其事,必先利其器。在這麼先進的時代,你還會想要去記指令嗎?難道你還在用筆記本來開發程式嗎!不!你不會!所以在此小編要推薦大家一套網路上很常用也很好用的工具 Tortoisegit ,大家可以選用適合自己的作業環境的版本。(Tortoisegit只有windows版本,有錢如Kevin Jobs,使用mac的同事,有另外一套叫做SourceTree,只是這就不在今天討論,但觀念及操作方法是差不多的)
安裝好Tortoisegit只要在任意資料夾上(explorer任意處)按右鍵,就可以看到一隻小烏龜,及代表安裝完成。

Git環境設定

設定git資料夾(請參閱自己所安裝目錄)


Clone第一個專案吧
溫馨提示:即使Clone專案,也不代表你就是專案開發的一員,就算你更改了主線程式碼也沒辦法commit,如果你只是要參考該專案,可以用"Download Zip"(如果有的話),或是clone完後將.git的隱藏資料夾刪除,也可以使用Fork到自己的專案下。
因為公司專案大部分都是團隊開發,所以小編這邊教clone起步會稍微省事些,理所當然專案必須先在線上先開好(包含開發人員的管控)。若只是想在本機端進行版控(不上線),可以在要版控的資料夾內按右鍵,點選Git Create repository here,開始進行版控(但這不在今天教學內容中)
登入Git的管理平台後取得專案的Clone Url(預設已經開好專案)

在放置專案的資料夾中按右鍵,選Git Clone...

將複製的網址貼上,並確認資料夾是否正確,最後按下OK(本機資料夾必須是空白資料夾

Clone前會再次確認密碼(請輸入相對應帳號的密碼)
乖乖讓他跑完,專案就出現了,剩下的就可以在單機執行處理了

下載中

下載完畢


在正式開始前來個觀念解說吧
每個專案,最一開始都只有一條主線(master),每個開發者都會擁有自己的倉庫(Repo),所有的行為都是在本機上進行,包刮拉分支,與TFS不同的地方,我們只會看到一個資料夾!
大家可以想像一下自己身處在一個倉庫之中(資料夾),倉庫中的檔案可以來自不同的虛擬倉庫(Branch),而自己可以決定在現在實體倉庫中的檔案是來自(switch/checkout)哪個虛擬倉庫。每個異動的檔案(file)再分倉(commit)之前,都是實際存放於實體倉庫之中,無論我現在切換到哪個虛擬倉庫,檔案都會存在,直到分倉完畢,檔案才會只屬於該倉所有,只會在選擇該虛擬倉庫顯示。上述的所有行為直到push(check in)出去才會同步到線上(共用的倉庫)。概念圖如下圖
特殊情況A分支上建立一個A資料夾,並新增一個A檔案(commit>push)(只單純新增資料夾是不給commit),再新增一個B檔案,此時切到B分支會如何呢答案是會出現一個A資料夾,而裡面只有B檔案


接下來解釋些常用行為
Fetch():遠端數據資訊更新,緩存在本機之中,不區別分支,全部都會更新。
ex: A更新了master分支的內容,B若未執行Fetchremotes/origin/master所看到的資訊都會是舊的

pull(): 將線上數據抓下來(單一分支),也可以說是Fetch+Merge


commit(確認送出): 將修改確認送進指定分支的倉庫中(確認送出的分支,也可在此創立新分支)
 (Message一定要打清楚,以做未來回朔參考) (Change選擇要送出的部分)


push(): 將修改推送至線上(可選擇是否將所有分支送出)(若只是想在本機上做版控,壓根可以不用管這個動作)


一般來說,最理想的狀況就是,打完 > push > 無衝突 > 收工 > 放飯!只是一但團隊進行開發,事情就往往不盡如人意,偶爾會發生跟同事改到同一個檔案,好死不死你又剛好慢他一秒push,這時,流程就要稍微改一下了,變成 打完 > push > 有衝突 > SHIT! > pull > 解除衝突(手動Merge) > commit > push > 收工 > 放飯!當然如果修改內容不要太複雜不會花太多時間的。原則上你會看到如下畫面。

push產生衝突
(可直間點選左下角pull進行檔案合併)


pull衝突發生
(是否立馬解決,一般點是)


衝突檔案
(衝突檔案上點兩下開始編輯)


編輯畫面
(簡單說就是針對紅色的行數進行要你死還是我亡的選擇,也可以選擇都留)

(四個選項分別是:
使用這行(這時看你是在Local or Remote留下的行會不一樣)
以這檔案為主
兩行都留mainthere前面
兩行都留mainthere後面)


編輯完按綠色勾勾合併

編輯完,記得要再commit一次,之後再進行push

Revert(還原): 與網路上所說回朔之前的commit不同,在Tortoisegit當中的revertTFSUndo,可還原檔案,唯一條件是再commit

Create branch:新增分支(可選擇來源的線,新增完不須commit,直接push即可上線)

Switch/Checkout:
切換分支
刪除分支
回朔之前的version(commit)
(此即網路上所說revert功能)
(若只是想看當時狀態,回朔時可不建立新的分支,只要再切換分支就會還原)
(回朔後所建立新的分支,只能再往前回朔,不能往後回朔)

Merge(合併)
選擇合併來源
合併完成
合併完成即已commit狀態

Create Tag
這功能就類似書籤,在眾多commit之中塞一個書籤,因為message內容偏向於這次修改的內容,較不適合作為書籤使用,可在完成每件事之後新增一個Tag,類似史記編年史一般,方便未來回朔記得名稱不能有空白

Show Log
看所有commit紀錄,資料異動

Delete and add to ingore list(取消檔案(資料夾),不再受版控控制)
這裡要來小小澄清一下,這裡有三種情況
情況一(只有你電腦中有這檔案,還沒push): 那這情形很單純,這功能會把該檔案的檔名跟路徑加到根目錄中的,gitignore中,讓檔案被git忽略版控
情況二(你不小心已經push出去了,線上有這檔案,但所幸還沒被別人pull): 這情況除了會做情況一的事,push出去,同時還會刪除線上檔案,因為線上如果檔案還存在,git是不會忽略該檔案的版控的(手動忽略時該注意)
情況三(push出去,別人也不幸的pull了下來): 除了會做前兩個情況的事,做完後,如果別人pull檔案,因為會收到刪除的指令,所以該應當忽略的檔案會被刪除,所以如果是自動生成的檔案可以讓她刪除,如果是config之類,各自主機要保持不一樣的內容,卻又不能刪除的檔案,請做好協調並告知對方手動備份,
ps. 可以擬一份文件,說那些檔案被忽略,初次clone是抓不到的,必須手動新增,方便作業。針對.gitignore的用法,自己上網google好了很簡單啦~

Add讓檔案重回版控懷抱,或者有新加入的檔案(資料夾)也可以不藉由commit,而是透過add來加入版控


小訣竅:
更改右鍵所會出現的快捷鍵:
setting

操作不如預期時的解決方式:
原則上在進行任何動作時,只要看到藍色就是成功,看到紅色就是失敗,而失敗時左下角通常都會有協助你完成動作的指示,類似下圖,在push時失敗,因為有衝突,所以要pull更新檔案方能繼續。

免重複輸入密碼的大絕招:
打開設定 > Git > Remote > origin > URL 稍微修改一下
原始 : http://(帳號)@git.newegg.org/scm/tcbb/kafka.git 
修改後 : http://(帳號):(你的密碼)@git.newegg.org/scm/tcbb/kafka.git在帳號後面先增一個冒號跟密碼,假設帳號是qwer,密碼是123,修改後就會變成 : http://qwer:123@git.newegg.org/scm/tcbb/kafka.git
這方法簡單又快速,缺點就是密碼沒有加密,安全性欠佳。
所以結論就是要嘛圖個方便,要嘛就設跟其他網站不一樣的帳號或密碼,被盜了也沒差,要嘛就嚴禁老王接近你的電腦吧。

特殊狀況:
網路上有些Git資源,帳號要用信箱的,因為含有"@",所以clone的網址會辨識出錯,變成如下
http://git.newegg.org/scm/tcbb/kafka.git 
然後每次對線上動作都要重新輸入帳號跟密碼,這時.......只能乖乖認命了,天下何其大,為什麼要在這裡屈就呢,換一套吧! 

小結:一路說到這裡,大家差不多已經能學會大部分Git會用到的操作,可以順利完成版本控制,準時下班了。But!! 人生最厲害的就是這個But!! 明天上班會發生什麼事呢這又是另外一個故事了........



沒有留言:

張貼留言