02

<圖: 豪小傳說 by RPG製作大師>

 

感謝J同事的教學,趕快來做新手筆記。

以打電動的支線/存檔點概念來解釋branch/commit,就連新手也很好理解。

 

git有一條主線master,當妳想要解某個支線任務,就開一條新支線(branch),

然後在裡面廝殺時可以存檔(commit),

發現任務遇到瓶頸或技能點錯(code寫壞了,regression fail了等等)時,

就可以讀取進度(checkout)回到之前某個存檔的狀態。

 

1  

假如支線還沒解完,王打到一半時,

又有一條限時的賺錢支線任務出現(例如緊急request要修bug),

可以從主線再新開一條支線出來,這個新支線的狀態完全等同於你還沒開始舊支線,

所以可以先把打到一半的王忘記,專心先解目前的新支線。

01

<圖例: 舊的支線(女主角A.B)還沒解完,新的支線(女主角C)又出現了>

 

1

解完以後,這個支線可說大功告成,可以安心把結果合併(merge)回去主線了。

例如原本主線的金錢是0元,解完緊急賺錢支線後賺了100元,

所以合併回到主線後,主線金錢也變成100元。

那麼這個支線就功成身退,可以把它結束掉(branch -d)了。

 

1    

那原本的舊支線呢?回到舊支線裡發現金錢還是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]
    name = xxx
    email = xxx@gmail.com
[color]
    diff = auto
    status = auto
    branch = auto
    interactive = auto
    log = auto
    ui = auto
[merge]
    tool = tkdiff
[alias]
    co = checkout
    ci = commit
    dif = difftool -y
    st = status
    br = branch
    mg = merge
    lg = log --graph --pretty=format:'%Cred%h%Creset%C(yellow)%d%Creset %C(cyan)%an%Creset %s %Cgreen(%cd)%Creset' --abbrev-commit --date=rfc --date=local
    ls = ls-files

 

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/ 

 

 

arrow
arrow
    全站熱搜

    小咪媽咪 發表在 痞客邦 留言(0) 人氣()