回答:
どちらgit merge --squash
とgit rebase --interactive
「押しつぶさ」コミット生成することができます。
ただし、目的は異なります。
マージ関係をマークせずに、宛先ブランチで押し潰されたコミットを生成します。
(注:すぐにコミットが生成されるわけではありません。追加が必要
ですgit commit -m "squash branch"
)
これは、ソースブランチを完全に破棄する場合に便利です(SO質問から取得したスキーマ):
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
ブランチを削除します。
注:git merge
には--commit
オプションがありますが、では使用できません--squash
。なかった決して使用することも可能--commit
と--squash
一緒に。
Git 2.22.1(2019年第3四半期)以降、この非互換性は明示的になります。
Vishal Verma()によるcommit 1d14d0c(2019年5月24日)を参照してください。(合併によりJunio C浜野- -で33f2790コミットし、2019年7月25日)をreloadbrain
gitster
merge
:ゴミ--commit
付き--squash
以前は、
--squash
が提供されたときに 'option_commit
'が通知なしで削除されました。これは、スカッシュのコミットなしの動作を--commit
明示的にオーバーライドしようとしたユーザーにとっては驚くべきことでした。
git/git
builtin/merge.c#cmd_merge()
今含まれています:
if (option_commit > 0)
die(_("You cannot combine --squash with --commit."));
コミットの一部またはすべてを新しいベースで再生し、スカッシュ(または最近「修正」、このSO質問を参照)できるようにします。
git checkout tmp
git rebase -i stable
stable
X-------------------G tmp
/
a---b
すべてのコミットをスカッシュすることを選択した場合tmp
(ただし、とは逆にmerge --squash
、一部をリプレイし、他のものをスカッシュすることを選択できます)。
したがって、違いは次のとおりです。
squash
ソースブランチ(tmp
ここ)には触れず、必要な場所に単一のコミットを作成します。rebase
同じソースブランチに進むことができます(まだtmp
):
tmp
まとめて押しつぶされたコミットを表します。
G
、と同じコンテンツを表すことはありません。g
X
git merge --no-ff temp
代わりにを使用している場合はgit merge --squash temp
、厄介な履歴が表示されますが、などの操作もgit revert e
はるかに簡単に行えます。散らかっていますが、正直で実用的な歴史であり、メインブランチはまだかなりクリーンなままです。
git bisect
やgit blame
、頻繁に使用されない場合も同様です(例git pull --no-ff
:stackoverflow.com/questions/12798767/…)。一つのアプローチは、この記事では、3(説明理由である、とにかくありませんstackoverflow.com/questions/9107861/...を)
コミットのマージ:すべてのコミットをブランチに保持し、ベースブランチのコミットでインターリーブします
Merge Squash:変更を保持しますが、履歴から個々のコミットを省略します
リベース:これにより、機能ブランチ全体がマスターブランチの先端から始まるように移動し、すべての新しいコミットがマスターに効果的に組み込まれます
詳細はこちら
Merge squashは、ツリー(一連のコミット)を1つのコミットにマージします。それはそれは、あるカボチャで行われたすべての変更n個のシングルにコミットコミットを。
リベースとは、ツリーの新しいベース(親コミット)を選択することです。多分これの水銀の用語はより明確です:彼らはそれを移植と呼んでいます:それはそれだけです:ツリーのために新しい地面(親コミット、ルート)を選ぶことです。
インタラクティブなリベースを行う場合、リベースするコミットをスカッシュ、選択、編集、またはスキップするオプションが提供されます。
それが明確だったことを願っています!
次の例から始めましょう。
これで、機能ブランチの変更をマスターブランチにマージする3つのオプションがあります。
コミットをマージする
と、機能ブランチのすべてのコミット履歴が保持され、マスターブランチに移動され
ます。ダミーのコミットが追加されます。
リベースおよびマージ
は、機能ブランチのすべてのコミット履歴をマスターブランチの前に
追加します。ダミーのコミットは追加されません。
Willをスカッシュしてマージすると、すべての機能ブランチのコミットが1つのコミットにグループ化され、マスターブランチの前に追加されて、
ダミーのコミットが追加されます。
以下に、masterブランチがそれぞれの後にどのように表示されるかを示します。
すべての場合:機能ブランチを
安全に削除できます。
G
されてc--d--e--f--g
一緒に押しつぶさ?