開発ツール
Git の応用
cherry-pick・bisect・worktree・tag・submodule など、毎日ではないが知っていると助かる git のサブコマンド。
基本の操作は Git と GitHub CLI にあります。
git log履歴を絞り込む
コミットの履歴を、作者・日付・内容などで絞り込んで表示します。
$ 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特定のコミットだけ取り込む
別のブランチから、特定のコミットだけを取り込みます。
$ git cherry-pick a1b2c3d
$ git cherry-pick a1b2c3d..f4e5d6c # 範囲(a1b2c3d の次から f4e5d6c まで)
$ git cherry-pick --abortgit rebase -iコミットをまとめる・並べ替える
過去のコミットをまとめたり、並べ替えたり、メッセージを直したりします。
$ git rebase -i HEAD~5開いたエディタで各行の先頭を書き換えます。
| 指示 | 意味 |
|---|---|
pick | そのまま使う |
reword | メッセージを直す |
squash / fixup | 1つ前のコミットにまとめる(fixup はメッセージを捨てる) |
drop | 取り除く |
$ git commit --fixup a1b2c3d # あとで a1b2c3d にまとめる用のコミット
$ git rebase -i --autosquash main # fixup を自動で並べてまとめるgit bisectバグが入ったコミットを二分探索で探す
バグが入り込んだコミットを、二分探索で効率よく探します。
$ git bisect start
$ git bisect bad # 今はバグがある
$ git bisect good v1.2.0 # このときは正常だった
# 切り替わったコミットで確認して good / bad を伝える、を繰り返す
$ git bisect run npm test # テストで自動判定させることもできる
$ git bisect reset # 終了git stash作業を一時的にしまう
作業途中の変更を一時的にしまって、あとで取り出します。
$ 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別のブランチを同時に開く
作業中のまま、別のブランチを別のディレクトリに取り出せます。
$ git worktree add ../app-hotfix hotfix/login
$ git worktree list
$ git worktree remove ../app-hotfixgit tagバージョンに印を付ける
リリースしたバージョンなどに印(タグ)を付けます。
$ 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リモートの管理
リモートリポジトリの登録や、最新の状態の取得を行います。
$ 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 で管理していないファイルをまとめて消します。
$ git clean -n # 何が消えるか確認
$ git clean -fd # ファイルとディレクトリを消す
$ git clean -fdx # .gitignore されているもの(ビルド結果など)もgit reflog消えたコミットを取り戻す
reset --hard やブランチ削除のあとでも、しばらくは reflog から戻せます。
$ git reflog
$ git branch rescue HEAD@{3} # その時点にブランチを作って救出git submodule別のリポジトリを取り込む
別のリポジトリを、自分のリポジトリの一部として取り込みます。
$ 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誰が書いたか
各行を最後に変更した人や、人ごとのコミット数を表示します。
$ git blame -w -C main.go # 空白の変更や移動を無視して
$ git shortlog -sn # コミット数の多い人順git archiveリポジトリを zip / tar にする
リポジトリの中身を zip や tar にまとめて書き出します。
$ git archive --format=zip -o release.zip HEAD
$ git archive --prefix=app/ v1.0.0 | gzip > app-1.0.0.tar.gzgit config設定と別名
git の設定や、よく使うコマンドの別名を登録します。
$ 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 で扱いやすくする拡張機能です。
$ git lfs install
$ git lfs track "*.psd"
$ git add .gitattributes