フォークしたリポジトリとオリジナルリポジトリの同期

## フォークしたリポジトリとオリジナルリポジトリの変更を同期し、マージする手順書

この記事では、フォークしたリポジトリをオリジナルリポジトリと同期させ、その後マージを行う手順を詳しく説明します。以下の手順に従って、フォーク先とローカルリポジトリを最新の状態に保ち、スムーズに開発を進めましょう。

### 前提条件
- GitHubアカウントを持っていること
- フォークしたリポジトリをローカルにクローンしていること
- Gitがインストールされていること

### 手順1: フォークしたリポジトリをオリジナルと同期する

#### 1. GitHubのウェブUIで「Sync fork」ボタンを使用する

1. **GitHubにログイン**し、フォークしたリポジトリのページに移動します。
2. リポジトリのトップページにある「**Sync fork**」ボタンをクリックします。
   - このボタンはリポジトリの上部に表示されています。
3. 「Sync fork」をクリックすると、フォーク先のリポジトリがオリジナルリポジトリ（upstream）の最新の変更と自動的に同期されます。

#### 2. コマンドラインを使用してフォークを同期する（オプション）

もしウェブUIを使用せずにコマンドラインで同期したい場合は、以下の手順を実行します。

1. **ローカルリポジトリに移動**します。

   ```bash
   cd /path/to/your/local/repo
   ```

2. **オリジナルリポジトリをupstreamとして追加**します（まだ追加していない場合）。

   ```bash
   git remote add upstream https://github.com/original-owner/original-repo.git
   ```

3. **upstreamから最新の変更をフェッチ**します。

   ```bash
   git fetch upstream
   ```

4. **mainブランチにチェックアウト**します。

   ```bash
   git checkout main
   ```

5. **upstreamのmainブランチをマージ**します。

   ```bash
   git merge upstream/main
   ```

6. **ローカルのmainブランチをフォーク先（origin）にプッシュ**します。

   ```bash
   git push origin main
   ```

### 手順2: ローカルリポジトリに最新の変更をプルする

フォークをGitHub上で同期した後、ローカルリポジトリにもその変更を反映させます。

1. **ローカルリポジトリに移動**します。

   ```bash
   cd /path/to/your/local/repo
   ```

2. **mainブランチにチェックアウト**します。

   ```bash
   git checkout main
   ```

3. **最新の変更をプル**します。

   ```bash
   git pull origin main
   ```

   - これにより、GitHub上で同期されたフォーク先の最新の変更がローカル環境にも反映されます。

### 手順3: 新しいブランチを作成して作業する

最新の状態に同期されたmainブランチから新しいブランチを作成し、作業を進めます。

1. **新しいブランチを作成してチェックアウト**します。

   ```bash
   git checkout -b feature/new-feature
   ```

2. **必要な変更を行い、コミット**します。

   ```bash
   git add .
   git commit -m "Add new feature"
   ```

3. **新しいブランチをフォーク先にプッシュ**します。

   ```bash
   git push origin feature/new-feature
   ```

### 手順4: プルリクエストを作成する

フォーク先のリポジトリからオリジナルリポジトリに対してプルリクエスト（PR）を作成します。

1. **GitHubのウェブサイトに移動**し、フォークしたリポジトリのページを開きます。
2. 「**Compare & pull request**」ボタンをクリックします。
3. PRのタイトルと説明を記入し、「**Create pull request**」ボタンをクリックしてPRを作成します。

### 手順5: マージの確認と解決（コンフリクトが発生した場合）

PRが承認され、オリジナルリポジトリにマージされると、フォーク先とローカルリポジトリは最新の状態になります。ただし、複数人で作業している場合や頻繁にオリジナルリポジトリが更新される場合、マージコンフリクトが発生する可能性があります。その場合の対処法は以下の通りです。

1. **ローカルリポジトリでmainブランチにチェックアウト**します。

   ```bash
   git checkout main
   ```

2. **upstreamのmainブランチをフェッチしてマージ**します。

   ```bash
   git fetch upstream
   git merge upstream/main
   ```

3. **コンフリクトが発生したファイルを修正**します。
   - Gitはコンフリクト箇所を示すマーカー（`<<<<<<<`, `=======`, `>>>>>>>`）を挿入しますので、適切に修正します。

4. **修正後、変更をステージしてコミット**します。

   ```bash
   git add .
   git commit -m "Resolve merge conflicts"
   ```

5. **ローカルのmainブランチをフォーク先にプッシュ**します。

   ```bash
   git push origin main
   ```

### 手順6: フォークとローカルリポジトリを最新に保つ利点

- **最新の変更を取り込むことで、コードの一貫性を保つことができる**。
- **コンフリクトの発生を最小限に抑えることができる**。
- **他のコラボレーターとの作業をスムーズに統合できる**。

### まとめ

フォークしたリポジトリとオリジナルリポジトリを定期的に同期させることで、最新の変更を取り込み、効率的に開発を進めることができます。GitHubの「Sync fork」ボタンやGitコマンドを活用し、ローカルリポジトリとの同期を保ちながら、円滑なコラボレーションを実現しましょう。

---

### 参考コマンド一覧

```bash
# リポジトリのクローン
git clone https://github.com/your-username/forked-repo.git

# リモートの確認
git remote -v

# upstreamの追加
git remote add upstream https://github.com/original-owner/original-repo.git

# upstreamからフェッチ
git fetch upstream

# mainブランチにチェックアウト
git checkout main

# upstreamのmainをマージ
git merge upstream/main

# mainをプッシュ
git push origin main

# 新しいブランチの作成
git checkout -b feature/new-feature

# 変更をステージング
git add .

# コミット
git commit -m "Add new feature"

# ブランチをプッシュ
git push origin feature/new-feature

# PR作成後のマージコンフリクト解決
git checkout main
git fetch upstream
git merge upstream/main
# コンフリクトを修正
git add .
git commit -m "Resolve merge conflicts"
git push origin main
```

これらの手順とコマンドを活用して、フォークしたリポジトリを効果的に管理し、オリジナルリポジトリとの同期を保ちながら開発を進めてください。