2012年8月26日 星期日

git commit 流程 極簡易教學

這篇文章只提供用git提交code最簡單的方式,不包含細節觀念和例外狀況(conflict等)處理。想要知道相關細節的,煩請自行google。
 要commit(提交)自己的code,分成4個階段,這件事要首先keep in mind:
 修改需要更動的code -> 把更動過且確定要提交的code放到stage(沒有要提交的就不要放) -> commit(提交這次要更動的code) -> 把提交的code push到遠端
注意!放到stage和commit是不一樣的!要commit前,一定要先放到stage。因為你不一定需要將自己所有更動過的code都提交,先放到stage,git才知道你這次到底要提交哪些code。push時只會把你commit的code(有放到stage的code)放到遠端。
這點我自己當初也搞不太清楚,撞了很多次牆。

有了上述大觀念後,以下是簡易流程
1. 為了避免不必要的conflict造成自己的麻煩,每次修改前都請先git pull,先把遠端最新版本的code抓回來
2. 修改code
3. git status 列出目前的狀態(最好在這個git repository的根目錄下這個指令,不然接著要add時會有一些路徑上的問題)
此處需要再知道一個觀念:git repository 下的檔案分成兩大類:tracked, untracked
簡單的說,git有紀錄過的是前者;反之是後者。
這張圖上半部紅色的,是已經被git追蹤,這次修改過的檔案(沒被修改過的就不會被列出);下半部是這次新增,尚未被追蹤的檔案。
4. 把你這次要commit的檔案add到stage
你可以依序下 git add XXX/yyy(需要包含路徑),一個檔案一個檔案放
假如你這次更動的file全部都要提交,則可以下
git add .
或是直接在 commit 時加上 -a
git commit -a
不過需要特別注意的是,git commit -a 只會新增tracked file,亦即只會新增之前就存在、這次被修改的file;這次才新增的file不會被加入。要連這次才新增的file都加入,一定要用
git add .

add完後,再下git status
就會看到剛剛被add的檔案已經變成準備被commit的情況

5.提交這次要push到遠端的code
git commit -m "add aaa file"
-m 後面接的是這次commit的註解,可長可短,以你的夥伴看得懂為原則,一定要加!
若要搭配-a使用,則要下
git commit -am "add aaa file"

下完commit後,git 會在console上印出一些資訊,大致上是有哪幾份檔案被更動過、新增、刪除了幾行code
6. git push
基本上,這樣就完成你這次的提交了。git同樣會印出一些這次push的資料。
不過,假如你的同伴在你修改檔案時有push新的code到remote repository,這時候就需要merge你們各自的新code,git會要求你先pull你同伴的新code。
git pull後,運氣好的話,git會自動merge你們的新code;運氣不好時(通常是有對同一份檔案進行刪改),就會出現conflict的情形,需要手動解決conflict以merge檔案。
如何解決conflict超出本文討論範圍,請自行google。

ps,
git status只是列出目前的狀態,非commit時必要的指令,若很確定自己的狀態,可以略過。