マージリクエストのレビューと管理

マージリクエストは、GitLabプロジェクト内のファイルに変更を加えられる主要な方法です。マージリクエストを作成して送信することで変更のレクエストがレビューされ、承認(または却下)されます。

プロジェクトのマージリクエストの表示

プロジェクト > マージリクエストを選択して、プロジェクト内のすべてのマージリクエストを表示します。

プロジェクトのマージリクエストにアクセスすると、GitLab はそれらを一覧で表示します。 タブを使うことで、オープンやクローズで素早くフィルタリングすることができます。結果を検索してフィルタリングすることもできます。

Project merge requests list view

グループ内のすべてのプロジェクトのマージリクエストを表示します。

グループのすべての子孫サブグループのすべてのプロジェクトを含む、グループ内のすべてのプロジェ クトのマージリクエストを表示します。 これらのマージリクエストを表示するには、[グループ] > [マージリクエスト]に移動します。 このビューには、開いているマージリクエストと閉じているマージリクエストのタブもあります。

ここから検索や絞り込みができます。

Group Issues list view

準線形履歴マージリクエスト

マージコミットはマージごとに作成されますが、ブランチのマージは早送りマージが可能な場合にのみ行われます。 これにより、マージリクエストのビルドが成功した場合、マージ後のターゲットブランチのビルドも成功するようになります。

プロジェクトの設定に移動し、マージリクエスト: マージ方法でセミリニア履歴でマージコミットオプションを選択し、変更を保存します。

ファイルバージョン間の変更点の表示

メインマージリクエストの詳細の下、ディスカッションタブの隣にある変更点タブは、ブランチやコミット間のファイルの変更点を表示します。 ファイルの変更点を表示するこのビューは、差分ビューとしても知られています。 デフォルトでは、差分ビューはマージリクエストブランチのファイルとターゲットブランチのファイルを比較します。

差分表示には以下のものがあります:

  • ファイルの名前とパス。
  • 追加・削除された行数。
  • 以下のオプションのボタン:
    • インラインレビューに便利です。
    • マージリクエストのブランチにあるファイルを編集します。
    • ファイル全体を表示します。ファイルの残りの部分との関連で変更を確認したい場合に使用します。
    • 現在のコミットでファイルを表示します。
    • レビューアプリで変更をプレビューします。
  • 具体的な変更点を強調した変更点。

Example screenshot of a source code diff

マージリクエスト差分ファイルナビゲーション

変更]タブで変更点をレビュアーする場合、ファイルツリーやファイルリストを使用して diff を移動することができます。 変更点の多い大きな diff をスクロールする場合、ファイルツリーやファイルリストを使用して、変更されたファイルにすばやくジャンプすることができます。

Merge request diff file navigation

マージリクエストコミットナビゲーション

GitLab 13.0から導入されました

マージリクエスト内のコミット間をシームレスに移動するには、コミットタブからコミットの一つをクリックし、単一コミットビューを開きます。 そこから、ページの右上にあるPrevNextボタンをクリックするか、XC キーボードショートカットを使用して、コミット間を移動することができます。

マージリクエストの差分をインクリメンタルに展開

デフォルトでは、diffはファイルの変更箇所のみを表示します。 変更箇所の上下にある未変更の行を表示するには、[上へ展開]または[下へ展開]アイコンをクリックします。 また、[未変更の行を表示]をクリックすると、ファイル全体を展開することができます。

Incrementally expand merge request diffs

GitLab 13.1 から導入された機能で、マージリクエストの変更点タブを表示する際に、あるファイルがリネームされただけの場合、ファイルの内容を表示するをクリックすることで、そのファイルを展開して内容全体を見ることができます。

マージリクエストの diff 表示で空白の変更を無視

空白の変更を隠すボタンをクリックすると、空白の変更がない diff が表示されます (空白の変更がある場合)。 これは特定のコミットページでも動作します。

MR diff

ヒント: マージリクエストの diffs ページで?w=1 を追加すると、空白の変更を無視することができます。

インラインコードレビューの実施

GitLab 11.5で導入されました。

GitLab はマージリクエストで変更されたファイルの任意の部分にコメントを残す方法を提供します。 これを行うには、マージリクエストの diff UI の溝にあるボタンをクリックして diff 行を展開し、変更された行と同じようにコメントを残します。

Comment on any diff file line

マージリクエストウィジェットのパイプラインステータス

プロジェクトで GitLab CI/CDを設定していれば、次のように表示されます:

  • マージ前のパイプラインとマージ後のパイプラインの両方と、環境情報がある場合はその情報。
  • どのデプロイが進行中か

環境があり、そこにアプリケーションが正常にデプロイされると、デプロイされた環境とレビューアプリへのリンクも表示されます。

マージ後のパイプライン状況

マージリクエストがマージされると、マージリクエストがマージされたブランチのマージ後のパイプラインステータスを確認できます。 たとえば、マージリクエストがマスターブランチにマージされ、ステージング環境へのデプロイがトリガーされた場合などです。

進行中のデプロイが表示され、環境のデプロイ/デプロイ済み状態も表示されます。ブランチのデプロイが初めての場合、完了するまでリンクは404 エラーを返します。 デプロイ中、停止ボタンは無効になります。 パイプラインがデプロイに失敗した場合、デプロイ情報は非表示になります。

Merge request pipeline

詳しくはパイプラインをご覧ください。

パイプラインが成功したらマージ(MWPS)

CIパイプラインが成功したときに自動的にマージするように、マージ準備ができたように見えるマージリクエストを設定します。

レビューアプリによるライブプレビュー

プロジェクトにレビューアプリを設定した場合、マージリクエストを通して機能ブランチに提出された変更をブランチ単位でプレビューすることができます。 ブランチをチェックアウトし、インストールし、ローカルでプレビューする必要はありません。すべての変更は、レビューアプリのリンクを使えば誰でもプレビューできるようになります。

GitLab のRoute Mapsセットでは、マージリクエストウィジェットが変更されたページに直接移動するので、修正案をより簡単に素早くプレビューできます。

レビューアプリの続きを読む

関連機能

また、マージリクエストに関連する機能も数多くあります:

機能 説明
マージリクエストの一括編集 複数のマージリクエストの属性を同時に更新します。
チェリーピックによる変更 マージリクエストやコミットのチェリーピックボタンをクリックするだけで、UI上で任意のコミットをチェリーピックできます。
マージリクエストの早送り 直線的な Git の履歴と、マージコミットを作成せずにマージリクエストを受け付ける方法について
変更を導入したマージリクエストの検索 コミットの詳細ページを表示すると、GitLab はそのコミットを含むマージリクエストにリンクします。
マージリクエストバージョン マージリクエストの差分の異なるバージョンを選択し、比較します。
コンフリクトの解決 GitLabはGitLab UIで特定のマージリクエストの競合を解決するオプションを提供することができます。
変更の取り消し マージリクエスト内の任意のコミットの変更を差し戻します。

トラブルシューティング

マージリクエストで期待通りにいかないことがあるので、トラブルシューティングの手順を紹介します。

マージリクエストがパイプラインステータスを取得できません。

これは、Sidekiqが十分に速く変更をピックアップしない場合に発生する可能性があります。

Sidekiq

SidekiqはCIの状態変更を十分に速く処理できませんでした。 ステータスは自動的に更新されますので、数秒お待ちください。

バグ

以下が発生した場合、マージリクエストパイプラインのステータスを取得できません:

  1. マージリクエストが作成されます。
  2. マージリクエストは終了しました。
  3. プロジェクトの変更
  4. マージリクエストが再開されました。

パイプラインステータスを正しく取得できるようにするには、マージリクエストをいったん閉じて再度開きます。

ヒント

コマンドラインでのマージリクエストをより効率的に行うためのヒントをいくつか紹介します。

注:このセクションは将来、独立した文書に移行する可能性があります。

マージリクエストをローカルでチェックアウト

マージリクエストには、リポジトリからのすべての履歴と、マージリクエストに関連するブランチに追加されたコミットが含まれます。 ここでは、マージリクエストをローカルでチェックアウトするためのいくつかのトリックを紹介します。

ソースプロジェクトがターゲットプロジェクトのフォーク (非公開フォークであっても) であっても、マージリクエストをローカルにチェックアウトできることに注意してください。

Git エイリアスを追加してローカルにチェックアウトします。

~/.gitconfigに以下のエイリアスを追加してください:

[alias]
    mr = !sh -c 'git fetch $1 merge-requests/$2/head:mr-$1-$2 && git checkout mr-$1-$2' -

これで、任意のリポジトリ、任意のリモートから特定のマージリクエストをチェックアウトできるようになりました。たとえば、GitLab に表示されている ID 5 のマージリクエストをorigin リモートからチェックアウトするには次のようにします:

git mr origin 5

これでマージリクエストがローカルのmr-origin-5 ブランチに取り込まれ、チェックアウトされます。

リポジトリの.git/config を変更して、内部でチェックアウトします。

.git/config ファイルの GitLab リモート用のセクションを探します:

[remote "origin"]
  url = https://gitlab.com/gitlab-org/gitlab-foss.git
  fetch = +refs/heads/*:refs/remotes/origin/*

で開くことができます:

git config -e

上記のセクションに次の行を追加します:

fetch = +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*

最終的にはこのようになります:

[remote "origin"]
  url = https://gitlab.com/gitlab-org/gitlab-foss.git
  fetch = +refs/heads/*:refs/remotes/origin/*
  fetch = +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*

これですべてのマージリクエストを取得できます:

git fetch origin

...
From https://gitlab.com/gitlab-org/gitlab-foss.git
 * [new ref]         refs/merge-requests/1/head -> origin/merge-requests/1
 * [new ref]         refs/merge-requests/2/head -> origin/merge-requests/2
...

そして、特定のマージリクエストをチェックするために:

git checkout origin/merge-requests/1

上記はすべて、git-mr スクリプトで実行できます。