毎日のルーチンでは、SmartGit
を選択のクライアントとして使用します。しかし、私のチームメンバーはgitネイティブの非商用GUIに固執しています。マージコミットの外観にいくつかの違いが見つかりました。
これらは、ブランチをマージするように要求されたときにSmartGit
が提供するオプションです:
以下のグラフでは、SmartGitグラフ出力の例を見ることができます。
master
ブランチmerge commit
オプションを使用して、1つのブランチをマスターにマージしましたsimple commit
オプションとマージされましたブランチの1つ(with_merge_branch
)は、ラインを介してブランチをマスターに結合することでマージ操作を視覚化します。 2番目(normal_commit_branch
)はそうではありません。
質問は、ネイティブgitコマンドで両方の動作を強制する方法ですか?つまりこれら2つのコミットの違いは何ですか?
2種類のマージの違いは、コミット履歴のみです(グラフでログを表示したように)。
グラフで説明しましょう。マージする前に、コミット履歴を次のように仮定します。
A---B---C---D master
\
E---F---G develop
使用されるコマンドはgit merge branchname
です。これは、2つのブランチをマージするデフォルトの方法です。
SmartGit(git merge develop
)でMerge commitによってdevelop
ブランチをmaster
ブランチにマージすると、コミット履歴は次のようになります。
A---B---C---D---M master
\ /
E---F---G develop
--squash
オプションで2つのブランチをマージします。使用されるコマンドはgit merge branchname --squash
です。
実際のマージ(マージ情報を除く)が発生したかのように作業ツリーとインデックスの状態を生成しますが、実際にコミットを行ったり、HEADを移動したり、$ GIT_DIR/MERGE_HEADを記録したりしないで(次のgit commitコマンドでコミットのマージ)。これにより、現在のブランチの上に単一のコミットを作成できます。その効果は、別のブランチのマージと同じです(タコの場合はそれ以上)。
SmartGit(git merge develop --squash
)でsimple commitによってdevelop
ブランチをmaster
ブランチにマージすると、新しい通常のコミットとしてdevelop
ブランチからmaster
ブランチへの変更を取得します(as実際のマージが発生した場合)、コミット履歴は次のようになります:
A---B---C---D---M master
\
E---F---G develop
merge commits
はcommit
だけですが、違いは複数の親を持っていることです。ご承知のとおり、コミットには親コミットがある場合とない場合があります。実際、merge commit
は複数のparent commit
を持つcommit
です。