動機

git的指令很多,希望能用一種統一的觀點來看

commit as Node

(folder) -> (stage :: node) -> (repo :: linked list)
		   |
		  \ /
	 (stash :: pool of nodes)

Linked List

new node & use existing node

  1. git add
    • 把folder中的file,加到node中
  2. git stash
    • 把還沒加到repo(linked list)的node放到node的暫存區

edit the last node

  1. git amend
    • 修改最後一個node(HEAD)

iterate nodes

  1. git filter-branch
    • list.map ...
  2. git rebase
    • newlist = list.each ...; list.append(newlist)
    • 可以edit, squash(融合), drop, pick(保留)

ptr to node

  1. git tag
    • 單純的ptr
  2. git branch
    • 替node加上新的ptr,只是這個ptr會在他被append一個新node時,把該ptr往後移動
    • 所以可以把這個ptr當成"最新"或是"現在"

append node(s)

  1. git commit
    • 把目前的node加到目前HEAD的後面
    • 就是list.append
  2. git merge
    • fast-forward: 把node上的branch ptr移動到最後面
    • 沒fast-forward: 新增一個node內容是把兩個node的內容AND起來
  3. git revert
    • append一個node但與前一個node的內容相反
  4. git cherry-pick
    • append一個node其內容與指定的node一樣
  5. git fetch
    • 把remote branch的多出來node,依序append到目前的HEAD後面

backprojection

如果把node想成是folder的投影,那我們也可以反過來投影回去

  1. git checkout
    • 移動HEAD,把stage與folder(如果有給filename的話)設定回去
  2. git reset 移動HEAD與branch,有三個模式
    ( hard : 用node內容影響folder &
    	( mixed : stage設成該node的內容 &
    		( soft : 移動ptr ))
    

bisect

  1. git bisect
    • 就是二分搜

HEAD history

  1. git reflog
    • HEAD的history,如果做錯事可以來這邊找commit ID
  2. ORIG_HEAD
    • git在rebase或是reset的HEAD值

Ref

為你自己學 Git git bisect