git blame
などを使用して、変更を加えたcommit sha hashだけわかった時、git show daced1d3
のようにすれば、そのコミットの変更内容を見れます。ですが、本当は内容よりその変更を加えたPull Requestを知りたいことありますよね?
そんなコミットからプルリクエストを探したい時に使えるgit aliasコマンドを紹介します。
git showpr
Pull Requestをマージしているコミットログを見つけます。
show pull request => showpr としてますが、名前は好きにつけてください。
.gitconfigのalias設定
[alias]
showpr = !"f() { git log --merges --oneline --reverse --ancestry-path $1...master | grep 'Merge pull request #' | head -n 1; }; f"
シェルから設定するなら以下
git config --global alias.showpr \!"f() { git log --merges --oneline --reverse --ancestry-path \$1...master | grep 'Merge pull request #' | head -n 1; }; f"
使用例
$ git showpr daced1d3
5bf98dd Merge pull request #12856 from duglin/ConfigLocation
git openpr (hubユーザー用)
Githubをコマンドでいろいろ操作できるようになるghコマンドを入れている場合使えます。こちらの方が便利なはずです。
.gitconfigのalias設定
[alias]
openpr = "!f() { gh browse -- `git log --merges --oneline --reverse --ancestry-path $1...master | grep 'Merge pull request #' | head -n 1 | cut -f5 -d' ' | sed -e 's%#%%'`; }; f"
シェルから設定するなら以下
$ git config --global alias.openpr \!"f() { gh browse -- \`git log --merges --oneline --reverse --ancestry-path \$1...master | grep 'Merge pull request #' | head -n 1 | cut -f5 -d' ' | sed -e 's%#%%'\`; }; f"
使用例
$ git openpr daced1d3
=> 該当のPull Request https://github.com/docker/docker/pull/12856 がブラウザで開く
使い方の実例
例えば、docker/dockerレポジトリのcliconfig/config.goの39行目の最後の変更がど入ったか知りたい場合、
git blame
を使うと
$ git blame cliconfig/config.go
...
dea49b74 (Morgan Bauer 2015-07-20 22:39:07 +0000 38) // ConfigDir returns the directory the configuration file is stored in
daced1d3 (Doug Davis 2015-04-28 08:00:18 -0700 39) func ConfigDir() string {
daced1d3 (Doug Davis 2015-04-28 08:00:18 -0700 40) return configDir
...
と、39行目を変更した最後のコミットがdaced1d3
だということがわかります。
Githubで見る場合は、https://github.com/docker/docker/blame/b0a18d57a73bf6b6bd2b7ea71de6065a0053e048/cliconfig/config.go#L39 で見れます。
ここで、おもむろに
$ git openpr daced1d3
と打つと、該当のPull Request https://github.com/docker/docker/pull/12856 がブラウザで開きます。
コマンドの解説
2つとも、大本のコマンドはgit log
で
$ git log --merges --oneline --reverse --ancestry-path daced1d3..master
がベースになっています。
各オプションの意味は、以下のようになってます。
-
--merges
: mergeコミットのみ表示 -
--online
: ログを1行で表示 -
--reverse
: 古いものを上に表示 -
--ancestry-path
:from..to
のpath上にあるコミットだけ表示
あとは、head
でそれの1番上を取り出して、表示したり、ブラウザで開いたりすればよいのですが、この時grep
で
Merge pull request #
というコトバが入っている部分を抜き出しています。
この理由は、Pull Requestのマージ以外にも、普通に開発の途中にmergeのコミット
4815fdc Merge branch 'master' of github.com:docker/docker into error
なども混ざってしまうからです。