Azure DevOps Server のGitリポジトリのマージの種類ごとの動作

DevOps Server のGitリポジトリのマージの種類ごとの動作について紹介します。

概要

Gitリポジトリでプルリクエストを完了しブランチをマスターに合流させる際にマージをしますが、Gitリポジトリのマージの種類を選択できます。 マージの種類による動作の違いを紹介します。

マージ (早送りなし)

「すべてのコミットを保持する非線形履歴」との説明があります。

ブランチ(青線)が下図の場合
Azure DevOps Server のGitリポジトリのマージの種類ごとの動作:画像1

マージをするとブランチがマージされて新しいマージコミット(下図の青丸)が作成されます。
マージコミットには変更情報は含まれず、変更内容は元のブランチのコミットが使われます。
Azure DevOps Server のGitリポジトリのマージの種類ごとの動作:画像2

ブランチのコミットがそのまま使われるため、変更の記録がすべて残り追跡や履歴を細かく調べられます。また、ブランチを削除した場合でもブランチ先にブランチでのコミット情報が残るため、ブランチの削除後にもコミット内容を参照することができます。
一方で、「非線形履歴」となるため、ツリーのグラフは複雑になります。

スカッシュ コミット

「ターゲットへのコミットが一つだけの線形履歴」との説明があります。

ブランチ(青線)が下図の場合
Azure DevOps Server のGitリポジトリのマージの種類ごとの動作:画像3

スカッシュコミットをすると、ブランチのマージがすべて一つのコミットに集約されます。
Azure DevOps Server のGitリポジトリのマージの種類ごとの動作:画像4

マージ先にコミットが作成され、集約されたコミットが実行されます。
Azure DevOps Server のGitリポジトリのマージの種類ごとの動作:画像5

変更内容がマージ先に作成されますので、線形の履歴となるのでツリーのグラフはシンプルになり閲覧性は良くなります。 ブランチでのコミット履歴もブランチを削除しなければ参照可能ですが、ブランチを削除した場合はコミット履歴を参照できなくなります。 また、マージの記録は残りますが、マージ先のブランチではブランチでのコミットを分解できないため、ブランチでのコミットのある時点に戻ることができません。

リベースと早送り

「ターゲットへのソースコミットをリベースし、早送りする」との説明があります。

ブランチ(青線)が下図の場合
Azure DevOps Server のGitリポジトリのマージの種類ごとの動作:画像6

最初にリベースが実行され、ブランチの分岐がマージ先の先頭からの分岐に変わります。
Azure DevOps Server のGitリポジトリのマージの種類ごとの動作:画像7

マージコミットは作成されず、ブランチにも変更は発生しません。
Azure DevOps Server のGitリポジトリのマージの種類ごとの動作:画像8

このマージ方法の場合コミットがマージ先にさし変わるため、履歴が一本になりグラフがシンプルになり閲覧性が良くなります。 一方でリポジトリの状態によってはリベースができない場合があるため、操作が実行できない場合があります。

半線形マージ

「ターゲットへのソースコミットをリベースし、2つの親のマージを作成する」との説明があります。

リベースとマージを組み合わせた動作になります。
ブランチ(青線)が下図の場合
Azure DevOps Server のGitリポジトリのマージの種類ごとの動作:画像9

最初にリベースが実行され、ブランチの分岐がマージ先の先頭からの分岐に変わります。
Azure DevOps Server のGitリポジトリのマージの種類ごとの動作:画像10

次に、リベースされたプルリクエストがマージ先にマージされます。
Azure DevOps Server のGitリポジトリのマージの種類ごとの動作:画像11

子のマージの方法の場合、グラフは一本にはなりませんが変更履歴は線形になり、履歴の閲覧性は良くなります。また、ブランチが発生したこともマージ先で確認でき、それぞれのコミットを参照することもできます。
AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2020-08-14
Copyright © 1995–2025 iPentec all rights reserverd.