どこまでもズボラなgit aliasたちを極める

作成日: 2024-06-24
gitのコマンドは長く、覚えづらいです。GUIもめんどくさいです。エイリアスで短くしましょう。
紹介するエイリアスを使うと、こんな感じの作業になります。
$ fom good-pr # ブランチ新規作成、作業開始!
$ echo better fix > fixed
$ ac fix # とりあえずコミット
$ echo perfect fix > fixed
$ ac ture fix # もう一回、新規コミット
$ gi
(リベース作業でコミットをまとめる)
$ z fix a malform function # まともなコメントにrename
$ gp # プッシュ
$ pr
(ブラウザが開く)

$ c コミットする

$ git commit -m "good message"
$ c good message
git commit -mと等価の1文字alias。とても便利
c-func(){git commit -m "$*"}
alias c='noglob c-func'
zshのnoglob機能と組み合わせると良いです。クオートせずにメッセージを書けます

$ a. 全部ステージする

$ git add -A
$ a.
git add -Aでコミットが作れる状態にしてます。gitのworkdirはきれいな方が楽。適宜.gitignoreに突っ込みましょう。

$ ac 全部コミットする

$ a. && git status -sb && c good message
$ ac good message
作業途中でも全部コミットします

$ am 今のステージにコミットを変える

$ a. && git status -sb && git commit --amend --no-edit
$ am
HEADコミットをやり直します

$ z コミットメッセージを直す

$ git commit --amend -m "fixed message"
$ z fixed message
HEADコミットメッセージを修正します

$ gp 安全なフォースプッシュ

$ git push --force-with-lease
$ gp
git push -f有害です

$ f フェッチ

$ git fetch
$ f
pullではなく、fetchをよく使います

$ fm メインブランチをフェッチ

$ git-default-branch(){ git remote show origin | head -n 5 | sed -n '/HEAD branch/s/.*: //p'i }
$ git fetch $(git-default-branch)
$ fm
mainブランチだけfetchしたい。 git-default-branch でデフォルトのブランチを取得します。

$ o チェックアウト

$ git switch feature
$ o feature
checkouto aliasを昔から使っていたので、 switch でもそのまま

$ ob 新規ブランチ作成してチェックアウト

$ git switch -c feature
$ ob feature
これも checkout -b の名残です

$ om メインブランチから新規ブランチチェックアウト

$ git switch $(git-default-branch) -c feature
$ om feature
mainブランチからブランチを切る。git-default-branchの定義はページの最後にあります。

$ fom メインブランチ更新して新規チェックアウト

$ fm && om feature
 $ fom feature
mainブランチをfetchして、mainブランチから始めます。(どこにcheckoutしていてもできます!)

$ o- 前のブランチに戻る

$ git switch -
$ o-
前に居たブランチに戻ります

$ gri リベース開始

$ git rebase -i
$ gri
雑にコミットして、後からリベースする流派なのでめっちゃ使います

$ gi メインブランチからリベース開始

$ git rebase --autosquash -i --keep-base ${1-$(git-default-branch)}}
$ gi
ブランチの根本からリベースします

$ grc リベース続行

$ git rebase --continue
$ grc
リベース中によく使います

$ gra リベース中断

$ git rebase --abort
$ gra
リベースをミスってよく使います

$ grs コミットを置き換える

$ git reset --soft
$ grc
--softだけ安全性が高いので、エイリアスしています

$ pr プルリクエストを開く

$ gh pr create -w
$ pr
GitHubのPRを開く。便利。

コピペ用

紹介していないエイリアスも含まれています。
alias g='git'

# git add aliases
alias a='git add'
alias a.='git add -A'
alias ac='git add -A && git status -sb && c'
alias am='git add -A && git status -sb && git commit --amend --no-edit'

alias ga='git add'
alias gap='git add -p'
alias gan='git add -NA'

# git commit aliases
c-func(){git commit -m "$*"}
alias c='noglob c-func'
alias ca='git commit --amend --no-edit'
cam-func(){git commit --amend -m "$*"}
alias cam='noglob cam-func'
cf(){git commit --fixup ${1-HEAD}}
z-func(){git commit --amend -m "$*"}
alias z='noglob z-func'

alias gc='git commit'
alias gca='git commit -v -a'
alias gcm='git commit -m'
alias gcp='git commit -p -v'

# git checkout aliases
alias o='git checkout'
alias ob='git checkout -b'
om(){git checkout $(git-default-branch) -b $@}
fom(){fm && om $@}
alias o-='git checkout -'

# git fetch aliases
alias f='git fetch'
fb(){git fetch origin $1:$1}
fm(){fb $(git-default-branch)}

# git misc aliases
alias gb='git branch'
alias gp='git push --force-with-lease'
alias grs='git reset --soft'
alias pr="gh pr create -w"

# git rebase aliases
alias gr='git rebase'
gi(){git rebase --autosquash -i --keep-base ${1-$(git-default-branch)}}
alias grc='git rebase --continue'
alias gra='git rebase --abort'
alias gri='git rebase -i'
grm(){git rebase $(git-default-branch)}

# git tools
git-default-branch(){ git remote show origin | head -n 5 | sed -n '/HEAD branch/s/.*: //p'i }
git-current-branch(){ git rev-parse --abbrev-ref HEAD }
git-current-remote(){ echo ${$(git rev-parse --abbrev-ref HEAD@{upstream})%%/*} }
git-rename-remote(){ local REMOTE=$(git-current-remote); git push $REMOTE :$(git-current-branch) && git branch -m $1 && git push -u $REMOTE $1 }
git-rename(){ git branch -m $1 }
git-delete(){ git branch -D $1 }
git-change(){ local BRANCH=$(git-current-branch); git switch -d $1 && git switch -C $BRANCH }