gitの簡単なマージ機能はその強みの1つです。マージ中に、gitは、現在のブランチのHEADがマージしようとしているコミットの祖先であることに気付いたときに、早送りマージを使用します。早送りマージでは、新しいコミットはありません。 Gitはポインタを動かすだけです。この動作が望ましくない場合は、no-ffフラグを使用して、マージの新しいコミットを作成できます。
早送りの有無にかかわらず、マージはどのように見えるか
早送りすると、gitの履歴は次のようになります。
C0 —> C1 —> C2—> C3
同じ数のコミットについて、早送りなしのマージ履歴は次のとおりです。
最初のケースでは、分岐があったことを示すものはありません。 2番目のケースでは、履歴にC4コミットが表示され、マージが発生した場所が示されます。
例を歩く
gitリポジトリを作成し、ブランチを作成してから、早送りの有無にかかわらずマージを試みます。
セクション1:セットアップ
まず、次の手順でgitリポジトリを作成できます。
$ mkdir my_project$ cd my_project
$ git init
$ touch a.txt
$ git add -A
$ git commit -m'C0:a.txtの追加 '
次に、featuresというブランチを作成し、いくつかの変更をコミットしましょう。
$ gitブランチ機能$ gitチェックアウト機能
$ touch b.txt
$ git add -A
$ git commit -m'C1:b.txtの追加 '
$ touch c.txt
$ git add -A
$ git commit -m'C2:c.txtの追加 '
$ touch d.txt
$ git add -A
$ git commit -m'C3:d.txtの追加 '
セクション2:早送りとのマージ
マスターブランチに戻り、機能ブランチをマージしてみましょう。
$git checkout主人$gitマージ特徴
出力:
08076fb..9ee88ebを更新しています早送り
b.txt | 0
c.txt | 0
d.txt | 0
3つのファイルが変更され、0の挿入(+)、0の削除(-)
作成モード100644b.txt
作成モード100644c.txt
作成モード100644d.txt
履歴を確認すると、次のように表示されます。
$ git log --oneline9ee88eb C3:d.txtの追加
c72b92c C2:c.txtの追加
2e4039e C1:b.txtの追加
08076fb C0:a.txtを追加
したがって、featuresブランチからのすべてのコミットは現在masterブランチにあります。マスターに変更を加え続けると、機能ブランチがいつマスターにマージされたかを知る方法がありません。
セクション3:早送りなし
新しいフォルダについてセクション1を繰り返します。
次に、早送りせずにマージを試してください。
$git checkout主人$gitマージ --no-ff特徴
gitのデフォルトのテキストエディタで次のように開きます。
ブランチをマージ'特徴'#このマージが必要な理由を説明するコミットメッセージを入力してください。
#特に、更新されたアップストリームをトピックブランチにマージする場合。
#
#「#」で始まる行は無視され、空のメッセージは中止されます
#コミット。
コメントを変更します。この場合、ブランチの「機能」をマージする前にC4:を追加するだけです。出力は次のようになります。
「再帰的」戦略によって行われたマージ。b.txt | 0
c.txt | 0
d.txt | 0
3つのファイルが変更され、0の挿入(+)、0の削除(-)
作成モード100644b.txt
作成モード100644c.txt
作成モード100644d.txt
履歴を確認すると、次のようになります。
$ git log --onelinee071527 C4:ブランチの「機能」をマージする
bb79c25 C3:d.txtの追加
692bd8c C2:c.txtの追加
a0df62a C1:b.txtの追加
7575971 C0:a.txtを追加
まったく同じ変更があったとしても、このバージョンのマージには、機能ブランチのマスターへのマージを意味する追加のC4コミットがあることがわかります。
結論
git merge no-ffフラグは、より読みやすい履歴を作成するのに役立ちます。マージが発生した場所を明確に示すタグを付けることができます。デバッグ中の時間と労力を節約できます。