マージコンフリクト
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
マージコンフリクトは、マージリクエスト内の2つのブランチ(ソースブランチとターゲットブランチ)で、同じコード行に対して異なる変更が加えられている場合に発生します。ほとんどの場合、GitLabは変更をまとめてマージできますが、コンフリクトが発生した場合は、どちらの変更を保持するかを決定する必要があります。
コンフリクトが発生したマージリクエストを解決するには、次のいずれかの操作を行う必要があります:
- マージコミットを作成します。
- リベースによってコンフリクトを解決します。
GitLabでは、ターゲットブランチにマージせずに、ソースブランチにマージコミットを作成することでコンフリクトを解決します。その後、マージコミットを確認およびテストし、意図しない変更が含まれていないこと、ビルドが壊れていないことを検証できます。
コンフリクトブロックについて
Gitがユーザーによる決定を必要とするコンフリクトを検出すると、コンフリクトマーカーでコンフリクトブロックの開始と終了がマークされます:
<<<<<<< HEADは、コンフリクトブロックの開始を示します。- 変更内容が表示されます。
=======は、変更内容の終了を示します。- ターゲットブランチの最新の変更が表示されます。
>>>>>>>は、コンフリクトの終了を示します。
コンフリクトを解決するには、以下を削除します:
- 保持しないコンフリクトしている行のバージョン。
- 3つのコンフリクトマーカー(開始、終了、2つのバージョン間の
=======行)。
UIで解決できるコンフリクト
コンフリクトしているファイルが次の条件を満たす場合、GitLabのUIでマージコンフリクトを解決できます:
- バイナリではないテキストファイルである。
- コンフリクトマーカーが追加された状態で、サイズが200 KiB未満である。
- UTF-8互換のエンコードを使用している。
- コンフリクトマーカーが含まれていない。
- 両方のブランチで同じパスに存在する。
ファイルがこれらの条件を満たしていない場合は、コンフリクトを手動で解決する必要があります。
コンフリクトの解決方法
GitLabは、UIで解決できるコンフリクトを表示します。次の方法でもコンフリクトを解決できます:
- インタラクティブモード: 保持する行のバージョンを選択するだけで済むコンフリクトに最適です。
- インラインエディタ: 手動編集で変更点を組み合わせる必要がある複雑なコンフリクトに適しています。
- コマンドライン: 複雑なコンフリクトを完全に制御できます。詳細については、コマンドラインからコンフリクトを解決するを参照してください。
インタラクティブモード
インタラクティブモードでは、選択した変更を加えて、ターゲットブランチをソースブランチにマージします。
インタラクティブモードでマージコンフリクトを解決するには、次の手順に従います:
左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
コード > マージリクエストを選択し、マージリクエストを見つけます。
概要を選択して、マージリクエストレポートセクションまでスクロールします。
マージコンフリクトメッセージを見つけ、競合を解決を選択します。GitLabに、マージコンフリクトがあるファイルの一覧が表示されます。コンフリクトしている行が強調表示されます。
コンフリクトごとに、自分の変更を使用または相手の変更を使用を選択して、保持するコンフリクトしている行のバージョンをマークします。この決定は「コンフリクトの解決」と呼ばれます。
すべてのコンフリクトを解決したら、コミットメッセージを入力します。
ソースブランチへのコミットを選択します。
インラインエディタ
一部のマージコンフリクトはより複雑であるため、行を手動で編集して解決する必要があります。
マージコンフリクト解決エディタは、GitLabでこれらのコンフリクトを解決するのに役立ちます:
左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
コード > マージリクエストを選択し、マージリクエストを見つけます。
概要を選択して、マージリクエストレポートセクションまでスクロールします。
マージコンフリクトメッセージを見つけ、競合を解決を選択します。GitLabに、マージコンフリクトがあるファイルの一覧が表示されます。
手動で編集するファイルを見つけ、コンフリクトブロックまでスクロールします。
そのファイルのヘッダーで、インライン編集を選択してエディタを開きます。この例では、コンフリクトブロックは1350行目で始まり、1356行目で終わります:
コンフリクトを解決したら、コミットメッセージを入力します。
ソースブランチへのコミットを選択します。
リベース
マージリクエストがChecking ability to merge automaticallyメッセージで停止している場合は、次の操作を実行できます:
CI/CDパイプラインの問題のトラブルシューティングについては、CI/CDパイプラインのデバッグを参照してください。
GitLab UIでのリベース
GitLab UIからリベースをトリガーするには、/rebaseクイックアクションまたはマージリクエストウィジェットのリベースオプションを使用します。
前提要件:
- マージコンフリクトが存在しない。
- ソースプロジェクトに対するデベロッパー以上のロールが必要です。
- マージリクエストがフォークにある場合、フォークはアップストリームプロジェクトのメンバーからのコミットを許可する必要があります。
GitLab UIからマージリクエストのブランチをリベースするには、次の手順に従います:
- 左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
- コード > マージリクエストを選択し、マージリクエストを見つけます。
- 次のいずれかの操作を行います:
- 概要タブで、マージリクエストウィジェットまでスクロールし、ソースブランチをrebaseを選択します。
- コメントで
/rebaseを入力し、コメントを選択します。
GitLabは、スケジュールを設定し、デフォルトブランチに対してブランチのリベースを実行します。GitLabは、完了したリベースをシステムノートとして表示します。
GitLab UIを介して行われたコミットのコミット署名を設定している場合、UIを介してリベースすると、ウェブコミットはそのコミット署名を失います。

