從書和網路上整理一下 Git 一些設定和小技巧,讓使用上更為順手,更省時間。


Git 設定

git config 有三個層級,設定優先權: local > global > system

  • 系統 --system (需要 root 權限)
    • Windows: C:\Program Files (x86)\Git\etc\gitconfig
    • Linux: /etc/gitconfig
    • OS X: /usr/local/git/etc/gitconfig
  • 使用者 --global
    • Windows: C:\Users\.gitconfig
    • Linux: ~/.gitconfig
    • OS X: ~/.gitconfig
  • 儲存庫 --local (default)
    • /.git/config

錯字自動校正

常常打錯字可以開啟自動校正。

預設值為 0,會顯示 Did you mean this?

$ git lpg

git: 'lpg' is not a git command. See 'git --help'.

Did you mean this?
log

設定一秒後校正,單位為 1/10 秒

git config --global help.autocorrect 10

$ git lpg

WARNING: You called a Git command named 'lpg', which does not exist.
Continuing under the assumption that you meant 'log'
in 1.0 seconds automatically...
...

ctrl+c 可中斷校正

設定 push 預設值

避免將錯誤的分支 push 到遠端去

  • nothing: 需要指定分支才能 push
  • simple: local/remote 分支名稱相同才可以 push
git config --global push.default [nothing/simple]

設定預設編輯器

git config --global core.editor [your-editor]

Git Alias

用來縮短打字的時間,或是定義有意義的名字使用多種參數指令化為新功能

移除別名用 --unset 參數
外部指令開頭要 + !

常用指令設為別名

git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.cm "commit -m"
git config --global alias.st status

git acm

相等於 git add -A + git commit -m

新增全部到索引並提交

git config --global alias.acm "!git add -A && git commit -m"

git log

更好閱讀的 git log

git config --global alias.tree "log --graph --decorate --pretty=oneline --abbrev-commit"
git config --global alias.lg1 "log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all"
git config --global alias.lg2 "log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all"
git config --global alias.lg "!git lg1"

git unstage

將檔案移除索引

git config --global alias.unstage "reset HEAD --"

git unstage myFile.txt 相等於 git reset HEAD myFile.txt

git undo

快速取消最近一次的提交

git config --global alias.undo "reset --soft HEAD~1"

git last

查看最近提交的內容

git config --global alias.last "log -1 HEAD"

git difflast

查看最近提交的內容差異

git config --global alias.difflast "diff --cached HEAD^"

git rebase 避免無謂的 merge

常常在合併遠端相同分支的時候,都會出現沒有必要的 merge,會造成線路變得複雜。

rebase 會修改原本的 hash id,要注意

比較

  • git pull 會多出不必要的 merge 分支
    merge.png

  • git pull --rebase 路線看起來比較好看不複雜
    rebase.png

設定 local master 分支預設值為 git pull --rebase

git config branch.master.rebase true

設定 global 預設值為 git pull --rebase

git config --global pull.rebase true

更多相關設定How to make Git pull use rebase by default for all my repositories?


HEAD 符號參照

  • ~: 代表第幾個階層
  • ^: 代表第幾個 parent

這裡有一個參考圖,可以看出之間的關係

G   H   I   J
\ / \ /
D E F
\ | / \
\ | / |
\|/ |
B C
\ /
\ /
A

A = = A^0
B = A^ = A^1 = A~1
C = A^2 = A^2
D = A^^ = A^1^1 = A~2
E = B^2 = A^^2
F = B^3 = A^^3
G = A^^^ = A^1^1^1 = A~3
H = D^2 = B^^2 = A^^^2 = A~2^2
I = F^ = B^3^ = A^^3^
J = F^2 = B^3^2 = A^^3^2


學習資源

LearnGitBranching 以圖形化的方式學習 Git,可以清楚了解分支 HEAD之間的關係,左邊下command,右邊會有圖形呈現,是個不錯的學習網站。


My .gitconfig settings


Reference