こんにちは。@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し、自分のアカウントにリポジトリを作成する
- Forkしたリポジトリをローカル環境にcloneしてくる
- Forkしたリポジトリをorigin, 本家リポジトリをupstreamとしてgitで管理する
- トピックブランチはorigin masterから作成する
この記事がいいなと思いましたらツイッター(@nishina555)のフォローもよろしくお願いします!