ブランチ
ブランチはプロジェクトの作業ツリーのバージョンです。新しいプロジェクトを作成すると、GitLabはリポジトリ用のデフォルトブランチ(削除不可)を作成します。デフォルトブランチの設定は、プロジェクト、サブグループ、グループ、インスタンスレベルで設定できます。
プロジェクトが大きくなるにつれて、チームはより多くのブランチを作成し、できればブランチの命名パターンに従います。各ブランチは一連の変更を表し、開発作業を並行して行うことができます。あるブランチでの開発作業が、別のブランチに影響することはありません。
ブランチは、プロジェクトにおける開発の基盤です:
- まずブランチを作成し、そこにコミットを追加します。
- 作業がレビューできる状態になったら、マージリクエストを作成してブランチの変更をマージします。この作業を効率化するために、ブランチの命名パターンに従うようにしましょう。
- レビューアプリでブランチの変更をプレビューします。
- ブランチの内容がマージされたら、マージしたブランチを削除します。
ブランチの作成
前提条件:
- 少なくともプロジェクトの開発者ロールを持っている必要があります。
GitLab UI から新しいブランチを作成するには:
- 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
- コード > ブランチを選択します。
- 右上の [新規ブランチ] を選択します。
- ブランチ名を入力します。
- ブランチの作成元で、既存のブランチ、既存のタグ、コミット SHA のいずれかを選択します。
- ブランチを作成 を選択します。
空白のプロジェクトで
空白のプロジェクトにはブランチはありませんが、ブランチを追加することはできます。
前提条件:
- 少なくともプロジェクトの開発者ロールを持っている必要があります。
- メンテナーやオーナーのロールがない場合、デフォルトブランチにコミットをプッシュするには、デフォルトブランチの保護を
Partially protected
あるいはNot protected
に設定しなければなりません。
空のプロジェクトにデフォルトブランチを追加するには
- 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
- The repository for this project is emptyまでスクロールし、追加したいファイルの種類を選択します。
- Web IDE で、このファイルに必要な変更を加え、コミットの作成を選択します。
- コミットメッセージを入力し、コミットを選択します。
GitLab はデフォルトブランチを作成し、あなたのファイルをそこに追加します。
イシューから
前提条件:
- 少なくともプロジェクトの開発者ロールを持っている必要があります。
イシューを表示しているときに、そのページから直接関連ブランチを作成することができます。この方法で作成したブランチは、変数を含むイシューからのブランチ名のデフォルトパターンを使用します。
前提条件:
- 少なくともプロジェクトの開発者ロールを持っている必要があります。
イシューからブランチを作成するには
- 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
- プラン > イシューを選択し、課題を見つけます。
- issueの説明の下にある[マージリクエストを作成]ドロップダウンリストを探し、{chevron-down}を選択してドロップダウンリストを表示します。
- ブランチの作成]を選択します。このプロジェクトのデフォルトパターンに基づいて、デフォルトのブランチ名が提供されます。必要に応じて、別のブランチ名を入力してください。
- Create branchを選択すると、プロジェクトのデフォルトブランチに基づいてブランチが作成されます。
ブランチの管理と保護
GitLabは個々のブランチを保護するための複数の方法を提供します。これらの方法は、ブランチの作成から削除まで、ブランチが監視と品質チェックを受けることを保証します:
- プロジェクトのデフォルトブランチは、特別な保護を受けます。
- 保護されたブランチを設定することで、そのブランチにコミットできる人を制限したり、他のブランチをマージしたり、ブランチ自体を別のブランチにマージしたりすることができます。
- 承認ルールを設定して、ブランチをマージする前に、セキュリティ関連の承認を含むレビュアー要件を設定します。
- サードパーティのステータスチェックとインテグレーションし、ブランチのコンテンツが品質基準を満たしていることを確認します。
ブランチを管理できます:
すべてのブランチを表示
GitLabユーザーインターフェイスでブランチを表示・管理するには:
- 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
- コード > ブランチを選択します。
このページでは、次のことができます:
- すべてのブランチを表示、またはフィルタリングしてアクティビティや古いブランチのみを表示。
- 新しいブランチを作成します。
- ブランチを比較します。
- マージしたブランチを削除します。
設定された保護を持つブランチの表示
- GitLab 15.1 で
branch_rules
というフラグで導入されました。デフォルトでは無効になっています。- GitLab15.10でGitLab.comで有効に。
- GitLab 15.11でセルフマネージドで有効にしました。
フラグ: セルフマネジメントのGitLabでは、デフォルトでこの機能が利用可能です。この機能を隠すには、管理者がbranch_rules
という機能フラグを無効にします。GitLab.comでは、この機能は利用可能です。
リポジトリ内のブランチは、複数の方法で保護できます。できます:
- ブランチにプッシュできる人を制限します。
- ブランチをマージできる人を制限します。
- すべての変更に対して承認者を必要とします。
- 外部テストの合格を要求。
ブランチルールの概要ページには、保護が設定されているすべてのブランチと、その保護方法が表示されます:
前提条件:
- 少なくともプロジェクトのメンテナーのロールを持っている必要があります。
ブランチルールの概要リストを表示します:
- 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
- 設定] > [リポジトリ]を選択します。
- ブランチルールを展開し、保護機能を持つすべてのブランチを表示します。
ブランチ名
Git はブランチ名のルールを強制することで、他のツールとのブランチ名の互換性を保ちます。GitLabはブランチ名に特別な要件を追加し、適切に構造化されたブランチ名にメリットをもたらします。
GitLabはすべてのブランチに対してこれらの追加ルールを強制します:
- ブランチ名にはスペースを使用できません。
- Git のコミットハッシュに似ているので、16 進数 40 文字のブランチ名は使用できません。
Docker のような一般的なソフトウェアパッケージでは、ブランチの名前にさらなる制限をかけることができます。
他のソフトウェアパッケージとの互換性を高めるには、以下のようにします:
- 数字
- ハイフン (
-
) - アンダースコア (
_
) - ASCII標準表にある小文字
ブランチ名にはスラッシュ (/
) や絵文字を使用できますが、他のソフトウェアパッケージとの互換性は保証されません。
特定の書式を持つブランチ名には、さらに利点があります:
- ブランチ名の前にイシュー番号を付けることで、マージリクエストのワークフローを合理化できます。
- ブランチ名に基づいてブランチ保護を自動化します。
- GitLabにブランチをプッシュする前に、プッシュルールでブランチ名をテスト。
- マージリクエストに対して実行するCI/CD ジョブを定義します。
イシューからのブランチ名のデフォルトパターンの設定
デフォルトでは、GitLab はイシューからブランチを作成するときに%{id}-%{title}
というパターンを使いますが、このパターンは変更することができます。
前提条件:
- 少なくともプロジェクトのメンテナーのロールを持っている必要があります。
イシューから作成されるブランチのデフォルトパターンを変更するには、次のようにします:
- 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
- 設定] > [リポジトリ]を選択します。
- ブランチのデフォルトを展開します。
-
ブランチ名テンプレートまでスクロールし、値を入力します。このフィールドは以下の変数に対応しています:
-
%{id}
:イシューの数値ID。 -
%{title}
:イシューのタイトル。Gitブランチ名で使用可能な文字のみを使用するように変更されています。
-
- 変更を保存を選択します。
ブランチ名の前にイシュー番号を付けます。
マージリクエストの作成を効率化するには、ブランチ名の先頭にイシュー番号をつけましょう。GitLab はこのイシュー番号を使ってマージリクエストにデータをインポートします:
- イシューはマージリクエストに関連するものとしてマークされます。イシューとマージリクエストはお互いにリンクを表示します。
- ブランチはイシューに接続されています。
- プロジェクトにデフォルトのクローズパターンが設定されている場合、マージリクエストをマージすると、関連するイシューもクローズされます。
- イシューのマイルストーンとラベルはマージリクエストにコピーされます。
ブランチの比較
リポジトリ内のブランチを比較します:
- 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
- コード > リビジョンを比較]を選択します。
-
ソースブランチを選択して、目的のブランチを検索します。完全に一致するものが最初に表示されます。オペレーターで検索を絞り込むことができます:
-
^
はブランチ名の先頭にマッチします:^feat
はfeat/user-authentication
にマッチします。 -
$
はブランチ名の最後にマッチします:widget$
はfeat/search-box-widget
にマッチします。 -
*
はワイルドカードを使ってマッチします:branch*cache*
はfix/branch-search-cache-expiration
にマッチします。 -
^chore/*migration$
はchore/user-data-migration
にマッチします。
-
- 対象のリポジトリとブランチを選択します。完全一致が最初に表示されます。
-
変更を表示 の下で、ブランチを比較する方法を選択します:
-
ソースからの変更のみ(デフォルト) は、両ブランチ共通の最新のコミット以降のソースブランチとの差分を表示します。ソースブランチが作成された後にターゲットブランチに加えられた無関係な変更は含まれません。この方式では、
git diff <from>...<to>
Git コマンドを使用します。ブランチを比較する際に実際のコミットではなくマージベースを使用するので、cherry-pick されたコミットからの変更が新しい変更として表示されます。 -
ソースが作成されてからのターゲットへの変更を含めると、2 つのブランチ間のすべての差分が表示されます。この方法では、
git diff <from> <to>
Git コマンドを使用します。
-
ソースからの変更のみ(デフォルト) は、両ブランチ共通の最新のコミット以降のソースブランチとの差分を表示します。ソースブランチが作成された後にターゲットブランチに加えられた無関係な変更は含まれません。この方式では、
- Compareを選択すると、コミットの一覧と変更されたファイルが表示されます。
- オプションです。ソースと ターゲットを逆にするには、リビジョンを入れ替える({substitute})を選択します。
マージブランチを削除
マージされたブランチは、以下の条件をすべて満たせば、一括で削除することができます:
- 保護されたブランチでないこと。
- これらはプロジェクトのデフォルトブランチにマージされています。
前提条件:
- 少なくともプロジェクトの開発者ロールを持っている必要があります。
そのためには
- 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
- コード > ブランチを選択します。
- ページの右上で、[More ]を選択します。
- マージされたブランチを削除]を選択します。
- ダイアログで、
delete
と入力して確認し、Delete merged branches を選択します。
関連するトピック
トラブルシューティング
同じコミットを含む複数のブランチ
より深い技術的なレベルでは、Git のブランチは独立したものではなく、コミット SHA のセットに付けられたラベルです。GitLab はブランチがマージされたかどうかを判断する際に、ターゲットブランチにコミット SHA があるかどうかを調べます。この動作は、二つのマージリクエストに同じコミットが含まれている場合に予期せぬ結果を引き起こすことがあります。この例では、ブランチB
とC
はどちらもブランチA
の同じコミット (3
) から始まっています:
ブランチB
をマージすると、ブランチのA
すべてのコミットが A
ターゲットブランチmain
に現れるので、A
ブランチもマージされたように見えます (何もアクションを起こさなくても) A
。ブランチC
はマージされないままです。これは、コミット5
がブランチA
やB
の一部ではなかったからです。
マージリクエストはA
、そのブランチに新しいコミットをプッシュしようとしてもマージされたまま A
です。A
マージリクエストの A
変更がマージされずに残っているA
場合 A
(マージリクエストA
に含まれていなかったため)、その変更のために新しいマージリクエストを開いてください。
エラー: あいまいなHEAD
ブランチが存在します。
Git 2.16.0 より前のバージョンでは、HEAD
というブランチを作成することができました。このブランチ名は、Git がアクティブな (チェックアウトされた) ブランチを表すために使うHEAD
内部参照 (この名前も HEAD
同様です)HEAD
と衝突 HEAD
します。この名前の衝突によって、リポジトリのデフォルトブランチを更新できなくなることがあります:
Error: Could not set the default branch. Do you have a branch named 'HEAD' in your repository?
この問題を解決するには
- 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
- コード > ブランチを選択します。
-
HEAD
というブランチを検索します。 - ブランチにコミットされていない変更がないことを確認してください。
- ブランチを削除する を選択し、はい、ブランチを削除します。
Git バージョン2.16.0 以降では、この名前でブランチを作成することはできません。