Help us understand the problem. What is going on with this article?

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

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

awakia
検索とか推薦とかやってきたエンジニア。早稲田の山名研出身。大学院の頃、論文を書こうとしない僕を見かねた教授に、北京のMSRAに追放されるが3ヶ月後無事帰還。 大学を卒業後、エンジニアのブラックホールとの別名を持つGoogleに吸収されそうになるが1年2ヶ月後無事生還。 現在は、Wantedly(https://www.wantedly.com/ )の4番目のエージェントとして救出活動に専念。
http://awakia-n.hatenablog.com/
wantedly
「シゴトでココロオドル」ためのビジネスSNS「Wantedly」の開発・運営をしています。
https://wantedlyinc.com/ja/presentations
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away