【保存版】Git fork元リポジトリ → fork後リポジトリ 反映方法


# はじめに

最近、GitHubの人気リポジトリについて調査して、fork して実際に使用することが多くなりました。

__「fork したけど、どうやってオリジナルの更新を追随すればいいの？」__ と疑問に思った方も多いのではないでしょうか。  
本記事では、**リポジトリのforkから、上流（upstream）の最新更新を自分のforkに取り込むまで**をステップごとに詳しく解説します。  

---

## 全体の流れをざっくり把握しよう

まずは、全体の流れを図で示します。下記のMermaidを見ながら、forkから最新更新の取り込みまでの流れを把握しましょう。

```mermaid
flowchart LR
    A[オリジナルリポジトリ] --> B[fork] 
    B --> C[ローカルにクローン]
    C --> D[upstreamリモート設定]
    D --> E[上流の更新をフェッチ]
    E --> F[マージまたはリベース]
    F --> G[fork先リポジトリにプッシュ]
```

1. **リポジトリのfork**  
2. **ローカルにクローン**  
3. **upstream（上流）リモートの設定**  
4. **上流の更新を取り込む（フェッチ・マージ or リベース）**  
5. **自分のfork先リポジトリにプッシュ**  

ここから先は、この流れに沿って詳しく説明していきます。

---

## 1. リポジトリをforkする

まず最初に行うのが、オリジナルリポジトリの**fork**です。

1. **forkしたいリポジトリのページにアクセス**  
   例: `https://github.com/オリジナルユーザー/オリジナルリポジトリ`

2. **右上の「Fork」ボタンをクリック**  
   クリックすると、自分のGitHubアカウントにリポジトリがコピーされます。

3. **fork後の確認**  
   自分のアカウント内に同名のリポジトリが作成されているはずです。

---

## 2. ローカル環境にクローンする

forkしたリポジトリは自分のアカウントにあるだけなので、**ローカル環境にクローンして作業可能な状態**にします。

```bash
git clone https://github.com/自分のユーザー名/forkリポジトリ.git
```

クローンに成功したら、クローン先のディレクトリに移動して準備完了です。

```bash
cd forkリポジトリ
```

---

## 3. 上流（upstream）リモートを設定する

fork元（オリジナル）の変更を取り込むには、**upstreamというリモート名でオリジナルリポジトリを登録**する必要があります。

1. **upstreamリモートの追加**

   ```bash
   git remote add upstream https://github.com/オリジナルユーザー/オリジナルリポジトリ.git
   ```

2. **リモート設定の確認**

   ```bash
   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 最新の更新をフェッチする

```bash
git fetch upstream
```

これにより、`upstream/master` や `upstream/main` といったブランチの最新情報がローカルにダウンロードされます。

### 4.2 自分のブランチに統合する

ここからは、**マージ**と**リベース**の2つのアプローチがあります。  

#### 【方法1】マージする場合

1. 対象ブランチ（例: `master`）にチェックアウト

   ```bash
   git checkout master
   ```

2. `upstream/master` をマージ

   ```bash
   git merge upstream/master
   ```

   ※ ブランチ名が `main` の場合は適宜読み替えてください。

#### 【方法2】リベースする場合

**履歴をきれいに保ちたい**場合はリベースがオススメです。

1. 対象ブランチ（例: `master`）にチェックアウト

   ```bash
   git checkout master
   ```

2. `upstream/master` に対してリベース

   ```bash
   git rebase upstream/master
   ```

   競合が発生したら該当箇所を修正し、修正後に以下を実行:

   ```bash
   git rebase --continue
   ```

---

## 5. 自分のfork先リポジトリに更新をプッシュする

ローカルで統合（マージ or リベース）した内容を**自分のfork先リポジトリ（origin）にプッシュ**します。

```bash
git push origin master
```

リベースを行った場合はコミット履歴が書き換わっているため、以下のように**強制プッシュ（-f）** が必要になる場合があります。使用時は慎重に行ってください。

```bash
git push -f origin master
```

---

## まとめ: forkの更新取り込みは意外と簡単！

- **fork**した時点で、オリジナルの更新は取り込まれない  
- **upstreamを設定**し、**fetch**でローカルに最新を取得  
- 取り込み方法は**マージ**か**リベース**の2択  
- **プッシュ**して自分のfork先にも変更を反映  

どのプロジェクトでも、上流の更新を追随する作業は頻繁に発生します。  
**こまめに最新の変更を取り込み、常にfork先とオリジナルリポジトリの差分を最小限に保つ**ことが、のちの開発やコラボレーションをスムーズにするコツです。

---

## 参考文献

- [GitHub公式ドキュメント](https://docs.github.com/en)  
- [オリジナルリポジトリ例](https://github.com/オリジナルユーザー/オリジナルリポジトリ)

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/