はじめに
わんたんと申します。昨年度卒業生です。
本記事は、僕が社会人になって知ったgitの便利機能をまとめて書いておく記事です。
【.git/info/exclude】.gitignoreに依存せずgit追跡を無視する
.gitignoreファイルがリポジトリ内に存在する場合、.gitignoreに記載された条件にマッチするファイルが変更差分として表示されなくなります。
例えば、コンパイル後のバイナリファイル(.exe、.dllなど)を追跡させたくない場合は、以下のように記述します。
*.exe
*.dll
しかし、.gitignoreは追跡対象をリポジトリ単位で管理するため、.gitignoreへの追記が開発メンバー全員に影響が及ぶことを考慮すると、個人用に追加したファイルや開発ツールの違いによって発生してしまうファイルなどを安易に追記することができません。
そんなときは、リポジトリ内に存在する.gitディレクトリ内のinfo/excludeに対象のファイルを記載しましょう。
.git/info/excludeに記載した条件にマッチするファイルは、自分のローカルリポジトリでのみ、追跡対象から除外されます。
*.vsidx
【.gitconfig】カスタムコマンドを定義する
.gitconfigファイルは、git設定を記載することができるファイルです。
数々の設定項目がありますが、その中でも[alias]という条件を用いることで、gitのカスタムコマンドを作成することができます。
[alias]
commti = commit # git commti で git commit が呼ばれる
co = checkout # git co で git checkout が呼ばれる
上記は一例ですが、例えば僕はgit commitと入力するときはよくgit commtiとタイポするので、どちらの入力でもgit commitが実行されるように登録しています。
あるいは、git co -bでブランチ作成が実行されるように、checkoutの省略形としてcoを登録する、という方法もあります。
また、先頭にエクスクラメーションを付けた文字列として登録することで、シェルスクリプトを実行することも可能です。
僕は、ブランチをリモートにプッシュする際にブランチ名がコピーされるように記載していたり、現在の変更差分で.patchファイルを自動作成できるようにしたりしています(リモートから変更した環境差分などの保存用)。
[alias]
poh = "!git push origin HEAD && git rev-parse--abbrev-ref HEAD | awk -F'/' '{print $NF}' | iconv -f UTF-8 -t UTF-16LE | clip && echo 'Copied branch name to clipboard.'"
patch = "!git add . && git diff --cached > staged.patch && git restore --staged ."
上記はそれぞれ、git poh、git patchで実行可能です。
【interactive rebase】git履歴を整形する
gitの履歴を整えることができます。
具体的には、以下の操作が可能です。
- コミットをまとめる
- コミットを分離する
- コミットを削除する
- コミットメッセージを変更する
- コミット順序を変更する
例えば、以下のようなコミット履歴があります。
3fd56ea ファイルAの変更(3番目のコミット)
865023a ファイルBの作成(2番目のコミット)
5bc18f5 ファイルAの作成(1番目のコミット)
上記のコミット履歴のうち、1番目と3番目を結合してしまいましょう。
git rebase -i HEAD~3を実行することで、現在のブランチの最新のコミットから3つ前までをまとめて編集できます。
pick 5bc18f5 ファイルAの作成(1番目のコミット)
fixup 3fd56ea ファイルAの変更(3番目のコミット) # 順番を入れ替え、処理を「fixup」に変更する
pick 865023a ファイルBの作成(2番目のコミット)
interactive rebaseでは、エディタで開かれたコミットが上から順番にrebaseされます。
今回であれば、結合したいコミットを結合元コミットの下に配置し、処理を「fixup」とすることで、対象のコミットに含まれる差分が一つ前のコミットに集約されます。
865023a ファイルBの作成(2番目のコミット)
6f8ab4c ファイルAの作成(1番目のコミット)