マイGitしぐさ
Git の操作は GUI だと分かりやすいが、何度も行う定型操作はコマンドのほうが速くて楽なので エイリアスをいろいろ登録している。
git コマンドはシェルの alias に記述することもできるのだが、.gitconfig
自体に[alias]があり、コマンドのネームスペースを分けたいので自分の場合はこちらで管理している。シェルの方にはalias g='git'
だけ設定して、g aa
といった感じの運用をする。
https://github.com/miyaoka/dotfiles/blob/master/.gitconfig
ブランチの切り替えなど候補を出してインタラクティブに選択するところは fzf を使用する前提のコマンドになっている。
CLI でやるなら tig 使えばいいじゃないかという話でもあるが、以前 windows で使えなかったというのもあるので結局 alias を使う運用にしてる。
登録している alias とその説明を以下に書いていく。自分的によく使っていて便利なやつは ★ をつけている。
add, commit 編
- ★ a =
!git ls-files -m -o --exclude-standard | fzf -m --preview 'git diff --color=always {}' | xargs git add && git s
- stage されていないファイルを個別に staging。fzf で diff preview しながら選択
- ★★★ aa =
!git add -A && git s
- とりあえず現在の変更を全部 staging する。ここから
g cv
やg can
することが多い
- とりあえず現在の変更を全部 staging する。ここから
- ★★ aaa =
!git aa && git cm 'WIP'
- とりあえず全部 staging して
WIP
とコメントしてコミットする。別ブランチに切り替えたいときとか、適当にコミットしたい時によく使う。あとで reset して戻す前提(戻さないこともある)
- とりあえず全部 staging して
- aaaa =
!git cob "wip-$(date +%s)" && git add -A && git cm "emergency" -n && git psu
- 緊急災害時用。現在時刻で新規ブランチ作ってそこに全コミットして push する。使わない
- ap =
!git add -p $(git ls-files -m -o --exclude-standard | fzf -m --preview 'git diff --color=always {}')
git a
の-p 版。xargs git add -p
だとうまく行かなかったので…
- ★★★ cv =
commit -v
- git のコミットのオプションに v をつけると コミット全体の diff も表示しながらコミットメッセージを書けるので基本これを使ってる。わりと見落としが見つかりやすい。とりあえず
g aa
してg cv
しがち
- git のコミットのオプションに v をつけると コミット全体の diff も表示しながらコミットメッセージを書けるので基本これを使ってる。わりと見落としが見つかりやすい。とりあえず
- cm =
commit -m
- エディタを開かずにコミットしたいとき用。基本使ってない
- ★★★ can =
commit --amend --no-edit
- コミットした後にちょっとした修正して再コミットするときに使う。--no-edit がついているので前回のコミットメッセージのままやりなおす。修正 →
g aa
→g can
(→g ps -f
) というコンボが多い
- コミットした後にちょっとした修正して再コミットするときに使う。--no-edit がついているので前回のコミットメッセージのままやりなおす。修正 →
- ★ cam =
commit --amend -m
- コミット内容はそのままにコミットメッセージだけ書き直したい場合。でもなんか結局
g rr
でコミット自体破棄してg aa
からg cv
することもある
- コミット内容はそのままにコミットメッセージだけ書き直したい場合。でもなんか結局
reset 編
- ★ r =
git staged | fzf -m --preview 'git diff --color=always HEAD {}' | xargs git reset
- staging されているファイルを個別リセット。ファイル一覧を fzf を使って diff プレビューしながら選択。
g a
の逆
- staging されているファイルを個別リセット。ファイル一覧を fzf を使って diff プレビューしながら選択。
- ★ ra =
g reset
- staging 全 reset。普通の reset だが、
g aa
と対になるイメージで reset all
- staging 全 reset。普通の reset だが、
- rw =
!git ls-files -m -o --exclude-standard | fzf -m --preview 'git diff --color=always {}' | xargs git co && git s
- working tree ファイルの個別リセット。内容としては
g a
で add する代わりに checkout。個別コミットしてから残りをまとめてg rh
するほうが多いかも
- working tree ファイルの個別リセット。内容としては
- ★★ rh =
g reset --hard
- 全リセット。
- ★★ rho =
!git branch --show-current | sed 's/\\.*/origin\\/&/' | xargs git rh
- reset hard の強力版。とにかくローカルの内容はどうでもよくて origin の内容にしたいときに。origin の head に強制 reset する
- ★★ rr =
reset @^1
- 一個前のコミットに head を戻す。--amend でやり直すんじゃなくてコミット自体作り直したいときや WIP コミットを破棄したいときによく使う
ブランチ操作編
- b =
branch --sort=-authordate
- 日付順でローカルブランチ一覧表示
- ★★ cob =
checkout -b
- 新規ブランチ作って checkout
- ★★★ col =
!git for-each-ref --sort=-authordate --format='%(authordate:short) %(refname)' refs/heads | sed 's/refs\/heads\///' | fzf --no-sort | awk '{ print $NF }' | xargs git co
- 日付付きでローカルブランチ一覧を表示。fzf で選択して checkout する
- ★★★ cor =
!git fetch --prune && git for-each-ref --sort=-authordate --format='%(authordate:short) %(refname)' refs/remotes | sed 's/refs\/remotes\///' | grep -v 'origin/HEAD' | fzf --no-sort | awk '{ print $NF }' | xargs -I{} sh -c 'git checkout -t {} || echo {} | sed -e "s%[^/]*/%%" | xargs git co'
- col のリモートブランチ版。実行前に fetch して常に最新内容を取得。既にローカルブランチがあるとエラーになるので、その場合はローカルブランチを checkout する
各種状態表示編
- ★★ s =
status --short --branch
- ブランチ情報と差分ファイル情報を表示
- ★★ d =
diff
- working tree の diff を見る
- dc =
diff --cached
- staging の diff を見る
- ★★ l =
log --date=short --pretty=format:'%C(yellow)%h %Cgreen%cd %Cblue%cn %Creset%s'
- 各コミットを hash, date, author, message で一行に短縮表示
- ll =
!git l --stat
- 各コミットの差分ファイル表示
- lg =
!git l --graph
- グラフ表示
stash 編
- ★★ st =
stash
- 普通の stash
- ★★ stp =
stash pop
- 直前の stash を戻す。st と stp でよく使う。
- stl =
stash list
- stash 一覧
- sta =
stash apply
- 選択して apply。ほぼ使ったこと無い
fetch, pull 編
- ft =
fetch
- ftp =
fetch --prune
- pl =
pull
- ps =
push
- psu =
push -u origin HEAD
- 新規ブランチを push するとき
clone 編
こちらは.gitconfig ではなくシェルの方のエイリアス
- qg
- ghq を使ってリポジトリを clone。github の url か、
org名/repo名
で取得
- ghq を使ってリポジトリを clone。github の url か、
function qg (){
repo=$(echo ${1} | sed s%https://github.com/%%)
echo "git clone: ${repo}"
ghq get "https://github.com/${repo}.git"
}
- cc =
alias cc='ghq list | fzf | xargs -I {} code $(ghq root)/{}'
- ghq に clone 済みのリポジトリ一覧から fzf で選択して VSCode で開く