git 指令備忘

玩了一下 Learn Git Branching,多理解了一些指令。之前都是要用的時候 google 一下,現在理解了,寫下來強化記憶。

rebase

rebase 的目的是不要產生 merge 的節點,從這個角度想比較好理解參數的順序。附上 git help rebase 的例子:

在 remote 開新 branch

  • git push -u origin foo:push local branch foo 到 origin。 -u 會設好 foo 和 origin/bar 的關係,之後打 fetch/pull/push 就可以省略 origin/foo。
  • git push -u origin foo:bar:push local branch foo 到 origin,取名為 bar。

忘了加 -u 的話,可以用 git branch -u 補。

砍 remote branch foo

  • git push origin :foo
  • git push origin --delete foo

HEAD、~、^

  • HEAD 表示「目前的branch」指到那個 commit。若指到的 commit 沒有在任何 branch 上,git 會說你在 detached HEAD 上。
  • ~N:表示前 N 個,只打 ~ 表示前一個
  • ^M:表示第 M 個 parent commit只打 ^ 等同於 ^1

Learn Git Branching 玩一玩就熟了。

reflog

列出 HEAD 變化的記錄,只要 reflog 的記錄還在,即使 local branch 爛了也能再救回來。等搞爛了再來試試。

refs 格式說明

可手動直接改 .git/config 的 fetch 欄位
1. +refs/… 的 + 表示允許 non-fast-forward update

2. 只要 master 不要抓其它 branch:
fetch = +refs/heads/master:refs/remotes/origin/master

3. 不能用 partial globs, 但可在 namespaces 後用 globs
refs/heads/experiment/* # OK
refs/heads/exp* # Invalid

所以同類型的 branch 最好放在同個 namespace 下, 像是 devel/feature1, devel/feature2, 這樣方便其他人決定要抓或不抓這類的 branch