Gitマージ–no-ffオプション

Git Merge No Ff Option



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 --oneline
9ee88eb 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 --oneline
e071527 C4:ブランチの「機能」をマージする
bb79c25 C3:d.txtの追加
692bd8c C2:c.txtの追加
a0df62a C1:b.txtの追加
7575971 C0:a.txtを追加

まったく同じ変更があったとしても、このバージョンのマージには、機能ブランチのマスターへのマージを意味する追加のC4コミットがあることがわかります。

結論

git merge no-ffフラグは、より読みやすい履歴を作成するのに役立ちます。マージが発生した場所を明確に示すタグを付けることができます。デバッグ中の時間と労力を節約できます。

さらなる研究:

参照: