1. ホーム
  2. git

[解決済み] merge --squashとrebaseの違いは何ですか?

2022-03-20 07:52:43

質問

私はgitの初心者なのですが、squashとrebaseの違いを理解しようと思っています。 私の理解では、リベースの際にスクワッシュを実行するのですよね。

どのように解決するのですか?

両方 git merge --squashgit rebase --interactive は "squashed" コミットを生成することができます。しかし、これらは異なる目的で使用されます。

は、マージ関係をマークせずに、宛先ブランチ上でつぶされたコミットを生成します。 (注意: これはすぐにコミットを生成するわけではありません。 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"


# In the following graph, G is c--d--e--f--g squashed together

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

を削除し tmp のブランチを作成します。


git merge には --commit オプション とは併用できません。 --squash . それは 決して を使用することができます。 --commit--squash を一緒にしています。 Git 2.22.1(2019年第3四半期)以降、この非互換性は明示されるようになりました。

参照 コミット 1d14d0c (2019年5月24日)による ヴィシャール・ヴェルマ ( reloadbrain ) . (によって統合されました。 ジュニオ・C・ハマノ--。 gitster -- コミット 33f2790 , 2019年7月25日)

<ブロッククオート

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."));


は、あなたのコミットの一部あるいは全部を新しいベースで再生し、スクショ(最近では "fix up"、以下参照)を可能にします。 SO質問 に直接行く)。

git checkout tmp
git rebase -i stable

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

のすべてのコミットを破棄することを選択した場合。 tmp (しかし、逆に merge --squash あるものは再生し、あるものは破棄することも可能です。)

では、その違いは。

  • squash はソースブランチに触れません ( tmp ここでは)そして、あなたが望む場所に単一のコミットを作成します。
  • rebase を使用すると 同じソースブランチに進む (なお tmp )を使っています。
    • 新しいベース
    • よりクリーンな歴史