「So You Think You Know Git?」でGitコマンドについて学んだ

技術

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 truegit maintenance startはとりあえず実行しておいて損はなさそうなので使っていきたいです。
今回の記事では触れませんでしたが、動画では数千ファイルあるような大きなレポジトリの管理などに関しても述べられていて、プロジェクトの規模が大きくなればなるほどgitへの理解は重要だと感じました。
読んでいただきありがとうございました。