私はgitを初めて使用し、スカッシュとリベースの違いを理解しようとしています。私が理解しているように、リベースを行うときはスカッシュを実行します。
4 に答える
コミットのマージ:ブランチ内のすべてのコミットを保持し、それらをベースブランチ上のコミットとインターリーブします
スカッシュのマージ:変更を保持しますが、履歴から個々のコミットを省略します
リベース:これにより、機能ブランチ全体がマスターブランチの先端から始まり、すべての新しいコミットがマスターに効果的に組み込まれます。
詳細はこちら
両方とも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"
# 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 、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
:- 新しい基地
- よりクリーンな歴史
次の例から始めましょう。
これで、機能ブランチの変更をマスターブランチにマージする3つのオプションがあります。
コミットのマージ機能ブランチ
のすべてのコミット履歴を保持し、それらをマスターブランチに移動します 。ダミーのコミットが追加されます。リベースとマージマスターブランチの前に機能ブランチ
のすべてのコミット履歴を追加します 。余分なダミーコミットは追加しません。スカッシュとマージ
すべての機能ブランチのコミットを1つのコミットにグループ化し、マスターブランチの前に追加します
。ダミーのコミットを追加します。
マスターブランチがそれぞれをどのように処理するかを以下に示します。
すべての場合:機能ブランチ
を安全に削除できます。
マージスカッシュは、ツリー(一連のコミット)を単一のコミットにマージします。つまり、 n個のコミットで行われたすべての変更を1つのコミットにまとめます。
リベースとは、リベース、つまり、ツリーの新しいベース(親コミット)を選択することです。たぶん、これの水銀用語はもっと明確です:それがまさにそれであるため、彼らはそれを移植と呼びます:木の新しい地面(親のコミット、ルート)を選ぶこと。
インタラクティブなリベースを行う場合、リベースするコミットを押しつぶす、選択する、編集する、またはスキップするオプションが与えられます。
それが明確だったことを願っています!