web-dev-qa-db-fra.com

Quelles sont les différences entre `--squash` et` --no-ff --no-commit`?

Lequel devrait-on utiliser pour cacher les micro-engagements?

Est la seule différence entre git merge --squash et git merge --no-ff --no-commit le déni des autres parents?

54
Tobias Kienzler

Les différences

Ces options existent à des fins distinctes. Votre référentiel se termine différemment.

Supposons que votre référentiel soit comme ceci une fois que vous avez terminé de développer sur la branche de sujet:

enter image description here


--squash

Si vous passez à la caisse maître puis git merge --squash topic; git commit -m topic, vous obtenez ceci:

enter image description here


--no-ff --no-commit

Au lieu de cela, si vous faites git merge --no-ff --no-commit; git commit -m topic, vous obtenez ceci:

enter image description here

Masquer les micro-commits

Si vous voulez vraiment cacher (je veux dire supprimer de votre dépôt) vos micro-commits, utilisez --squash. Parce que, comme vous pouvez le voir sur les images ci-dessus, vous ne cachez pas vraiment vos micro-commits si vous ne courez pas. De plus, vous ne poussez généralement pas vos branches de sujet dans le monde. Les branches de sujet permettent au sujet de mûrir.

Si vous voulez que votre historique contienne tous vos micro-commits, mais laissez-les dans une autre ligne de développement (la ligne verte dans les images ci-dessus), utilisez --no-ff --no-commit. Mais n'oubliez pas que a) ce n'est pas une branche, et b) ne signifie vraiment rien dans Git car c'est juste un autre parent de votre commit.

Veuillez vous référer à Git Branching - What a Branch Is si vous voulez vraiment comprendre.

56
Yasushi Shoji