web-dev-qa-db-ja.com

`--squash`と` --no-ff --no-commit`の違いは何ですか?

マイクロコミットを隠すためにどれを使うべきですか?

git merge --squashgit merge --no-ff --no-commitの唯一の違いは、他の親の否認ですか?

54
Tobias Kienzler

違い

これらのオプションは、個別の目的のために存在します。リポジトリの最終的な結果は異なります。

トピックブランチでの開発が完了した後、リポジトリは次のようになっていると仮定します。

enter image description here


--squash

マスターをチェックアウトしてからgit merge --squash topic; git commit -m topic、あなたはこれを得る:

enter image description here


--no-ff --no-commit

代わりに、git merge --no-ff --no-commit; git commit -m topic、あなたはこれを得る:

enter image description here

マイクロコミットメントを隠す

マイクロコミットを非表示にしたい場合(つまり、リポジトリからdeleteを意味する)、--squash。なぜなら、上の画像でわかるように、つぶしていないなら、あなたは本当にマイクロコミットメントを隠していないからです。また、通常、トピックブランチを世界にプッシュしません。トピックブランチは、トピックが成熟するためのものです。

履歴にすべてのマイクロコミットを保持したいが、それらを別の開発ライン(上記の画像の緑のライン)に残したい場合は、--no-ff --no-commit。ただし、a)これはブランチではなく、b)コミットのもう1つの親であるため、Gitでは実際には何も意味しないことに注意してください。

本当に理解したい場合は、 Git Branching-What a Branch is を参照してください。

56
Yasushi Shoji