株式会社ネットワールドのエンジニアがお届けする技術情報ブログです。
各製品のエキスパートたちが旬なトピックをご紹介します。

GitとCI/CDに関する知識ゼロのSEによる、GitLabで不要なブランチを削除する方法

皆様こんにちは。SEの小池と申します。

今回のブログでは、GitLabで不要なブランチを削除する方法 を述べます。

本記事では、通常ブランチの削除方法の他、Protected branch および Default branch の削除方法 についても言及しております。

また、本記事の【余談①②③】では、野良ブランチ抑制に効果があるGitLabの仕組みについて軽く触れておりますので、併せてご参照いただけますと幸いにございます。

本記事の対象の方

  • GitLabで不要なブランチを削除なさりたい方。
  • GitLabで Protected branch を削除なさりたい方。
  • GitLabで Default branch を削除なさりたい方。

今回のブログのゴール

このブログのゴールはこちらです。


今回のゴール
  • GitLabにおいて、不要なブランチの削除方法を把握する。
  • GitLabにおいて、Protected branch と Default branch の削除方法を把握する。

事前ご連絡事項

  • 本記事はSaaS版 (GitLab.com) の Enterprise Edition 16.0.0-pre における仕様をベースに記載しております。それ以外のエディションやバージョンではこの記事に記載の通りではない可能性がございます。
  • 本記事では、GUIから任意のブランチを削除する方法と、クライアント側で git コマンドを実行して任意のブランチを削除する方法を紹介しております。APIを用いて任意のブランチを削除する方法には触れておりません。
  • 本記事の操作説明と画面ショットはGitLabのローカライズを日本語にした状態で説明しております。それ以外の言語をご利用の方は適宜読み替えてください。
  • 本記事に掲載されている情報は正確性・安全性を保証するものではありません。本記事の情報を利用することによって発生した損失や損害については、一切の責任を負いかねます。

削除する前の確認

ブランチを削除する前に、本当に削除してよいか をよくご確認ください。

削除に少しでも不安がある場合は、事前に対象ブランチのフェッチやクローンをしておくことをおすすめいたします。

削除対象のブランチがイシューやマージリクエストと関連付けられていないかも併せてご確認ください。マージリクエストとの関連付けを確認する方法は後述の補足をご覧ください。

GUIから削除する場合

GitLabのGUIから任意のブランチを削除します。

ブランチ削除に必要なロール
ブランチを削除するには、そのユーザーのロールが Developer, Maintainer, Owner のいずれかである必要があります。

参考 : Permissions and roles - Project members permissions | GitLab

Protected branch と Default branch について
Protected branch を削除するには、保護 (Protect) を外す必要があります。保護 (Protect) の外し方は後述するこちらの章をご参照ください。

Default branch を削除するには、別のブランチをDefault branchに指定する必要があります。別のブランチを Default branch に指定する方法は後述するこちらの章をご参照ください。

(Protected branch および Default branch の詳細はこちらの記事をご参照ください。)

オープン状態のマージリクエストと関連付けされたブランチを削除した場合
本手順で、ステータスが オープン のマージリクエストと関連付けされたブランチを削除すると、関連付けられたマージリクエストは自動的にステータスが クローズ に変更されます。

GitLabのGUIにサインインし、削除するブランチがあるプロジェクトページの [リポジトリ] > [ブランチ] を表示します。

削除するブランチの行の右側にある [ ] (ゴミ箱アイコン) をクリックします。

確認メッセージが表示されます。
削除を取りやめる場合は [Cancel, keep branch] をクリックします。
内容に問題が無く、削除を継続したい場合は [Yes, delete branch] をクリックします。

削除した場合は、画面上部に「Branch was deleted」と表示されることを確認します。

GUIから任意のブランチを削除する手順は以上です。

gitコマンドで削除する場合

クライアント側から git コマンドを使って、GitLabのプロジェクトに存在する任意のブランチを削除します。

ブランチ削除に必要なロール
ブランチを削除するには、そのユーザーのロールが Developer, Maintainer, Owner のいずれかである必要があります。

参考 : Permissions and roles - Project members permissions | GitLab

Protected branch と Default branch について
Protected branch を削除するには、保護 (Protect) を外す必要があります。保護 (Protect) の外し方は後述するこちらの章をご参照ください。

Default branch を削除するには、別のブランチをDefault branchに指定する必要があります。別のブランチを Default branch に指定する方法は後述するこちらの章をご参照ください。

(Protected branch および Default branch の詳細はこちらの記事をご参照ください。)

オープン状態のマージリクエストと関連付けされたブランチを削除した場合
本手順で、ステータスが オープン のマージリクエストと関連付けされたブランチを削除すると、関連付けられたマージリクエストは自動的にステータスが クローズ に変更されます。

任意のデバイスから以下の git コマンドを実行します。
なお、gitの初期化 および リモートリポジトリの設定が完了していない場合は、先にそれらを実施してください。

$ git push <リモート名> --delete <削除したいブランチ名>

リモート名が origin、削除したいブランチ名が feature-TestAの場合、以下のようになります。

$ git push origin --delete feature-TestA

ユーザー認証を求められた場合は、指示に従ってユーザー名とパスワードを入力してください。

$ git push origin --delete feature-TestA
Username for 'https://<GitLabインスタンスのURL>': <GitLabのユーザー名 または メールアドレス>
Password for 'https://<GitLabのユーザー名 または メールアドレス>@<GitLabインスタンスのURL>':<パスワード または アクセストークン>

正常にブランチを削除できた場合は以下のような出力になります。

$ git push origin --delete feature-TestA
Username for 'https://<GitLabインスタンスのURL>': <GitLabのユーザー名 または メールアドレス>
Password for 'https://<GitLabのユーザー名 または メールアドレス>@<GitLabインスタンスのURL>':<パスワード または アクセストークン>
To https://<リモートリポジトリのパス>
 - [deleted]         feature-TestA

gitコマンドで任意のブランチを削除する手順は以上です。

Protected branch における保護 (Protect) の外し方

Protected branch はその名の通り保護されたブランチです。通常 Protected branch は削除しませんが、何らかの理由で削除したい場合は保護 (Protect) を外してから削除する必要があります。

Protected branch の削除に関する注意事項
Protected branch は、そのプロジェクトにおいて主要なブランチであることが多いため、削除には注意が必要です。 削除する前に、必ずプロジェクト管理者に削除の可否を確認してください。
また、削除前にはGitLabのバックアップを取得することや、ローカルリポジトリにフェッチやクローンを行っておくことで、復元が可能な手段を確保しておくことをおすすめします。

保護 (Protect) を外すことが可能なロールについて
Protected branch の保護 (Protect) を外すには、そのユーザーのロールが Maintainer, Owner のいずれかである必要があります。
(Protected branch については過去のブログで説明しております。)

参考 : Permissions and roles - Project members permissions | GitLab

GitLabのGUIにサインインし、保護 (Protect) を外したい Protected branch があるプロジェクトページの [設定] > [リポジトリ] を表示します。

[Protected branches] を展開します。

削除したいProtected branchの横にある [Unprotect] をクリックします。

確認メッセージが表示されます。
取りやめる場合は [Cancel] をクリックします。
このまま保護 (Protect) を外す場合は [Unprotect branch] をクリックします。

これで保護 (Protect) が外れた状態になりました。

あとはGUIから削除もしくはgitコマンドで削除することが可能です。

別のブランチを Default branch に指定する方法

Default branch はGitLabにプロジェクトを作成したときに自動生成される規定のブランチで、各リポジトリに必ず1つだけ存在します。GitLabの仕様上、Default branch 自体は削除できません。何らかの理由で現在 Default branch に指定されているブランチを削除したい場合、まず別のブランチを Default branch に指定し、次に元の Default branch だったブランチの保護 (Protect) を外し、最後に元の Default branch だったブランチを削除します。

Default branch の削除に関する注意事項
Default branch は、そのプロジェクトにおいて主要なブランチであることが多いため、削除には注意が必要です。 削除する前に、必ずプロジェクト管理者に削除の可否を確認してください。
また、削除前にはGitLabのバックアップを取得することや、ローカルリポジトリにフェッチやクローンを行っておくことで、復元が可能な手段を確保しておくことをおすすめします。

Default branch となるブランチを変更する場合の注意事項
通常、プロジェクト作成時に自動生成された Default branchは、自動的に Protected branch になっています。しかし、この記事に記載された手順で Default branch を変更した場合、新たに Default branch に指定されたブランチは、Protected branch にはなっていません。通常、Default branch は主要なブランチであることが想定されるため、Protected branch に指定することが望ましいです。したがって、この記事の手順で新たに Default branch にしたブランチは、別途手動で Protected branch に指定することをご検討ください。手順は後述する補足手順をご参照ください。

Default branch 変更に関連するブランチにマージリクエストがある場合、それらの変更が意図したブランチに反映されるようにご注意ください。

CI/CDパイプライン等の自動処理の中で、Default branch か否か もしくは Protected branch か否か によって処理を分岐させている場合は、Default branch の変更による影響の有無を事前にご確認ください。

他、ここに記載した以外でも Default branch の変更に伴う影響の有無を、変更前にご確認ください。

参考 : Default branch | GitLab

Default branch の変更が可能なロールについて
Default branch の変更には、そのユーザーのロールが Maintainer, Owner のいずれかである必要があります。

参考 : Permissions and roles - Project members permissions | GitLab

GitLabのGUIにサインインし、Default branch を変更したいプロジェクトページの [設定] > [リポジトリ] を表示します。

[Branch defaults] を展開します。

プルダウンから、Default branch に指定したいブランチを選択します。

[変更を保存] をクリックします。

Default branch を変更した場合は、画面上部に「Project settings were successfully updated.」と表示されることを確認します。

これで Default branch を別のブランチに変更できました。

通常、プロジェクト作成時に自動生成された Default branch は、Protected branch になっています。Protected branch は保護 (Protect) を外さないと削除できません。削除を継続する場合は、続けて保護 (Protect) を外してください

元 Default branch が保護 (Protect) されていない場合は、続けてGUIから削除もしくはgitコマンドで削除することが可能です。

また、新たに Default branch に指定したブランチは Protected branch になっていません。新たに Default branch に指定したブランチを Protected branch にしたい場合は、後述する補足手順をご参照ください。

【補足】オープン状態のマージリクエストと関連付けられているか確認

GitLabのGUIからサインインし、削除するブランチが存在するプロジェクトのページで [リポジトリ] > [コミット] を開きます。

画面左上のプルダウンから、削除対象のブランチを選択します。

画面右上に [オープンなマージリクエストを表示] というボタンが表示されている場合は、関連付けられたマージリクエスト (ステータス : オープン) が存在します。
[マージリクエストを作成] というボタンが表示されている場合は、関連付けられたマージリクエスト (ステータス : オープン) は存在しません。

関連付けられたマージリクエストがある場合は詳細をご確認ください。

【補足】新しく Default branch に指定したブランチを保護 (Protect) する

新しく Default branch に指定したブランチを保護 (Protect) する手順を記載しています。
この手順は Default branch 以外の任意のブランチでも実施可能です。

Protected branch に指定したブランチには、強制プッシュができなくなるなどの様々な保護 (規制) がかかります。 Protected branch にすることによる影響については、下記のGitLab Docsでご確認ください。

参考 : Protected branches | GitLab

任意のブランチを Protected branch に指定可能なロール
任意のブランチを Protected branch に指定するには、そのユーザーのロールが Maintainer, Owner のいずれかである必要があります。

参考 : Permissions and roles - Project members permissions | GitLab

GitLabのGUIからサインインし、保護 (Protect) したいブランチが存在するプロジェクトのページで [設定] > [リポジトリ] を開きます。

[Protected branches] を展開します。

以下の設定項目を任意に指定します。

  • Branch
  • 保護 (Protect) したいブランチを選択。ワイルドカード使用可能。
  • マージを許可
  • マージを許可するロール。指定したロール以上のロールを持つユーザーでアクションが可能になる。
  • Allowed to push and merge
  • プッシュとマージを許可するロール。指定したロール以上のロールを持つユーザーでアクションが可能になる。
  • Allowed to force push
  • プッシュが可能なユーザーにおいて、強制プッシュを可 または 不可にする。
  • コード所有者の承認が必要
  • Premium 以上限定機能。有効にすると、マージリクエストにおいてCode Ownerが設定されたファイルに変更がある場合、Code Ownerに指定されたユーザーによる承認が必要になる。また、Code Ownerが設定されたファイルに変更がある場合、それらを強制プッシュできなくなる。
    (Code Owners については過去のこちらの記事で取り上げておりますので、よろしければご参照ください。)

[保護] をクリックします。

Protected branches の一覧に、対象のブランチが表示されていることを確認します。

ブランチを保護 (Protect) する手順は以上です。

【余談①】なぜ不要なブランチができてしまうのか?

そもそも、なぜ不要なブランチができてしまうのでしょうか?

開発中における操作ミス・失念・開発方針の変更等、さまざまな理由が考えられます。

  • マージする時に削除し忘れたブランチ
  • 開発途中で不要になったブランチ
  • 単純に間違えて作ったブランチ
  • 塩漬け状態になって忘れ去られたブランチ
  • はるか昔にバックアップ目的で作成したブランチ
  • etc...

【余談②】不要なブランチの何が問題なのか?

不要なブランチができてしまうことは、仕方ないと存じます。

問題はそれを 放置 することです。

不要なブランチを放置することは、余計なリソース消費、開発プロセスにおける混乱やミスの誘発、場合によってはセキュリティリスクになる可能性があります。

【余談③】GitLabにおける不要なブランチを最小限にする仕組み

GitLabでは、イシューとマージリクエスト、マージリクエストとブランチをそれぞれ関連付けることができます。

具体的には、イシューのGUIからマージリクエストとブランチを同時作成します。
この方法でマージリクエストとブランチを作成すると、関係者やブランチが作られた経緯を容易に調査できます。

この仕組みにより、前に挙げたような 不要なブランチ (俗にいう野良ブランチ) が生成されにくくなります

この機能の詳細については別の記事で取り上げますので、ここでは仕組みの存在を紹介するにとどめます。
ご興味がおありの方は、下の参考URLをご参照ください。

参考:Creating merge requests - From an issue | GitLab

最後に

この度はGitもCI/CDもよくわかっていないど素人SEによるGitLab検証ブログをお読みいただき、誠にありがとうございます。
このブログの目標は以下のとおりでしたが、皆さまはいかがでしたでしょうか。


今回のゴール
  • GitLabにおいて、不要なブランチの削除方法を把握する。
  • GitLabにおいて、Protected branch と Default branch の削除方法を把握する。

不要なブランチは開発過程でどうしてもできてしまうものです。

定期的に不要なブランチのチェックをすれば特に問題ありませんが、長期間放置すると作成した本人ですら存在を忘れ、誰も詳細を知らない謎のブランチへと変貌します・・・。

しかし、GitLabであれば余談③に記載の通り、イシュー・マージリクエスト・ブランチの作成を機械的に関連付けることが可能で、これにより詳細不明のブランチの発生を抑えることができます。

自社の開発環境で野良ブランチが大量発生している等の問題がおありでしたら、余談③の参考URLをご参照いただければと存じます。

この記事がGitLabを触り始めた方の一助となれば幸いにございます。


GitLabに関するお問い合わせは、以下のフォームからお願い致します。
GitLab製品 お問い合わせ

今までのGitLabの検証ブログはこちらです。
GitLab カテゴリーの記事一覧 - ネットワールド らぼ

GitLab操作デモ動画 (基本編) を作ってみました。(音声の録音は自宅でiPhoneのボイスメモ使うという超低クオリティですが…。)
つたない内容ではありますが、ご興味がおありでしたら是非ご視聴いただければと存じます。

www.youtube.com