5

というブランチで、私が機能に取り組んでいるとしましょうfoo_baz

この機能に取り組んでいる間、私は何度もコミットします。

foo_bazリモート トラッキング ブランチであるを定期的にリモート リポジトリにプッシュします。いいえorigin/foo_baz

foo_bazからのすべてのコミットをマージしmaster、にプッシュしたいところまで進みorigin/masterます。質問は次のとおりです。

すべてのコミットが の履歴ではまだ分離されているが、 の履歴ではすべて 1 つの押しつぶされたコミットfoo_bazになるようにマージできますか?masterfoo_bazmaster

編集:

私は少し git の初心者なので、見落としが明らかな場合はご容赦ください。私はウェブ上で掘り下げましたが、私の質問に対する直接的な答えを見つけることができませんでした.

4

3 に答える 3

5

あなたは確かに--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

斜めの線をまっすぐにすることができ、両方の枝がまったく同じに見える履歴が得られます.

于 2013-07-03T20:45:03.330 に答える
0

あなたが望むのは次のようなものだと思います:

git merge --squash foo_baz
git commit
于 2013-07-03T19:33:56.243 に答える
0

--squash旗を探していると思います。

于 2013-07-03T19:34:16.280 に答える