So You Think You Know Git?
Gitは普段よくつかわれますが、そこで使うのは決まりきったコマンドのみです。
今回、下記の「So You Think You Know Git – FOSDEM 2024」で、Gitのことをより知れたため、その中で紹介されていたコマンドについて気になったものをピックアップしてまとめていきたいと思います。
説明
git config –global alias.<alias-name> <command>
Gitコマンドにエイリアスを設定します。
<alias-name>にエイリアスを、<command>に設定したいgitコマンドを設定します。
使うときは git <alias-name>
とするとgit <command>
が実行されます。
また git config --global alias.hoge !fuga.sh
とすることでシェルスクリプトの実行もエイリアスにできます。その場合は!を付ける必要があります。
コマンド類はオプションなどを忘れがちなのでまとめられると便利でいいですね。
参考: https://git-scm.com/docs/git-config#Documentation/git-config.txt-alias
includeIf
こちらはgitconfig
ファイルなどの設定ファイルで使います。
例えばディレクトリごとで異なるメールアドレスを使用するためgitconfigをえわけたいときなどに使用します。
仕事用と個人用で分けるときなどに便利そうです。
参考: https://git-scm.com/docs/git-config
[includeIf "gitdir:~/projects/work"] path = ~/projects/work/.gitconfig [includeIf "gitdir:~/projects/oss"] path = ~/projects/oss/.gitconfig
git blame <file-name>
ファイルの各行の変更を行ったユーザーと時刻がわかります。
-Lといった特定の行のみを対象とするオプションもあり、特定の行のみを確認などもできます。
下記について動画で説明されていました。
git blame -w
gitやgithubのGUIではgit blamme
実行時にデフォルトで空白を無視しません。
このオプションで無視することができます。git blame -C
コードの移動やコピーを検出することができます。
面白いことにgit blame -C -C
や git blame -C -C
-C
とすることで検出範囲を変えることができます。
1つの場合は、「同一コミット内で他のファイルから変更されたファイルへの移動やコピー」を検出します。
2つの場合は、「ファイルが作成されたコミットを含む、他のファイルからのコピー」も検出できるようになります。
3つの場合は、「任意のコミットで行われた、他のファイルからのコピー」を検出します。
git blameと似たものにgit log
-L
もあります。
こちらはコミットなども表示されるのでコードの特定範囲の変更履歴の確認に便利です。
関数名からも調べることができるのが便利だなと感じました。
下記について動画で説明されていました。
git log -S <string>
指定した文字列を含んだ変更の履歴を確認できます。
pickaxeとも呼ばれます。
他にもオプションがあり下記参考からドキュメントを確認できます。
参考:
https://git-scm.com/docs/git-blame
https://git-scm.com/docs/git-config#Documentation/git-config.txt-alias
https://git-scm.com/docs/git-log#Documentation/git-log.txt–Sltstringgt
https://git-scm.com/docs/git-blame#Documentation/git-blame.txt–Cltnumgt
git diff --word-diff
git diff
は行ごとの差分を確認しますがgit diff --word-diff
とすることで単語ベースで差分を確認できます。
例えばtailwindなどの場合、クラスを変更した場合行単位の差分では変更がわかりずらいですがこれを使うことでどこを変更したか追いやすくなります。
参考:
https://git-scm.com/docs/git-diff#Documentation/git-diff.txt—word-diffltmodegt
git config –global rerere.enabled true
Git の rerere
(reuse recorded resolution) 機能をグローバルに有効にします。
有効にするとマージやリベースの際に発生したコンフリクトの解決方法を記録し、後に同じコンフリクトが再発した場合に自動的にその解決方法を再利用することができます。
その記録はgit/rr-cache
にあります。
コンフリクトの解消はストレスになるのでこの機能は便利ですね。
参考:
https://git-scm.com/book/en/v2/Git-Tools-Rerere
https://git-scm.com/docs/git-config#Documentation/git-config.txt-rerereenabled
git push –force-with-lease
forceでpushする際にpushするものがサーバー側のブランチの最新状態かどうかを確認して、最新の状態のときのみpushできます。
普通のforce pushと異なり安全にforce pushすることができます。
参考:
https://git-scm.com/docs/git-push#Documentation/git-push.txt—force-with-leaseltrefnamegt
git maintenance start
このコマンドを実行するとGit リポジトリが自動的にメンテナンスタスクを定期的に実行するように設定されます。
これを行うことでバックグラウンドでメンテナンスタスクが行われ作業を高速化することができます。
参考:
https://git-scm.com/docs/git-maintenance
まとめ
今回は「So You Think You Know Git?」で紹介されたgitコマンドについてまとめました。
gitは普段から使っていますが知らないことがたくさんあり開発の効率化を行えるコマンドを知ることができました。
またgit config --global rerere.enabled true
やgit maintenance start
はとりあえず実行しておいて損はなさそうなので使っていきたいです。
今回の記事では触れませんでしたが、動画では数千ファイルあるような大きなレポジトリの管理などに関しても述べられていて、プロジェクトの規模が大きくなればなるほどgitへの理解は重要だと感じました。
読んでいただきありがとうございました。