Dans git, Quelle est la différence entre merge --squash et rebase?

je suis nouveau à git et j'essaie de comprendre la différence entre un squash et un rebase. D'après ce que j'ai compris, vous exécutez un squash en faisant un rebase.

275
demandé sur GiH 2010-03-11 20:33:18

3 réponses

les deux git merge --squash et git rebase --interactive peuvent produire une propagation" écrasée".

Mais ils servent à des fins différentes.

va produire une propagation écrasée sur la branche de destination, sans marquer aucune relation de fusion.

(Note: il ne produit pas de s'engager tout de suite: vous avez besoin d'un autre git commit -m "squash branch" )

Ceci est utile si vous voulez jeter la branche source complètement, en allant de (schéma tiré de ainsi question ):

 git checkout stable

      X                   stable
     /                   
a---b---c---d---e---f---g tmp

à:

git merge --squash tmp
git commit -m "squash tmp"

      X-------------------G stable
     /                   
a---b---c---d---e---f---g tmp

puis supprimer tmp branche.

replace une partie ou la totalité de vos commits sur une nouvelle base, vous permettant de squash (ou plus récemment "réparer", voir ce ainsi question ), allant directement à:

git checkout tmp
git rebase -i stable

      stable
      X-------------------G tmp
     /                     
a---b

si vous choisissez d'écraser toutes les commissions de tmp (mais, contrairement à merge --squash , vous pouvez choisir de rejouer certains, et d'écraser d'autres).

donc les différences sont:

  • merge ne touche pas votre branche source ( tmp ici) et crée une commit unique où vous vouloir.
  • rebase vous permet de continuer sur la même branche source (toujours tmp ) avec:
      "1519200920 une" nouvelle base
    • une histoire plus propre
291
répondu VonC 2017-05-23 12:18:15

Merge squash fusionne un arbre (une séquence de commits) en une seule commit. Qui est, courges , toutes les modifications apportées à n s'engage dans un seul commit.

Rebasage est re-fonder, c'est le choix d'une nouvelle base (parent commettre) pour un arbre. Peut-être que le terme mercuriel pour ceci est plus clair: ils appellent cela la transplantation parce que c'est juste que: ramasser un nouveau terrain (parent commit, root) pour un arbre.

Lorsque vous faites un rebase interactif, vous avez le choix entre squash, pick, edit ou skip les commits que vous allez rebase.

Espère que c'était clair!

69
répondu Mauricio Scheffer 2010-03-11 18:15:41

Merge commits: conserve toutes les commits dans votre branche et les entrelace avec commits sur la branche de base enter image description here

Merge Squash: conserve les changements mais omet l'individu commet de l'histoire enter image description here

Rebase: cela déplace la branche caractéristique entière pour commencer sur la pointe de la branche principale, incorporant effectivement toutes les nouvelles commits dans le maître

enter image description here

plus sur ici

64
répondu Md Ayub Ali Sarker 2018-07-31 13:34:59