web-dev-qa-db-ja.com

コミットのマージと通常のコミット

毎日のルーチンでは、SmartGitを選択のクライアントとして使用します。しかし、私のチームメンバーはgitネイティブの非商用GUIに固執しています。マージコミットの外観にいくつかの違いが見つかりました。

これらは、ブランチをマージするように要求されたときにSmartGitが提供するオプションです: SmartGit commits type

以下のグラフでは、SmartGitグラフ出力の例を見ることができます。

  • 単一のmasterブランチ
  • merge commitオプションを使用して、1つのブランチをマスターにマージしました
  • 1つのブランチがsimple commitオプションとマージされました

ブランチの1つ(with_merge_branch)は、ラインを介してブランチをマスターに結合することでマージ操作を視覚化します。 2番目(normal_commit_branch)はそうではありません。

git tree

質問は、ネイティブgitコマンドで両方の動作を強制する方法ですか?つまりこれら2つのコミットの違いは何ですか?

17
Tomas

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

単純なコミット(1つの親、「スカッシュ」):

--squashオプションで2つのブランチをマージします。使用されるコマンドはgit merge branchname --squashです。

-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
24
Marina Liu

merge commitscommitだけですが、違いは複数の親を持っていることです。ご承知のとおり、コミットには親コミットがある場合とない場合があります。実際、merge commitは複数のparent commitを持つcommitです。

0
jsina