👏

GitLab mainブランチのコミットログを修正する方法

2025/03/01に公開

前書き

GitLabのプロジェクトmainブランチの余計なコミットログを修正する方法を記載します。

GitLabのデフォルトブランチはmainであり、デフォルトではそのブランチに対して保護が有効になっています。この保護により、どの権限を持つユーザーであってもコミットログを書き換えることができません。そのため、mainブランチに不要なコミットログが含まれてしまうと、そのコミットログが残り続けてしまいます。

本記事では、上記の問題に対処するための手順を紹介します。

前提

  • 対応バージョン

    • 本記事ではGitLab Enterprise Edition 17.10.0-preで動作を確認しました
    • 正確なところはわかりませんが、公式ドキュメントに16.3をもとに作成されているという記載があるため、16.3以降のバージョンであれば同様に対応できそうです
  • ユーザが対象プロジェクトに対してMaintener権限以上を持っていること
    GitLabでmainのコミットログ修正を行うには、ユーザが対象プロジェクトに対してMaintainer権限以上を持っている必要があります。以下の通り、どの権限のユーザであっても強制プッシュを行うことはできませんが、Maintainer権限以上であれば、ブランチ保護の無効化や強制プッシュの許可が可能なためです。

  • 共有ブランチでは行わないこと

mainブランチのコミットログ修正手順

  1. 余計なコミットログがある様子
    まず、GitLab上で、不要コミットが含まれた状態のmainブランチを確認します。以下通り、mainブランチにtest3という余計なコミットがあります。今回はtest3のコミット内容自体は必要なものだったとして、内容だけを採用しつつ、コミットログからは削除することにします。

  2. Webで保護解除もしくは強制プッシュ許可
    GitLabでは、通常、mainブランチは保護されているため、直接コミットを変更することができません。そのため、ブランチの保護設定解除もしくは強制プッシュの許可を行う必要があります。今回は強制プッシュの許可を行います。

    a. Setting -> Repository -> Protected branches -> Allowed to force push

  3. ローカルでコミットログを書き換える
    次に、ローカルリポジトリでresetやrebaseを使用してコミットログを修正します。今回はrebaseを使用します。

    a. rebase

    git checkout main
    git pull origin main
    git rebase -i HEAD~2  # ここでは2を入力したが、変更したいコミットの数を入力
    

    b. rebaseの内容

    pick 3c68808 init2
    squash 3ecf555 test3       # pickをsquashに変更(上のpickにコミットを統合)
    

    c. 統合されたコミットメッセージの作成

    # This is a combination of 2 commits.
    # This is the 1st commit message:
    
    init2
    
    # This is the commit message #2:
    
    test3
    
    # Please enter the commit message for your changes. Lines starting
    # with '#' will be ignored, and an empty message aborts the commit.
    #
    # Date:      Sat Mar 1 08:58:12 2025 +0900
    #
    # interactive rebase in progress; onto 79ab703
    # Last commands done (2 commands done):
    #    pick 3c68808 init2
    #    squash 3ecf555 test3
    # No commands remaining.
    # You are currently rebasing branch 'main' on '79ab703'.
    #
    # Changes to be committed:
    #       new file:   init2
    #       new file:   test3
    #
    

    上記の内容を一行にします。

    init2 squash commit
    

    d. rebase後、test3コミットが消えて、init2のコミットに統合できたことが確認できます

    git log
    commit 45725ba604b966a5a7fb008a815c9ff479e51f4a (HEAD -> main)
    Author: Your Name <you@example.com>
    Date:   Sat Mar 1 08:58:12 2025 +0900
    
        init2 squash commit
    
    commit 79ab7036003cd7733f0620832c212b0d903aeb43 (origin/feature/branchZ, feature/branchZ)
    Author: Your Name <you@example.com>
    Date:   Sat Mar 1 08:44:46 2025 +0900
    
        add init
    
  4. 強制プッシュ
    ローカルのコミットログをリモートリポジトリに反映させます。

    git push origin main --force
    

    強制プッシュにより、リモートリポジトリのmainブランチが修正されたコミット履歴で上書きされます。

  5. 余計なコミットログが消えた様子
    以上で、不要なコミットログを修正することができました。強制プッシュ許可を解除したら作業完了です。

この記事では、GitLabでmainブランチのコミットログを修正する方法を記載しました。これらの手順を行うことで、リポジトリの履歴を整えることができます。

Discussion