OSS初心者がRailsにプルリクエストを送ってマージされるまでの一部始終

## はじめに
本稿はOSSにプルリクエストを送ったことがない方に対する「自分はこういう方法でプルリクエストを送ったぞ！」という体験記として投稿させて頂きます。初心者であってもOSSに興味がある方にはご一読頂ければ嬉しいです。

## 前提
GitHubを使って開発をしたことがある前提の内容が一部含まれます。
(これからの方にもなるべく分かるように書きますが念のため) 

## 今回出来たこと
[Rails本体](https://github.com/rails/rails)に送った[プルリクエスト](https://github.com/rails/rails/pull/35758)がマージされました:tada:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222024/f8f142a6-fe7d-fb2a-3900-ca8d306477a7.png)

[Rails Contributors掲載サイト](https://contributors.rubyonrails.org/)に載った
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222024/b56f9493-46a6-a0c4-014a-bf6541a60f73.png)

オレンジの部分が自分の名前(畏れ多い)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222024/ef99d0ce-5d15-8ec7-13ef-1f0f05b09d08.png)


## OSSにプルリクエストを送る手順
OSSごとにコントリビューション(貢献)におけるガイドラインがあるので、まずそちらに目を通しましょう。  
※ Railsの場合は以下を参照！
https://edgeguides.rubyonrails.org/contributing_to_ruby_on_rails.html

## 目次

>1. プルリクエストを送りたいリポジトリをForkする
>2. 自分の手元のリポジトリを確認
>3. 自分の手元にForkしたリポジトリをローカルにcloneする
>4. ローカルでブランチを切る
>5. 修正をコミット
>6. テストが通ることを確認
>7. git remote -vでリモートとして登録されているリポジトリを確認する
>8. 本体をupstream,自分のリポジトリをoriginとして登録する
>9. もう一度remoteとして登録されているリポジトリを確認
>10. origin(自分の作業リポジトリ)へプッシュする
>11. 本体のリポジトリを開いてプルリクを出す
>12. マージを待つ

### 1. プルリクエストを送りたいリポジトリをForkする

※ Forkが分からない方はこちらを参照 ：[リポジトリのcloneとforkの違い](https://qiita.com/matsubox/items/09904e4c51e6bc267990)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222024/4b502f88-e911-08fc-e330-e7a8c674748e.png)

### 2. 自分の手元のリポジトリを確認

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222024/2f86abc2-bd6f-7950-85fa-491479694b1a.png)

### 3. 自分の手元にForkしたリポジトリをローカルにcloneする

```console
$ git clone git@github.com:Shigeyuki-fukuda/rails.git
```

### 4. ローカルでブランチを切る

```console
$ git checkout -b ブランチ名
```

### 5. 修正をコミット

```console
$ git commit -m "英語のコミットメッセージ"
```

### 6. テストが通ることを確認

テストを実行したところテストが落ちてたのですが...
修正と関係ないところだったので、今回は一旦、無視しました。
(この修正の時master自体のCI落ちてた？のもあり一旦スルー)
通常は注視した方がいいかもです。

```console
$ rake test
```

### 7. git remote -vでリモートとして登録されているリポジトリを確認する

`Shigeyuki-fukuda/rails` がremoteのoriginとして登録されていることを確認。  

※ Git初心者の方へ
remoteというのはコミットして修正をプッシュする目的地というイメージ
例えば`git push origin master`の`origin`部分のことです。

```console
$ git remote -v
origin  git@github.com:Shigeyuki-fukuda/rails.git (fetch)
origin  git@github.com:Shigeyuki-fukuda/rails.git (push)
```

### 8. 本体をupstream,自分のリポジトリをoriginとして登録する

OSSの慣習で元のリポジトリをupstreamとし、自分の手元をoriginとして登録するみたいです。

```console
$ git remote add upstream https://github.com/rails/rails.git
$ git remote add origin git@github.com:Shigeyuki-fukuda/rails.git
```

### 9. もう一度remoteとして登録されているリポジトリを確認

これでFork元の`rails/rails`の方がupstreamならOKです。

```console
$ git remote -v
origin  git@github.com:Shigeyuki-fukuda/rails.git (fetch)
origin  git@github.com:Shigeyuki-fukuda/rails.git (push)
upstream  https://github.com/rails/rails.git (fetch)
upstream  https://github.com/rails/rails.git (push)
```

### 10. origin(自分の手元の作業リポジトリ)へプッシュする

`origin` へプッシュする

```console
$ git push origin 修正ブランチ名
```

### 11. 本体のリポジトリを開いてプルリクを出す

キャプチャ忘れてしまったのですが、本体のリポジトリを開くとプルリクを出せるぞ！という表示が通常通り出ます。
Fork先にプッシュしても本体にプルリク出せるよ！の表示が出るのでそこからプルリクを作ります。


### こんな感じのやつ↓↓↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/222024/86a6453b-de90-6ed4-d308-5637ddb41724.png)


当たり前ですが説明文は英語なので頑張りましょう。
※ ブラウザで出来る英文チェッカー
http://lifeiscolourful.hatenablog.com/entry/grammarly-n-writing

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222024/8e900186-7461-c5e3-aa83-0da0b4ca03c8.png)

### 12. マージを待つ

無事にプルリクエストがマージされたことを確認しました :sob:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222024/809ff3db-9e20-4ee7-1ff3-e6ddae60b0e0.png)

## 補足：remoteの最新をoriginに取り込みたいとき

git fetchでupstream(元のリポジトリ)の最新を取ってくる

```console
$ git fetch upstream
```

upstream(元のリポジトリ)の最新をorigin(自分の手元)にマージする

```console
$ git merge upstream/master
```

remoteの自分管理のリポジトリを最新にしたい場合はそのままプッシュする
※ 絶対に元のリポジトリ(upstream)のmasterにプッシュしてはいけません

```console
$ git push origin master
```

最新の状況になったことを確認します 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222024/da05854f-723f-28da-4fb9-50c896de8c8a.png)

## 最後に
はじめる前は、すごい複雑で一部の「選ばれし人々」によって行われる活動がOSSだと思ったのですが、やること自体はシンプルでした。「ここ直した方がいいかも？」と思ったところを修正して、それがマージされるのは皆んなの公園を綺麗にしたみたいで気分がいいですね！！
皆さんもぜひOSSに一歩踏み出してみてはいかがでしょうか？