OSS活動する人必見!Forkしたリポジトリのローカルでの管理方法について

git

こんにちは。仁科(@nishina555)です。

みなさんはGitHubのリポジトリ管理でForkという言葉を聞いたことがありますでしょうか?

Forkとは本家のリポジトリを自分のリポジトリとしてコピーする方法で、本家のリポジトリの内容を自分で色々とカスタマイズしたいときに利用します。

Forkを利用することで本家のリポジトリを汚すことなく、自由にソースコードを修正し検証ができるため、OSS活動をするときなどに活用します。

今回はそのForkについて実際のやり方とどのようにローカルで管理するかについて説明をしたいと思います。

今回の説明では、facebookのcreate-react-appというリポジトリを実際にForkする例をもとに話を進めていきます。

本家のリポジトリを自分のアカウントにForkしてくる

まずは対象のリポジトリのソースコードを自分のリポジトリとして持ってきます。この作業がForkです。

例えば、facebookincubator/create-react-appを自分(nishina555)がフォークするとnishina555/create-react-appというものが自分のアカウントに作成されます。

Forkはオリジナルのリポジトリにある以下の部分からできます。

Forkしたリポジトリをローカルにcloneする

Forkが完了すると自分のアカウントにリポジトリが作成されます。
ローカルにcloneする際はこのForkした自分のリポジトリからソースコードを持ってきます。

$ git clone https://github.com/nishina555/create-react-app.git

Cloning into 'create-react-app'...
...
...
...

$ cd create-react-app
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

これでForkしたcreate-react-app(nishina555/create-react-app)のmasterをcloneすることができました。

本家のリポジトリをローカルで管理できるようにする

次に、本家(フォーク元)のリポジトリの管理もローカルでできるようにします。
これは、本家のリポジトリの修正をフォークしてきた自分のリポジトリにも反映できるようにするためです。

Forkしてきたリポジトリの向き先をoriginに設定していた対して、オリジナルのリポジトリをupstreamという名前で設定します。

$ git remote add upstream https://github.com/facebookincubator/create-react-app.git

$ git fetch upstream
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/upstream/master

remotes/upstream/masterというのがブランチ一覧に出ているところからわかるように、これで本家のリポジトリも管理できるようになりました。

Forkしたリポジトリからトピックブランチを作成する

Forkをしたmasterブランチをローカルに用意したあとは実際の修正をするためmasterブランチからトピックブランチを作成します。

$ git checkout master
$ git checkout -b <topic-branch-name>

本家のリポジトリに修正が加わった場合

もし、本家のリポジトリに修正が加わった場合、その修正をorigin masterに反映させます。

pull upstream master (fetch & merge)をすることでForkしたリポジトリであるorigin masterに本家リポジトリであるupstream masterの内容を取り込むことができます。

$ git checkout master
$ git pull upstream master

反映後、origin masterからトピックブランチを作成することでトピックブランチにも本家リポジトリの追加修正が加わることになります。

$ git checkout -b <topic-branch-name>

トピックブランチで作業している期間で本家のリポジトリに修正が加わった場合

もし、トピックブランチで作業中に本家リポジトリに追加修正がされたとします。

すでに切られたトピックブランチに本家を反映させる場合は、まずmasterを最新の状態にしたさせた後、masterでrebaseをします。

$ git checkout master
$ git pull upstream master
$ git checkout <your-topic-branch>
$ git rebase master

個人で開発する上ではrebase masterでもpull masterでも構いません。
しかし、OSS活動を前提とした開発をしている場合はコミットログをキレイに保つためにpullではなくrebaseを利用したほうがよいです。

まとめ

以上でForkしたリポジトリのローカルでの管理方法についての説明を終わります。

まとめると以下のようになります。

Forkしたリポジトリの管理方法
  1. 本家のリポジトリをForkし、自分のアカウントにリポジトリを作成する
  2. Forkしたリポジトリをローカル環境にcloneしてくる
  3. Forkしたリポジトリをorigin, 本家リポジトリをupstreamとしてgitで管理する
  4. トピックブランチはorigin masterから作成する

この記事がいいなと思いましたらツイッター(@nishina555)のフォローもよろしくお願いします!