Edited at
GitDay 18

Commit Hash から、該当 Pull Request を見つける方法

More than 3 years have passed since last update.

git blameなどを使用して、変更を加えたcommit sha hashだけわかった時、git show daced1d3のようにすれば、そのコミットの変更内容を見れます。ですが、本当は内容よりその変更を加えたPull Requestを知りたいことありますよね?

そんなコミットからプルリクエストを探したい時に使えるgit aliasコマンドを紹介します。


git showpr

Pull Requestをマージしているコミットログを見つけます。

show pull request => showpr としてますが、名前は好きにつけてください。


.gitconfigのalias設定


.gitconfig

[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をコマンドでいろいろ操作できるようになるhubコマンドを入れている場合使えます。こちらの方が便利なはずです。


.gitconfigのalias設定


.gitconfig

[alias]

openpr = "!f() { hub browse -- `git log --merges --oneline --reverse --ancestry-path $1...master | grep 'Merge pull request #' | head -n 1 | cut -f5 -d' ' | sed -e 's%#%pull/%'`; }; f"

シェルから設定するなら以下

$ git config --global alias.openpr \!"f() { hub browse -- \`git log --merges --oneline --reverse --ancestry-path \$1...master | grep 'Merge pull request #' | head -n 1 | cut -f5 -d' ' | sed -e 's%#%pull/%'\`; }; f"


使用例

$ git openpr daced1d3

=> 該当のPull Request https://github.com/docker/docker/pull/12856 がブラウザで開く


使い方の実例

例えば、docker/dockerレポジトリのcliconfig/config.goの39行目の最後の変更がど入ったか知りたい場合、

Kobito.FwA6FR.png

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 で見れます。

Kobito.OzZxmV.png

ここで、おもむろに

$ git openpr daced1d3

と打つと、該当のPull Request https://github.com/docker/docker/pull/12856 がブラウザで開きます。

Kobito.WNTi2R.png


コマンドの解説

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

なども混ざってしまうからです。