私はgitが初めてで、スカッシュとリベースの違いを理解しようとしています。私が理解しているように、リベースを行うときはスカッシュを実行します。
git merge --squash
とgit 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
):コミットのマージ:ブランチ内のすべてのコミットを保持し、ベースブランチ上のコミットでインターリーブします
スカッシュのマージ:変更を保持しますが、履歴から個々のコミットを省略します
リベース:これにより、機能ブランチ全体がマスターブランチの先端から開始され、すべての新しいコミットがマスターに効果的に組み込まれます。
こちら の詳細
Merge squashは、ツリー(一連のコミット)を単一のコミットにマージします。つまり、squashesnで行われたすべての変更が単一のコミットにコミットされます。
リベースとは、リベース、つまり、ツリーの新しいベース(親コミット)を選択することです。たぶん、これに対するMercurialの用語はより明確です。彼らはそれを移植と呼んでいます。なぜなら、それはツリーの新しい基盤(親コミット、ルート)を選ぶからです。
インタラクティブなリベースを行うとき、リベースするコミットをスカッシュ、選択、編集、またはスキップするオプションが与えられます。
それが明確であったことを願っています!