web-dev-qa-db-ja.com

gitでは、merge --squashとrebaseの違いは何ですか?

私はgitが初めてで、スカッシュとリベースの違いを理解しようとしています。私が理解しているように、リベースを行うときはスカッシュを実行します。

308
GiH

git merge --squashgit rebase --interactiveの両方は、「つぶれた」コミットを生成できます。
しかし、それらは異なる目的に役立ちます。

マージ関係をマークせずに、宛先ブランチでスカッシュコミットを生成します。
(注:すぐにはコミットを生成しません:追加のgit commit -m "squash branch"が必要です)
ソースブランチを完全に捨てて、( SO question から取得したスキーマ)に移動する場合に便利です。

 git checkout stable

      X                   stable
     /                   
a---b---c---d---e---f---g tmp

に:

git merge --squash tmp
git commit -m "squash tmp"

      X-------------------G stable
     /                   
a---b---c---d---e---f---g tmp

そしてtmpブランチを削除します。

コミットの一部またはすべてを新しいベースでリプレイし、スカッシュ(または最近修正)、これを参照してください SO質問 )、直接:

git checkout tmp
git rebase -i stable

      stable
      X-------------------G tmp
     /                     
a---b

tmpのすべてのコミットを無効にすることを選択した場合(ただし、merge --squashとは反対に、一部を再生し、他を無効にすることができます)。

違いは次のとおりです。

  • mergeはソースブランチ(ここではtmp)に触れず、必要な場所に単一のコミットを作成します。
  • rebaseを使用すると、同じソースブランチに続行できます(それでもtmp):
    • 新しい拠点
    • よりクリーンな歴史
319
VonC

コミットのマージ:ブランチ内のすべてのコミットを保持し、ベースブランチ上のコミットでインターリーブしますenter image description here

スカッシュのマージ:変更を保持しますが、履歴から個々のコミットを省略します enter image description here

リベース:これにより、機能ブランチ全体がマスターブランチの先端から開始され、すべての新しいコミットがマスターに効果的に組み込まれます。

enter image description here

こちら の詳細

114

Merge squashは、ツリー(一連のコミット)を単一のコミットにマージします。つまり、squashesnで行われたすべての変更が単一のコミットにコミットされます。

リベースとは、リベース、つまり、ツリーの新しいベース(親コミット)を選択することです。たぶん、これに対するMercurialの用語はより明確です。彼らはそれを移植と呼んでいます。なぜなら、それはツリーの新しい基盤(親コミット、ルート)を選ぶからです。

インタラクティブなリベースを行うとき、リベースするコミットをスカッシュ、選択、編集、またはスキップするオプションが与えられます。

それが明確であったことを願っています!

74