スカッシュしてマージ

squash and merge を使うと、マージリクエストのすべてのコミットをひとつにまとめ、履歴をきれいに保つことができます。

概要

Squashing を使うと、マージリクエストを受け入れる際にブランチのコミット履歴を整理することができます。 マージリクエストのすべての変更をひとつのコミットとして適用し、プロジェクトに設定されているマージメソッドを使用してそのコミットをマージします。

言い換えれば、マージリクエストをつぶすと、長いコミットリストになるということです:

List of commits from a merge request

マージ時に単一のコミットに:

A squashed commit followed by a merge commit

つぶされたコミットのコミットメッセージは次のいずれかになります:

  • マージ内の最初の複数行コミットメッセージから引用。
  • 複数行のコミットメッセージが見つからない場合のマージリクエストのタイトル。
注意:これはコミットが2つ以上ある場合にのみ有効です。 1つのコミットしかない場合は、つぶすものがないのでコミットメッセージは変更されません。

マージリクエストをマージする前にカスタマイズすることができます。

A squash commit message editor

注意:この例のリポジトリではマージコミットを使用しているため、スクワッシュコミットの後にはマージコミットが続きます。

スカッシュは早送りマージ戦略でも機能します。詳細はスカッシュと早送りマージをご覧ください。

ユースケース

機能ブランチで作業しているとき、現在の進捗状況をコミットしたいけれどコミットメッセージはどうでもいいということがあります。 作業途中のコミット」には必ずしも重要な情報が含まれているわけではないので、ターゲットブランチには含めないほうがよいでしょう。

squashとmergeを使えば、マージリクエストの準備ができたら、mergeを押す前にsquashを有効にするだけで、マージリクエストのコミットを1つのコミットにまとめることができます。

こうすることで、ベースブランチの履歴が意味のあるコミットメッセージとともにきれいに残ります:

  • 必要であれば戻す方が簡単です。
  • マージされたブランチにはコミット履歴がすべて残ります。

マージリクエストのスクショを有効化

マージリクエストを作成または編集できる人なら誰でも、マージリクエストフォームでそれをつぶすことを選択できます:

Squash commits checkbox on edit form

これはマージリクエストを受け入れるときにオーバーライドできます:

Squash commits checkbox on accept merge request form

スクワッシュされたコミットのコミットメタデータ

つぶされたコミットには以下のメタデータがあります:

  • メッセージ:スクワッシュコミットのメッセージ、またはカスタマイズしたメッセージ。
  • 作成者: マージリクエストの作成者。
  • コミッター:スクショを開始したユーザー。

スカッシュと早送りマージ

プロジェクトでマージの早送り設定が有効になっている場合、マージリクエストをスクシャッシュするためには、スクシャッシュせずに早送りできなければなりません。 これは、スクシャッシュがマージリクエストを受け入れるときにのみ有効であるためで、マージリクエストをスクシャッシュする前にリベースする必要があるかもしれません。

スカッシュのコミットオプション

  • GitLab 13.2 で導入されました
  • フィーチャーフラグで有効・無効を切り替えることができ、デフォルトでは無効になっています。
  • GitLab.comでは無効になっています。
  • 本番での使用はお勧めできません。
  • GitLabセルフマネージドインスタンスで使うには、GitLab管理者に頼んで有効にしてもらいましょう。

Squash Commits Optionsを使用すると、プロジェクトのSquashとMergeの動作を設定することができます。 設定するには、プロジェクトのSettings > Generalに移動し、Merge requestsを展開します。 以下のオプションがあり、プロジェクトに提出された既存および新規マージリクエストに影響します:

  • 許可しない: ユーザーは Squash and Merge を使用してマージ直前にすべてのコミットをつぶすことはできません。 有効または無効にするチェックボックスのチェックは外され、ユーザーからは非表示になります。
  • 許可: ユーザーはマージリクエストベースで Squash と Merge を有効にするオプションがあります。 チェックボックスはデフォルトではチェックされていませんが、ユーザーは有効にすることができます。
  • 奨励: ユーザーはマージリクエストベースで Squash と Merge を有効にするオプションがあります。 このチェックボックスは使用を奨励するためにデフォルトでチェックされます(有効)が、ユーザーは無効にすることができます。
  • Require: Squash and Merge はすべてのマージリクエストに対して有効であるため、常に実行されます。 有効または無効にするチェックボックスはチェックされ、ユーザーからは非表示になります。

Squash and Mergeチェックボックスは、Squash Commit OptionsがDo not allowまたはRequireに設定されている場合を除き、マージリクエストを作成するとき、および既存のマージリクエストの説明を編集するときに表示されます。

注意:プロジェクトが Squash and Merge を許可しない設定になっている場合でも、ユーザーはコマンドラインからローカルにコミットをスクッシュし、マージする前にリモートブランチに強制プッシュすることができます。

Squashコミットオプションの有効化または無効化

Squash Commit Optionsは開発中であり、本番環境ではまだ使用できません。デフォルトでは無効になっている機能フラグの後ろにデプロイされています。 GitLab RailsコンソールにアクセスできるGitLab管理者は、インスタンスでSquash Commit Optionsを有効にしたり無効にしたりすることができます。

有効にするには:

# Instance-wide
Feature.enable(:squash_options)
# or by project
Feature.enable(:squash_options, Project.find(<project id>))

無効化するには:

# Instance-wide
Feature.disable(:squash_options)
# or by project
Feature.disable(:squash_options, Project.find(<project id>))