プロジェクトの分岐ワークフロー

可能な限り、共通の Git リポジトリで作業し、ブランチ戦略を使って作業を管理することを推奨します。しかし、貢献したいリポジトリへの書き込み権限がない場合は、フォークを作成することができます。

フォークとは、リポジトリとそのブランチの個人的なコピーのことで、好きな名前空間に作成します。自分のフォークに変更を加え、アクセス権のないリポジトリにマージリクエストで提出します。

フォークの作成

GitLab で既存のプロジェクトをフォークするには:

  1. プロジェクトのホームページで、右上にあるFork({fork}) を選択します:Fork this project
  2. オプション。プロジェクト名を編集します。
  3. プロジェクトURLでは、フォークが属するネームスペースを選択します。
  4. プロジェクトスラッグを追加します。この値はフォークのURLの一部になります。名前空間内で一意でなければなりません。
  5. オプションです。プロジェクトの説明を追加します。
  6. フォークの可視性レベルを選択します。可視性レベルの詳細については、プロジェクトとグループの可視性をお読みください。
  7. フォークプロジェクトを選択します。

GitLab がフォークを作成し、新しいフォークのページにリダイレクトします。

フォークを更新

フォークがアップストリームリポジトリと同期しなくなり、更新が必要になることがあります:

  • その前にフォークにアップストリームリポジトリにはない新しいコミットが含まれています。フォークを同期させるには、マージリクエストを作成して変更をアップストリームリポジトリにプッシュしてください。
  • 後方:アップストリームリポジトリには、あなたのフォークには存在しない新しいコミットが含まれています。フォークを同期するには、新しいコミットをフォークにプルします。
  • 前にも後ろにもアップストリームリポジトリとあなたのフォークの両方に、他方には存在しない新しいコミットが含まれています。フォークを完全に同期させるには、マージリクエストを作成して自分の変更をプッシュし、アップストリームリポジトリの新しい変更を自分のフォークにプルします。

フォークをアップストリームリポジトリと同期するには、GitLab UIまたはコマンドラインから更新します。GitLab PremiumとUltimate階層では、フォークをアップストリームリポジトリのプルミラーとして設定することで、更新を自動化することもできます。

UI から

  • GitLab 15.11 でsynchronize_forkというフラグで導入されました。デフォルトでは無効ですが、gitlab-org/gitlabgitlab-com/www-gitlab-com 名前空間のプロジェクトでのみ有効です。
  • GitLab 16.0で一般的に利用可能に。機能フラグsynchronize_fork は削除されました。

GitLab UIからフォークを更新するには:

  1. 左のサイドバーで、Search を選択するか、次のページに進んでください。
  2. View all my projects を選択します。
  3. 更新したいフォークを選択します。
  4. ブランチ名のドロップダウンリストの下にあるForked from({fork}) 情報ボックスで、フォークが先行か後行か、あるいはその両方かを判断します。この例では、フォークはアップストリームリポジトリの後ろにあります:

    Information box for a fork 23552 commits behind the upstream repository

  5. あなたのフォークがアップストリームリポジトリより前にある場合は、マージリクエストを作成を選択して、あなたのフォークの変更をアップストリームリポジトリに追加するよう提案してください。
  6. あなたのフォークがアップストリームリポジトリより遅れている場合、Update forkを選択してアップストリームリポジトリから変更を取り込みます。
  7. フォークがアップストリームリポジトリより先にあり、かつ遅れている場合、マージ競合が検出されない場合にのみ利用可能なUIから更新できます:
    • フォークにマージコンフリクトがない場合、アップストリームリポジトリに変更をプッシュする場合はマージリクエストを作成フォークに変更をプルダウンする場合はフォークを更新、またはその両方を選択できます。フォークの変更の種類によって、適切なアクションが決まります。
    • フォークにマージ競合がある場合は、コマンドラインからフォークを更新してください。

コマンドラインから

コマンドラインからフォークを更新するには、まずupstream リモートリポジトリをフォーク用に設定してください:

  1. まだクローンを作成していない場合は、ローカルにクローンを作成してください。詳細については、リポジトリのクローンを参照してください。
  2. フォークに設定されているリモートを表示します:

    git remote -v
    
  3. フォークが元のリポジトリを指すリモートを持たない場合、以下の例のいずれかを使用してupstream というリモートを設定してください:

    # Use this line to set any repository as your upstream after editing <upstream_url>
    git remote add upstream <upstream_url>
       
    # Use this line to set the main GitLab repository as your upstream
    git remote add upstream https://gitlab.com/gitlab-org/gitlab.git
    

    ローカルコピーに追加のリモートが設定されていることを確認したら、フォークを更新する準備ができました。

  4. ローカルコピーでデフォルトブランチをチェックアウトしたことを確認し、main をデフォルトブランチの名前に置き換えます:

    git checkout main
    

    Git がステージされていない変更を見つけたら、コミットするか隠しておいてください。

  5. アップストリームリポジトリに変更をフェッチします:

    git fetch upstream
    
  6. main を更新するブランチの名前に置き換えてください:

    git pull upstream main
    
  7. サーバー(GitLab.com または自己管理)上のあなたのフォークリポジトリに変更をプッシュします:

    git push origin main
    

リポジトリミラーリングの場合

以下の条件をすべて満たせば、フォークをアップストリームのミラーとして設定できます:

  1. サブスクリプションがPremiumまたはUltimateであること。
  2. すべての変更をブランチで作成します (mainではありません)。
  3. mainを変更する必要がある、機密イシューのマージリクエストには携わりません。

リポジトリミラーリングは、あなたのフォークと元のリポジトリとの同期を維持します。この方法では、1時間に1回フォークを更新し、手動でgit pull を更新する必要はありません。設定方法については、プルミラーリングの設定をお読みください。

caution
ミラーリングでは、マージリクエストを承認する前に同期を求められます。これを自動化しましょう。

アップストリームへのマージ

アップストリームプロジェクトにコードを送る準備ができたら、マージリクエストを作成してください。ソースブランチには、フォークしたプロジェクトのブランチを選択します。ターゲットブランチには、元のプロジェクトのブランチを選択します。

note
マージリクエストを作成する際、フォークしたプロジェクトの可視性が親プロジェクトよりも制限されている場合(たとえば、フォークしたプロジェクトは非公開で、親プロジェクトは公開)、ターゲットブランチのデフォルトはフォークしたプロジェクトのデフォルトブランチになります。これにより、フォークされたプロジェクトの非公開コードが公開されることを防ぎます。

Selecting branches

そして、ラベルやマイルストーンを追加し、あなたの変更をレビューできる人にマージリクエストを割り当てることができます。そして、マージリクエストを送信を選択し、処理を終了します。マージに成功すると、あなたの変更がマージ先のリポジトリとブランチに追加されます。

フォーク関係を削除すると、あなたのフォークとアップストリームプロジェクトとのリンクが解除されます。フォークは独立したプロジェクトになります。

前提条件:

  • フォークのリンクを解除するには、プロジェクトオーナーである必要があります。
caution
フォーク関係を解除すると、そのソースにマージリクエストを送ることができなくなります。誰かがあなたのプロジェクトをフォークした場合、そのフォークもフォーク関係を失います。フォーク関係を復元するにはAPIを使います。

フォーク関係を削除するには

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. 設定] > [全般]を選択します。
  3. 詳細設定] を展開します。
  4. フォーク関係の削除] セクションで、[フォーク関係の削除] を選択します。
  5. 確認するには、プロジェクト・パスを入力し、Confirm を選択します。

別のリポジトリとオブジェクトを共有するためにハッシュ化されたストレージプールを使用しているフォークのリンクを解除するとき:

  • すべてのオブジェクトがプールからフォークにコピーされます。
  • コピー処理が完了すると、ストレージプールからの更新はフォークに伝搬されません。

トラブルシューティング

エラー:An error occurred while forking the project. Please try again

このエラーは、フォークされたプロジェクトと新しいネームスペース間の共有Runner設定の不一致が原因である可能性があります。詳細は Runner ドキュメントのForksを参照してください。

フォーク関係の削除に失敗しました

UIやAPIからフォークを削除してもうまくいかない場合は、Railsのコンソールセッションでフォークリレーションシップの削除を試みることができます:

p = Project.find_by_full_path('<project_path>')
u = User.find_by_username('<username>')
Projects::UnlinkForkService.new(p, u).execute