動機
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值