Perl開発者のためのLinux入門

パッチ作成の一連の手順 / Git

 Gitではパッチを作成して適用するという手順がものすごく簡単なのでとても便利です。

githubでのパッチ作成の手順

プロジェクトをforkする

 最終的にパッチを適用してもらうためには、インターネット上にあなたのリポジトリを公開する必要があります。forkボタンをクリックしてパッチを適用してもらいたいプロジェクトをforkします。プロジェクトのコピーがあなたのリポジトリ上にコピーされます。

 この図では「my fork」となっていますが、これは私がすでに「mojo」をforkしているからです。もともとは「fork」になっています。

 forkした直後はどのようになっているかというと以下のようになっています。

+------------------+        +------------------+
|開発者のリポジトリ|        |あなたのリポジトリ|
|master            |        |master            |
|branch1           |------->|                  |
|branch2           |        |                  |
|                  |        |                  |
+------------------+        +------------------+

 forkすることによって次のことが行われるので覚えておいてください。

+リポジトリの全情報がコピーされる。

+ブランチmasterが自動的に作られる。開発者のリポジトリのmasterとあなたのリポジトリのmasterは一致している。

(2)あなたのインターネット上のリポジトリをローカルにコピーする

 次に行う作業はforkでコピーしてインターネット上に作成したあなたのリポジトリをローカルにコピーする作業です。ここからはインターネット上にあるリポジトリのことをリモートリポジトリと呼ぶことにします。あなたのパソコンの中にあるリポジトリのことをローカルリポジトリと呼ぶことにします。

 次に行う必要があるのは、あなたのリモートリポジトリをローカルにコピーすることです。リモートリポジトリをローカルにコピーするには「git clone」コマンドを使用します。

 「git clone」の引数に指定するURLは「Your Clone URL」の部分に表示されているものです。

 あなたのリモートリポジトリの内容をローカルにコピーするには、好きなディレクトリに移動してから「git clone」を実行します。

git clone 「Your Clone URL」

 上記のサンプルでは、

git clone git@github.com:yuki-kimoto/mojo.git

となります。

 これで、リポジトリは次のような状態になります。

+------------------+        +------------------+
|開発者の          |        |あなたの          |
|リモートリポジトリ|        |リモートリポジトリ|                  ^
|master            |        |master            |                  |
|branch1           |        |                  |                  |
|branch2           |        |                  |    インターネット|
+------------------+        +------------------+                  |
                                                                  |
------------------------------------------------------------------+
                                                                  |
                            +------------------+                  |
                            |あなたの          |    ローカル      |
                            |ローカルリポジトリ|                  |
                            |master            |                  |
                            |                  |                  |
                            |                  |                  v
                            +------------------+

リモートレポジトリに名前を付ける

 Gitではリモートレポジトリに名前をつけることが慣習になっています。リモートレポジトリに名前をつけておくとURLではなくその名前でアクセスすることができるので便利です。

 開発者のリモートレポジトリとあなたのリモートリポジトリの両方に名前をつけておきます。リモートレポジトリに名前を付けるには「git remote add」コマンドを使用します。

<h3>あなたのリモートリポジトリ</h3>
git remote add origin 「Your Clone URL」

<h3>開発者のリモートリポジトリ</h3>
git remote add 開発者名など 「Public Clone URL」

 自分のリモートリポジトリには「origin」という名前を付けるのが慣習になっているのでそれに従いましょう。開発者のリモートレポジトリ名は何でもかまいませんが、開発者名などを付けておくとよいかもしれません。

 これまでに解説してきたサンプルの場合は次のようになります。

<h3>あなたのリモートリポジトリ</h3>
git remote add origin git@github.com:yuki-kimoto/mojo.git

<h3>開発者のリモートリポジトリ</h3>
git remote add kraih git://github.com/kraih/mojo.git

 リモートリポジトリ名の一覧は「git remote」で取得できます。

git remote

 それぞれのリモートリポジトリの状態を参照したい場合は、

git remote show リモートリポジトリ名

で参照できます。

ローカルリポジトリにパッチ用のブランチを作成する

 次はパッチを作成する準備としてローカルリポジトリにパッチ用のブランチを作成します。注意して欲しいのはパッチを作成する場合はmasterに変更を加えてはいけないということです。後で解説しますが、masterは開発者のリモートリポジトリのmasterと歩調を合わせておきます。masterにあなたが手を加えてはいけません。

 ブランチ名は、パッチを表現する簡単な名前にしておくのがよいでしょう。ブランチを作成するには、「git branch」コマンドを使用します。-lオプションを使うと新しいブランチを作成することができます。

git branch 新規ブランチ名

とします。「patch1」というブランチを作成するには

git branch patch1

とします。これでmasterと同じ内容を持ったブランチpatch1を作成したことになります。現在の状況を図示しておきます。

+------------------+        +------------------+
|開発者の          |        |あなたの          |
|リモートリポジトリ|        |リモートリポジトリ|                  ^
|master            |        |master            |                  |
|branch1           |        |                  |                  |
|branch2           |        |                  |    インターネット|
+------------------+        +------------------+                  |
      kraih                        origin                         |
                                                                  |
------------------------------------------------------------------+
                                                                  |
                            +------------------+                  |
                            |あなたの          |    ローカル      |
                            |ローカルリポジトリ|                  |
                            |master            |                  |
                            |patch1            |                  |
                            |                  |                  v
                            +------------------+

ブランチを切り替えてソースコードに修正を加える

 現在はmasterブランチにいるのでこのままソースコードに変更を加えるとmasterに変更を加えることになります。ブランチpatch1に切り替えて作業を行います。

 ブランチを切り替えるには「git checkout」コマンドを使用します。

git checkout ブランチ名

 patch1に切り替えるには次のようにします。

git checkout patch1

 これでソースコードに修正を加える準備ができました。ソースコードに変更を加えましょう。パッチを作成するといっても行うことはソースコードに変更を加えるだけですのでぜんぜん難しくありません。

ローカルリポジトリにコミットする

 ソースコードに変更を加えた後はローカルリポジトリにコミットします。これはいつもどおりの作業です。

git add .
git commit

あなたのリモートリポジトリに変更を反映する

 パッチを当ててもらうにはインターネットに公開することが必要です。これもいつもどおりの手順で、リモートリポジトリにローカルリポジトリの内容を反映させましょう。patch1というブランチを反映させる必要があるので次のようにします。

git push origin patch1

 「git push」はローカルリポジトリの内容をリモートリポジトリに反映させるためのコマンドです。

githubの「pull request」ボタンを押す

 最後にパッチを作成したよということを開発者に伝える必要があります。githubのあなたのリポジトリのpatch1ブランチに移ってから「pull request」ボタンを押します。

 パッチを作成したブランチに移動(ここではtrial1という名前になっている)

 「pull request」でパッチを当てて欲しい旨のメッセージを送る。

 こうすれば、パッチを開発者の方に当ててもらうことができます。

開発者のリポジトリのmasterブランチをローカルのリポジトリのmasterに反映する

 パッチというのは、開発者のリポジトリの最新のmasterブランチに対して当てるようにするのがよいです。開発者のリポジトリのmasterは開発者が随時更新していきます。けれどもローカルのリポジトリのmasterは古いままです。

 このような場合は「git pull」コマンドを使用して、開発者のリモートリポジトリのmasterをローカルリポジトリのmasterに反映させます。まずブランチをmasterに切り替えます。

git checkout master

 この状態で開発者のリモートリポジトリに対して「git pull」を行います。

git pull 開発者のリモートリポジトリ

 今回の例では

git pull kraih

となります。そして新しくパッチを作成したい場合は、最新のmasterから新しいブランチpatch2を派生させてパッチを作成することになります。