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


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

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

## 	git showpr

Pull Requestをマージしているコミットログを見つけます。
show pull request => showpr としてますが、名前は好きにつけてください。

### .gitconfigのalias設定

```ruby:.gitconfig
[alias]
  showpr = !"f() { git log --merges --oneline --reverse --ancestry-path $1...master | grep 'Merge pull request #' | head -n 1; }; f"
```

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

```bash
git config --global alias.showpr \!"f() { git log --merges --oneline --reverse --ancestry-path \$1...master | grep 'Merge pull request #' | head -n 1; }; f"
```

### 使用例

```bash
$ git showpr daced1d3
5bf98dd Merge pull request #12856 from duglin/ConfigLocation
```

## git openpr (hubユーザー用)

Githubをコマンドでいろいろ操作できるようになる[gh](https://github.com/cli/cli)コマンドを入れている場合使えます。こちらの方が便利なはずです。

### .gitconfigのalias設定

```ruby:.gitconfig
[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"
```

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

```bash
$ 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"
```

### 使用例

```bash
$ git openpr daced1d3
```

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

## 使い方の実例

例えば、[docker/dockerレポジトリのcliconfig/config.goの39行目](https://github.com/docker/docker/blob/b0a18d57a/cliconfig/config.go#L39)の最後の変更がど入ったか知りたい場合、

![Kobito.FwA6FR.png](https://qiita-image-store.s3.amazonaws.com/0/6664/48e7afaa-29be-2299-b8f2-4f72a5a8584d.png "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](https://qiita-image-store.s3.amazonaws.com/0/6664/c452648d-91cf-b60e-298f-b7b888d61a48.png "Kobito.OzZxmV.png")



ここで、おもむろに

```bash
$ git openpr daced1d3
```

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

![Kobito.WNTi2R.png](https://qiita-image-store.s3.amazonaws.com/0/6664/c8d0a106-8300-0dd2-0567-9ac3da1c8356.png "Kobito.WNTi2R.png")



## コマンドの解説

2つとも、大本のコマンドは`git log`で

```bash
$ 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
```

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