動機
git的指令很多,希望能用一種統一的觀點來看
commit as Node
(folder) -> (stage :: node) -> (repo :: linked list)
		   |
		  \ /
	 (stash :: pool of nodes)
Linked List
new node & use existing node
- git add- 把folder中的file,加到node中
 
- git stash- 把還沒加到repo(linked list)的node放到node的暫存區
 
edit the last node
- git amend- 修改最後一個node(HEAD)
 
iterate nodes
- git filter-branch- list.map ...
 
- git rebase- newlist = list.each ...; list.append(newlist)
- 可以edit, squash(融合), drop, pick(保留)
 
ptr to node
- git tag- 單純的ptr
 
- git branch- 替node加上新的ptr,只是這個ptr會在他被append一個新node時,把該ptr往後移動
- 所以可以把這個ptr當成"最新"或是"現在"
 
append node(s)
- git commit- 把目前的node加到目前HEAD的後面
- 就是list.append
 
- git merge- fast-forward: 把node上的branch ptr移動到最後面
- 沒fast-forward: 新增一個node內容是把兩個node的內容AND起來
 
- git revert- append一個node但與前一個node的內容相反
 
- git cherry-pick- append一個node其內容與指定的node一樣
 
- git fetch- 把remote branch的多出來node,依序append到目前的HEAD後面
 
backprojection
如果把node想成是folder的投影,那我們也可以反過來投影回去
- git checkout- 移動HEAD,把stage與folder(如果有給filename的話)設定回去
 
- git reset
移動HEAD與branch,有三個模式( hard : 用node內容影響folder & ( mixed : stage設成該node的內容 & ( soft : 移動ptr ))
bisect
- git bisect- 就是二分搜
 
HEAD history
- git reflog- HEAD的history,如果做錯事可以來這邊找commit ID
 
- ORIG_HEAD- git在rebase或是reset的HEAD值