スカッシュしてマージ
- GitLab Starter8.17 で導入されました。
- GitLab Core 11.0に移植しました。
squash and merge を使うと、マージリクエストのすべてのコミットをひとつにまとめ、履歴をきれいに保つことができます。
概要
Squashing を使うと、マージリクエストを受け入れる際にブランチのコミット履歴を整理することができます。 マージリクエストのすべての変更をひとつのコミットとして適用し、プロジェクトに設定されているマージメソッドを使用してそのコミットをマージします。
言い換えれば、マージリクエストをつぶすと、長いコミットリストになるということです:
マージ時に単一のコミットに:
つぶされたコミットのコミットメッセージは次のいずれかになります:
- マージ内の最初の複数行コミットメッセージから引用。
- 複数行のコミットメッセージが見つからない場合のマージリクエストのタイトル。
マージリクエストをマージする前にカスタマイズすることができます。
スカッシュは早送りマージ戦略でも機能します。詳細はスカッシュと早送りマージをご覧ください。
ユースケース
機能ブランチで作業しているとき、現在の進捗状況をコミットしたいけれどコミットメッセージはどうでもいいということがあります。 作業途中のコミット」には必ずしも重要な情報が含まれているわけではないので、ターゲットブランチには含めないほうがよいでしょう。
squashとmergeを使えば、マージリクエストの準備ができたら、mergeを押す前にsquashを有効にするだけで、マージリクエストのコミットを1つのコミットにまとめることができます。
こうすることで、ベースブランチの履歴が意味のあるコミットメッセージとともにきれいに残ります:
- 必要であれば戻す方が簡単です。
- マージされたブランチにはコミット履歴がすべて残ります。
マージリクエストのスクショを有効化
マージリクエストを作成または編集できる人なら誰でも、マージリクエストフォームでそれをつぶすことを選択できます:
これはマージリクエストを受け入れるときにオーバーライドできます:
スクワッシュされたコミットのコミットメタデータ
つぶされたコミットには以下のメタデータがあります:
- メッセージ:スクワッシュコミットのメッセージ、またはカスタマイズしたメッセージ。
- 作成者: マージリクエストの作成者。
- コミッター:スクショを開始したユーザー。
スカッシュと早送りマージ
プロジェクトでマージの早送り設定が有効になっている場合、マージリクエストをスクシャッシュするためには、スクシャッシュせずに早送りできなければなりません。 これは、スクシャッシュがマージリクエストを受け入れるときにのみ有効であるためで、マージリクエストをスクシャッシュする前にリベースする必要があるかもしれません。
スカッシュのコミットオプション
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コミットオプションの有効化または無効化
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>))