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

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

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

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

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

Fork する

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

2014-03-28_github_01

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

git clone する

  • Fork したプロジェクトをローカルに git clone します。
% 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)
% cd homebrew-versions/Casks
% git checkout -b add_firefox-ja
Switched to a new branch 'add_firefox-ja'

作業内容を add, commit する

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

% 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 の情報とローカルブランチを確認します。

% 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 します。

% 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 に追加しておきます(追加していない場合のみ)。

% 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 ブランチに移動します。

% git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

更新を取り込みます。

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

% 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

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

% 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.

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

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

% git push origin master
Everything up-to-date

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

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

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

$ git checkout myFeatureSpike
$ git checkout -b myFeature
$ git rebase -i master

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

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

pull request する

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

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

% 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 を行います。

今回は以下になります。

画面左側のセレクトメニューから、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