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

