[Git] GitHub: 実録!pull request (前編)

GitHub 上のプロジェクトへプルリクエストをしてみます。

[markdown]
複数人数でのチーム開発に加わった場合も、初回の手順はこんなフローになりそうなイメージ。
お手本を参考に進めます。

> * [GitHubへpull requestする際のベストプラクティス – hnwの日記](http://d.hatena.ne.jp/hnw/20110528)
> * [Github で Fork してから Pull Request をするまでの流れ | けーこ in サンフランシスコ](http://kik.xii.jp/archives/179)

## プロジェクトファイルを取得する

GitHub にあるプロジェクトのファイルをローカルに落とします。

### Fork する

GitHub のプロジェクトをブラウザで開き、Fork します。

2014-03-28_github_01

今回は、cask を追加することにします。

> * [caskroom/homebrew-versions](https://github.com/caskroom/homebrew-versions)

### git clone する

* Fork したプロジェクトをローカルに git clone します。

“`prettyprinted
% git clone git@github.com:DriftwoodJP/homebrew-versions.git
Cloning into ‘homebrew-versions’…
remote: Reusing existing pack: 1062, done.
remote: Total 1062 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1062/1062), 143.55 KiB | 137.00 KiB/s, done.
Resolving deltas: 100% (561/561), done.
Checking connectivity… done.
“`

## Fork したプロジェクトファイルをもとに作業を行う

### 作業用ブランチを作成する

* 必ず作業用のブランチを作成する
* ブランチ名は意図が分かりやすいものにする(ex. spike, prototype)

“`prettyprinted
% cd homebrew-versions/Casks
% git checkout -b add_firefox-ja
Switched to a new branch ‘add_firefox-ja’
“`

### 作業内容を add, commit する

作業を行い、ローカルリポジトリにコミットします。

“`prettyprinted
% git add .
% git commit -m ‘added Firefox for Japanese’
[add_firefox-ja c85d2b5] added Firefox for Japanese
1 file changed, 7 insertions(+)
create mode 100644 Casks/firefox-ja.rb
“`

### 作業用ブランチをリモートに push する

Fork したプロジェクトに、ローカルで作業したブランチを同名のリモートブランチとして push します。

remote の情報とローカルブランチを確認します。

“`prettyprinted
% git remote -v
origin git@github.com:DriftwoodJP/homebrew-versions.git (fetch)
origin git@github.com:DriftwoodJP/homebrew-versions.git (push)
% git branch
* add_firefox-ja
master
“`

push します。

“`prettyprinted
% git push origin add_firefox-ja
Counting objects: 6, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 495 bytes | 0 bytes/s, done.
Total 4 (delta 2), reused 0 (delta 0)
To git@github.com:DriftwoodJP/homebrew-versions.git
* [new branch] add_firefox-ja -> add_firefox-ja
“`

## 元のプロジェクトの更新を反映する

作業中に Fork したプロジェクトに更新があった場合、これに追随します。

### 本家リポジトリを remote に追加する

まず、本家のリポジトリを remote に追加しておきます(追加していない場合のみ)。

“`prettyprinted
% git remote add upstream git@github.com:caskroom/homebrew-versions.git
% git remote -v
origin git@github.com:DriftwoodJP/homebrew-versions.git (fetch)
origin git@github.com:DriftwoodJP/homebrew-versions.git (push)
upstream git@github.com:caskroom/homebrew-versions.git (fetch)
upstream git@github.com:caskroom/homebrew-versions.git (push)
“`

### 本家リポジトリの更新を取り込む

master ブランチに移動します。

“`prettyprinted
% git checkout master
Switched to branch ‘master’
Your branch is up-to-date with ‘origin/master’.
“`

更新を取り込みます。

この手順は、以前のエントリーも参考になるかも知れません。

> * [Fork/Clone した手元リポジトリに開発中の更新を取り込む | deadwood](https://www.d-wood.com/blog/2013/10/28_4950.html)

“`prettyprinted
% git fetch upstream
From github.com:caskroom/homebrew-versions
* [new branch] master -> upstream/master
% git diff upstream/master
% git merge upstream/master
Already up-to-date.
“`

取得した upstream/master をローカルのmasterブランチと同期させます。
(今回はリモートに更新はありません。)

### rebase

コンフリクトが起きた場合は解決します。
(今回は行わなかったがまた学習する。)

“`prettyprinted
% git checkout add_firefox-ja
Switched to branch ‘add_firefox-ja’
% git rebase master add_firefox-ja
Already on ‘add_firefox-ja’
Current branch add_firefox-ja is up to date.
“`

> * [GitHubへpull requestする際のベストプラクティス – hnwの日記](http://d.hatena.ne.jp/hnw/20110528)
> * [git rebase でコミット履歴をまとめる | deadwood](https://www.d-wood.com/blog/2013/09/04_4565.html)

### 同期・rebase した内容をリモートに push する

同期・rebase した内容を Fork したプロジェクト(GitHub)へ push します。
(今回は更新はない状態。)

“`prettyprinted
% git push origin master
Everything up-to-date
“`

## pull request 用に commit を1つにまとめる

本家のリポジトリを汚さないよう、pull request 用の commit をひとつにまとめます。
(今回は行わなかったがまた学習する。)

以下、お手本のサンプル。

> * [GitHubへpull requestする際のベストプラクティス – hnwの日記](http://d.hatena.ne.jp/hnw/20110528)

“`prettyprinted
$ git checkout myFeatureSpike
$ git checkout -b myFeature
$ git rebase -i master
“`

2つめ以降の commit をすべて `squash` 指定します。

以前にやった際には、このような手順でした。

> * [git rebase でコミット履歴をまとめる | deadwood](https://www.d-wood.com/blog/2013/09/04_4565.html)

## pull request する

### pull request 用のブランチをリモートに push する

pull request 用のブランチを Fork したプロジェクト(GitHub)に push します。

“`prettyprinted
% git remote -v
origin git@github.com:DriftwoodJP/homebrew-versions.git (fetch)
origin git@github.com:DriftwoodJP/homebrew-versions.git (push)
upstream git@github.com:caskroom/homebrew-versions.git (fetch)
upstream git@github.com:caskroom/homebrew-versions.git (push)
% git push origin add_firefox-ja
Everything up-to-date
“`

### GitHub から pull request を行う

GitHub の Fork したプロジェクトページをブラウザで開き、pull request を行います。

今回は以下になります。

* [DriftwoodJP/homebrew-versions](https://github.com/DriftwoodJP/homebrew-versions)

画面左側のセレクトメニューから、pull request 用のブランチを選択し、緑のプルリクエストマークをクリック。

2014-03-28_github_02

差分が表示されます。
さらに緑のボタンをクリックで進めます。

2014-03-28_github_03

pull request のコメントを書き、リクエストを完了します。

2014-03-28_github_04

pull request が送られました。

2014-03-28_github_05

2014-03-28_github_06
[/markdown]