あなたは確かに--squash
(他の回答のように)探しているかもしれませんが、代わりに探しているかもしれません--no-ff
。
両者の違いは次のとおりです。2 つのコミットから開始するとします。
A --- B <-- branch "master", when you start
次に、新しいブランチでさらに 2 つ作成しますfoo_baz
。
A --- B <-- master
\
C --- D <-- foo_baz
これで (もう一度 に戻るとmaster
)、これらの 2 つのオプションが (とりわけ) あります。次のことができgit merge --squash foo_baz && git commit
ます。
A --- B ----------- E <-- master
\
C --- D <-- foo_baz
または次のことができますgit merge --no-ff
。
A --- B ----------- E <-- "master" after merge --no-ff
\ /
C --- D <-- foo_baz
どちらも新しいコミットE
(最初のケースでは別のgit commit
コマンドから) を提供しますが、最初のケースではマルチペアレント化アクションが抑制されるため、最終的に、1 年後にこれを振り返ると、あなたのように見えます。ブランチからすべての変更をコピーしただけです。ツリーgit checkout
(分岐したときに取得するすべてのファイル)は両方D
で同じになりますE
(この特定のケースではとにかく、master
マージ アクションの前に B に変更はありません) が、それらは異なるコミットです。
ストレートとの違いgit merge
は、後者は通常、次のような「早送り」を生成することです。
A --- B
\
C --- D <-- foo_baz, master
斜めの線をまっすぐにすることができ、両方の枝がまったく同じに見える履歴が得られます.