32

--no-ff パラメータを指定して git merge --squash を使用しようとしていますが、git では許可されません。誰かが私を助けるために何か提案がありますか?

早送りマージを使用できず、 --squash パラメーターを使用して、別のブランチで行われた多くのコミットをグループ化する必要があります。

ありがとう!

4

4 に答える 4

34

そのようなコマンドは意味がないため、おそらく許可されません。

ドキュメントに--squashは次のように書かれています(強調は私のものです):

--squash実際のマージが発生したかのように(マージ情報を除いて)
作業ツリーとインデックスの状態を生成しますが、実際にはコミットを作成したり、 HEAD を移動したり、 GIT_DIR/MERGE_HEAD を記録して次の git commit コマンドを作成したりしませんマージコミット。これにより、現在のブランチの上に単一のコミットを作成できます。その効果は、別のブランチをマージするのと同じです (タコの場合はそれ以上)。

--no-ffフラグは次のことを行います。

マージが早送りとして解決される場合でも、マージ コミットを作成します。

基本的に、コミットを行うように git に要求していて、同時にコミットを行わないようにしています。

ブランチのすべての履歴を保存したい場合は、--no-ffフラグを使用する必要があります。コミット d は、a と c の 2 つの親を持つマージ コミットです。

a ------ d -- ....
 \      /
  b -- c  

そのブランチのすべてのコミットを単一の作業単位として扱いたい場合は、 を使用します--squashコミット d は、コミット b および c からのすべての変更を含むが、1 つの親 a のみを持つ通常のコミットです。

a ---- d -- ....
 \      
  b -- c  
于 2013-01-14T16:02:09.447 に答える
10

何をし--squashますか?- すべてのコミットをまとめて押しつぶし、ブランチからのすべての変更を単一のコミットとしてコミットできるように、インデックスの状態を作成します。コードの変更はブランチをマージしたようなものになりますが、履歴は 1 つの大きなコミットを行ったようなものになります。

何をし--no-ffますか?-ブランチを早送りできる場合でも、それをマージとして扱い、マージコミットを作成してください。

そのため--squash、マージの痕跡なしで履歴を取得することについてです。--no-ff転送されている場合でも、履歴をマージして強制することについてです。そのため、これらは相互に排他的であり、一緒に使用することはできません。

その質問は の誤解から生じていると思いますfast-forward。これはマージではありません。コミットは以前のブランチのコミットに対して直接行われたため、ブランチをマージされたブランチから別のコミットに直接転送するだけです。早送りしないと、この動作が停止し、上部にマージ コミットが強制されます。押しつぶしているときに、早送りしないように要求しているかどうかは問題ではありません。どちらでも同じでしょう。

于 2013-01-14T16:16:48.910 に答える
6

この回答は、実際の質問とは関係ありません:

--no-ff で git merge --squash を使用できないのはなぜですか?

それはすでに適切に回答されているためです。

ただし、少し異なるアプローチで実際に可能であることを明確にするために、最初に機能ブランチをインタラクティブにリベースし(たとえば、すべてのコミットを押しつぶす)、その後git merge --no-ffマスターのブランチを作成できます。

于 2019-05-22T07:10:26.987 に答える