はじめに
最近、GitHubの人気リポジトリについて調査して、fork して実際に使用することが多くなりました。
「fork したけど、どうやってオリジナルの更新を追随すればいいの?」 と疑問に思った方も多いのではないでしょうか。
本記事では、リポジトリのforkから、上流(upstream)の最新更新を自分のforkに取り込むまでをステップごとに詳しく解説します。
全体の流れをざっくり把握しよう
まずは、全体の流れを図で示します。下記のMermaidを見ながら、forkから最新更新の取り込みまでの流れを把握しましょう。
- リポジトリのfork
- ローカルにクローン
- upstream(上流)リモートの設定
- 上流の更新を取り込む(フェッチ・マージ or リベース)
- 自分のfork先リポジトリにプッシュ
ここから先は、この流れに沿って詳しく説明していきます。
1. リポジトリをforkする
まず最初に行うのが、オリジナルリポジトリのforkです。
-
forkしたいリポジトリのページにアクセス
例:https://github.com/オリジナルユーザー/オリジナルリポジトリ
-
右上の「Fork」ボタンをクリック
クリックすると、自分のGitHubアカウントにリポジトリがコピーされます。 -
fork後の確認
自分のアカウント内に同名のリポジトリが作成されているはずです。
2. ローカル環境にクローンする
forkしたリポジトリは自分のアカウントにあるだけなので、ローカル環境にクローンして作業可能な状態にします。
git clone https://github.com/自分のユーザー名/forkリポジトリ.git
クローンに成功したら、クローン先のディレクトリに移動して準備完了です。
cd forkリポジトリ
3. 上流(upstream)リモートを設定する
fork元(オリジナル)の変更を取り込むには、upstreamというリモート名でオリジナルリポジトリを登録する必要があります。
-
upstreamリモートの追加
git remote add upstream https://github.com/オリジナルユーザー/オリジナルリポジトリ.git
-
リモート設定の確認
git remote -v
以下のように表示されていれば成功です:
origin https://github.com/自分のユーザー/forkリポジトリ.git (fetch) origin https://github.com/自分のユーザー/forkリポジトリ.git (push) upstream https://github.com/オリジナルユーザー/オリジナルリポジトリ.git (fetch) upstream https://github.com/オリジナルユーザー/オリジナルリポジトリ.git (push)
4. 上流リポジトリの更新を取り込む
ここが一番大事なステップです。上流リポジトリで更新された内容を、自分のローカルへ反映する方法を見ていきましょう。
4.1 最新の更新をフェッチする
git fetch upstream
これにより、upstream/master
や upstream/main
といったブランチの最新情報がローカルにダウンロードされます。
4.2 自分のブランチに統合する
ここからは、マージとリベースの2つのアプローチがあります。
【方法1】マージする場合
-
対象ブランチ(例:
master
)にチェックアウトgit checkout master
-
upstream/master
をマージgit merge upstream/master
※ ブランチ名が
main
の場合は適宜読み替えてください。
【方法2】リベースする場合
履歴をきれいに保ちたい場合はリベースがオススメです。
-
対象ブランチ(例:
master
)にチェックアウトgit checkout master
-
upstream/master
に対してリベースgit rebase upstream/master
競合が発生したら該当箇所を修正し、修正後に以下を実行:
git rebase --continue
5. 自分のfork先リポジトリに更新をプッシュする
ローカルで統合(マージ or リベース)した内容を自分のfork先リポジトリ(origin)にプッシュします。
git push origin master
リベースを行った場合はコミット履歴が書き換わっているため、以下のように強制プッシュ(-f) が必要になる場合があります。使用時は慎重に行ってください。
git push -f origin master
まとめ: forkの更新取り込みは意外と簡単!
- forkした時点で、オリジナルの更新は取り込まれない
- upstreamを設定し、fetchでローカルに最新を取得
- 取り込み方法はマージかリベースの2択
- プッシュして自分のfork先にも変更を反映
どのプロジェクトでも、上流の更新を追随する作業は頻繁に発生します。
こまめに最新の変更を取り込み、常にfork先とオリジナルリポジトリの差分を最小限に保つことが、のちの開発やコラボレーションをスムーズにするコツです。