LoginSignup
4
4

More than 5 years have passed since last update.

さっきコミットしたファイルを開きなおす

Last updated at Posted at 2014-08-29

日常的にあること(ユースケース)

  • コミットしたけどもう一度変更したい
    • (しかしエディタは終了してしまった)
  • ブランチを切り替えたあとで、作業対象のファイルを開きたい
  • コードレビューの結果、コミットを修正したい
    • (テストコード含めて数ファイル修正する必要があるんだけど各ファイルをひとつひとつ開くのはめんどくさい)

どうするか

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 にもあります。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4