/Linuxコマンド

開発ツール

Git の応用

cherry-pick・bisect・worktree・tag・submodule など、毎日ではないが知っていると助かる git のサブコマンド。

基本の操作は Git と GitHub CLI にあります。

git log履歴を絞り込む

コミットの履歴を、作者・日付・内容などで絞り込んで表示します。

bash
$ git log --oneline --graph --decorate --all
$ git log --author="alice" --since="2 weeks ago"
$ git log -S "funcName"              # その文字列が増減したコミット
$ git log -G "regex"                 # 差分が正規表現に一致するコミット
$ git log --stat -5                  # 変更したファイルとその量
$ git log main..feature              # feature にあって main にないコミット
$ git log --pretty=format:'%h %ad %an %s' --date=short
$ git log --follow -- path/old_name.go   # 名前を変えたファイルも追う

git cherry-pick特定のコミットだけ取り込む

別のブランチから、特定のコミットだけを取り込みます。

bash
$ git cherry-pick a1b2c3d
$ git cherry-pick a1b2c3d..f4e5d6c   # 範囲(a1b2c3d の次から f4e5d6c まで)
$ git cherry-pick --abort

git rebase -iコミットをまとめる・並べ替える

過去のコミットをまとめたり、並べ替えたり、メッセージを直したりします。

bash
$ git rebase -i HEAD~5

開いたエディタで各行の先頭を書き換えます。

指示意味
pickそのまま使う
rewordメッセージを直す
squash / fixup1つ前のコミットにまとめる(fixup はメッセージを捨てる)
drop取り除く
bash
$ git commit --fixup a1b2c3d         # あとで a1b2c3d にまとめる用のコミット
$ git rebase -i --autosquash main    # fixup を自動で並べてまとめる

git bisectバグが入ったコミットを二分探索で探す

バグが入り込んだコミットを、二分探索で効率よく探します。

bash
$ git bisect start
$ git bisect bad                 # 今はバグがある
$ git bisect good v1.2.0         # このときは正常だった
# 切り替わったコミットで確認して good / bad を伝える、を繰り返す
$ git bisect run npm test        # テストで自動判定させることもできる
$ git bisect reset               # 終了

git stash作業を一時的にしまう

作業途中の変更を一時的にしまって、あとで取り出します。

bash
$ git stash push -m "ログイン画面の途中"
$ git stash -u                   # 追跡していないファイルも
$ git stash list
$ git stash show -p stash@{1}
$ git stash apply stash@{1}      # 戻す(一覧には残す)
$ git stash drop stash@{1}

git worktree別のブランチを同時に開く

作業中のまま、別のブランチを別のディレクトリに取り出せます。

bash
$ git worktree add ../app-hotfix hotfix/login
$ git worktree list
$ git worktree remove ../app-hotfix

git tagバージョンに印を付ける

リリースしたバージョンなどに印(タグ)を付けます。

bash
$ git tag v1.0.0                       # 軽量タグ
$ git tag -a v1.0.0 -m "初回リリース"   # 注釈付きタグ
$ git push origin v1.0.0
$ git push --tags
$ git tag -d v1.0.0 && git push origin :refs/tags/v1.0.0   # 削除
$ git describe --tags                  # 直近のタグからの位置(v1.0.0-3-ga1b2c3d)

git remote / fetchリモートの管理

リモートリポジトリの登録や、最新の状態の取得を行います。

bash
$ git remote -v
$ git remote add upstream https://github.com/original/repo.git
$ git fetch upstream && git merge upstream/main    # フォーク元に追いつく
$ git remote set-url origin [email protected]:me/repo.git
$ git fetch --prune              # 消えたリモートブランチの記録を掃除

git clean追跡していないファイルを消す

git で管理していないファイルをまとめて消します。

bash
$ git clean -n                   # 何が消えるか確認
$ git clean -fd                  # ファイルとディレクトリを消す
$ git clean -fdx                 # .gitignore されているもの(ビルド結果など)も

git reflog消えたコミットを取り戻す

reset --hard やブランチ削除のあとでも、しばらくは reflog から戻せます。

bash
$ git reflog
$ git branch rescue HEAD@{3}     # その時点にブランチを作って救出

git submodule別のリポジトリを取り込む

別のリポジトリを、自分のリポジトリの一部として取り込みます。

bash
$ git submodule add https://github.com/user/lib.git vendor/lib
$ git clone --recurse-submodules https://github.com/user/app.git
$ git submodule update --init --recursive
$ git submodule update --remote        # サブモジュールを最新に

git blame / shortlog誰が書いたか

各行を最後に変更した人や、人ごとのコミット数を表示します。

bash
$ git blame -w -C main.go              # 空白の変更や移動を無視して
$ git shortlog -sn                     # コミット数の多い人順

git archiveリポジトリを zip / tar にする

リポジトリの中身を zip や tar にまとめて書き出します。

bash
$ git archive --format=zip -o release.zip HEAD
$ git archive --prefix=app/ v1.0.0 | gzip > app-1.0.0.tar.gz

git config設定と別名

git の設定や、よく使うコマンドの別名を登録します。

bash
$ git config --global alias.lg "log --oneline --graph --decorate --all"
$ git config --global alias.st status
$ git config --global pull.rebase true
$ git config --global rerere.enabled true     # 同じ衝突の解決を覚えさせる
$ git config --global core.editor "vim"
$ git config --show-origin --list             # どのファイルの設定か

git lfs大きなファイルを扱う

Ubuntu には最初から入っていません。 で入れられます。

大きなファイルを git で扱いやすくする拡張機能です。

bash
$ git lfs install
$ git lfs track "*.psd"
$ git add .gitattributes