<圖: 豪小傳說 by RPG製作大師>
感謝J同事的教學,趕快來做新手筆記。
以打電動的支線/存檔點概念來解釋branch/commit,就連新手也很好理解。
git有一條主線master,當妳想要解某個支線任務,就開一條新支線(branch),
然後在裡面廝殺時可以存檔(commit),
發現任務遇到瓶頸或技能點錯(code寫壞了,regression fail了等等)時,
就可以讀取進度(checkout)回到之前某個存檔的狀態。
假如支線還沒解完,王打到一半時,
又有一條限時的賺錢支線任務出現(例如緊急request要修bug),
可以從主線再新開一條支線出來,這個新支線的狀態完全等同於你還沒開始舊支線,
所以可以先把打到一半的王忘記,專心先解目前的新支線。
<圖例: 舊的支線(女主角A.B)還沒解完,新的支線(女主角C)又出現了>
解完以後,這個支線可說大功告成,可以安心把結果合併(merge)回去主線了。
例如原本主線的金錢是0元,解完緊急賺錢支線後賺了100元,
所以合併回到主線後,主線金錢也變成100元。
那麼這個支線就功成身退,可以把它結束掉(branch -d)了。
那原本的舊支線呢?回到舊支線裡發現金錢還是0元,想買裝備都無法,
所以要記得在舊支線裡將主線的狀態合併(merge)過來,讓舊支線也獲得100元。
假如舊支線已經在這裡賺了10元,那金額就會有衝突(conflict),git 會請你手動合併。
其實支線裡面可以再另開支線,也可以把多個存檔點合併成一個,
這些不會也不影響初學者使用,可以先不管它們。
常用指令 (前面都要加git ) | 意義 |
init | 開新遊戲 |
branch | 列出所有支線,目前的支線前面會有*號 |
log | 列出此支線下的所有存檔點 |
status | 列出目前狀態跟上一個存檔有哪些檔案變了 |
branch <branchName> |
開新支線 |
checkout -b '<branchName>' | 開新支線並跳到該支線 |
add . | 把目前資料夾下的檔案都加到待存清單 |
commit -m '<comment>' | 將待存清單存檔並加註解 |
checkout <branchName | commitID> |
讀取某條支線 | 某個存檔 |
diff <branchName | commitID> |
看目前狀態跟某條支線 | 某個存檔的差異 diff HEAD 可直接跟上個存檔比 若加--name-status 只會列檔案名字 |
reset --hard | 直接讀取最近的存檔,放棄目前的改動 |
reset --hard <commitID> | 讀取某個存檔,並刪掉其之後的存檔們! |
merge <branchName> | 把目標branch合併到目前所在的支線 |
branch -D <branchName> | 刪掉branch |
git rebase -i <commitID> | 處理從這個ID開始的所有存檔是否合併 |
----- 第一次用git -----
1. 先在home目錄下建.gitconfig,alias可以設一些常用指令的縮寫
[user] |
2. 可以在要修改的code的頂層建.gitignore,指定忽視某些檔案或資料夾不做備份
.system *.bak log/text/ |
3. 初始化git資料夾,存放git需要的資訊
> git init
Initialized empty Git repository in /目前路徑/.git/
4. 把目前目錄與下面的所有檔案存起來,當作最原始乾淨的一份code
把目前目錄下的檔案(除了ignore的以外)都加進來:
> git add .
可以看一下有哪些檔案準備要加進來:
> git status
# On branch master //default的主線branch就叫做master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage) //教你怎麼刪掉不要備份的檔案
#
# new file: xxx/Makefile
# new file: xxx/test.h
# new file: xxx/test.cpp
確定沒問題就"存檔",後面接註解'init'
> git commit -m 'init'
create mode 100644 xxx/Makefile
create mode 100644 xxx/test.h
create mode 100644 xxx/test.cpp
檢查一下目前目錄下的檔案跟剛剛的存檔點有沒有差異:
> git status
# On branch master
nothing to commit, working directory clean
看一下目前的branch下面有哪些存檔點:
> git log
commit 1bbe1433dc6e6e702c6d2a99e89849f134dcaa3e //存檔編號
Author: xxx <xxx@gmail.com>
Date: Wed Jun 10 09:35:04 2015 +0800
init //存檔的註解
* 總結一下,第一次建git環境需要做以下的事:
在home目錄下建.gitconfig,然後到要開始備份的資料夾打:
> git init
> git add .
> git commit -m 'init'
----- 使用git簡例 -----
*** 如果要跟server的code同步,可以在每天工作前先將master更新成server版本
> git branch master
> (sync codes from server)
> git add .
> git commit -m 'daily sync'
*** 從master開一條新的branch並進入,名字叫做new1
> git checkout master
> git checkout -b 'new1'
*** 開始編輯檔案
> gvim test.cpp
> gvim test.h
> git status
可以看有哪些檔案"髒"了,檔名會以紅字表示
# On branch new1
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: test.cpp
# modified: test.h
#
no changes added to commit (use "git add" and/or "git commit -a")
*** 決定哪些檔案有變動,要存起來
> git add . //自動撈所有改動的檔案
> git commit -m 'save1'
*** 支線解完後要merge到主線去,然後砍掉支線
> git checkout master
> git merge new1
> git branch -d new1
*** 如果覺得太多存檔點看了很礙眼,想把一些沒用的存檔點刪掉
> git rebase -i <起始存檔點commitID,可用git log查詢>
更多專業的知識在 http://blog.gogojimmy.net/2012/02/29/git-scenario/
留言列表