493

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

4

4 に答える 4

456

コミットのマージ:ブランチ内のすべてのコミットを保持し、それらをベースブランチ上のコミットとインターリーブしますここに画像の説明を入力してください

スカッシュのマージ:変更を保持しますが、履歴から個々のコミットを省略します ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

詳細はこちら


最初の2つの図は、GitHubドキュメントでのプルリクエストのマージについてのものです。

于 2017-04-21T20:21:35.200 に答える
429

両方ともgit merge --squashgit 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"


# 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。一緒に使うことは決して不可能でした。Git 2.22.1(2019年第3四半期)以降、この非互換性は明示されています。--commit--squash

Vishal Verma()によるcommit 1d14d0c(2019年5月24日)を参照してください。 ( Junio C Hamanoによってマージされました---コミット33f2790 、20197月25日)reloadbraingitster

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
    • 新しい基地
    • よりクリーンな歴史
于 2010-03-11T18:17:12.790 に答える
105

次の例から始めましょう。

ここに画像の説明を入力してください

これで、機能ブランチの変更をマスターブランチにマージする3つのオプションがあります。

  1. コミットのマージ機能ブランチ
    のすべてのコミット履歴を保持し、それらをマスターブランチに移動します 。ダミーのコミットが追加されます。

  2. リベースとマージマスターブランチの前に機能ブランチ
    のすべてのコミット履歴を追加します 。余分なダミーコミットは追加しません。

  3. スカッシュとマージ
    すべての機能ブランチのコミットを1つのコミットにグループ化し、マスターブランチの前に追加します
    。ダミーのコミットを追加します。

マスターブランチがそれぞれをどのように処理するかを以下に示します。

ここに画像の説明を入力してください

すべての場合:機能ブランチ
を安全に削除できます。

于 2019-10-29T13:39:19.953 に答える
99

マージスカッシュは、ツリー(一連のコミット)を単一のコミットにマージします。つまり、 n個のコミットで行われたすべての変更を1つのコミットにまとめます。

リベースとは、リベース、つまり、ツリーの新しいベース(親コミット)を選択することです。たぶん、これの水銀用語はもっと明確です:それがまさにそれであるため、彼らはそれを移植と呼びます:木の新しい地面(親のコミット、ルート)を選ぶこと。

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

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

于 2010-03-11T18:15:41.337 に答える