日常的にあること(ユースケース)
- コミットしたけどもう一度変更したい
- (しかしエディタは終了してしまった)
- ブランチを切り替えたあとで、作業対象のファイルを開きたい
- コードレビューの結果、コミットを修正したい
- (テストコード含めて数ファイル修正する必要があるんだけど各ファイルをひとつひとつ開くのはめんどくさい)
どうするか
git diff-tree
を使って特定のコミットに含まれるファイル一覧を取得します。
その一覧を用いてエディタでファイルを開きます。
まとめたものが次のシェルスクリプトです(.bashrc
とかにどうぞ)。
# コミットに含まれるファイルのフルパス一覧
function _last_committed_files() {
local ref=${@:-HEAD}
local base=$(git rev-parse --show-toplevel 2> /dev/null) # リポジトリの top-level ディレクトリのフルパス
local last_committed_files=$(git diff-tree --no-commit-id --name-only -r $ref 2> /dev/null)
for file in $last_committed_files; do
echo $base/$file # 各ファイルをフルパスにする
done
}
# コミットに含まれるファイルをエディタで開く
function _edit_last_committed_files() {
local files=$(_last_committed_files $@)
test "$files" && vim -p $files # 好きなエディタでどうぞ
}
使い方
-
_last_committed_files
は、次のように最後のコミットに含まれるファイルを出力します。
$ _last_committed_files # execute function
/Users/meganemura/src/github.com/peco/peco/Changes
/Users/meganemura/src/github.com/peco/peco/cmd/peco/peco.go
-
_edit_last_committed_files
は、上の出力を利用してエディタを開きます。- 上では Vim(のタブページ)で各ファイルを開いています。
超便利だと思います。
補足
_last_committed_files
はデフォルトで HEAD
を指定していますが、引数があればそのまま git diff-tree
に渡すので、
_last_committed_files HEAD~~
や、
_last_committed_files master HEAD
とできます。
_edit_last_committed_files
も同じで
_edit_last_committed_files HEAD~~
とできます。
alias をつけて便利に使っています。
alias el='_edit_last_committed_files'
上のスクリプトは meganemura/dotfiles にもあります。