Quelle est la différence entre git merge
et git rebase
?
Quelle est la différence entre git merge
et git rebase
?
Réponses:
Supposons que l' origine il y avait 3 commits, A
, B
, C
:
Ensuite, le développeur Dan a créé la validation D
et le développeur Ed a créé la validation E
:
De toute évidence, ce conflit devrait être résolu d'une manière ou d'une autre. Pour cela, il existe 2 façons:
MERGE :
Les deux validations D
et E
sont toujours là, mais nous créons une validation de fusion M
qui hérite des modifications des deux D
et E
. Cependant, cela crée une forme de diamant , ce que beaucoup de gens trouvent très déroutant.
REBASE :
Nous créons un commit R
, dont le contenu réel du fichier est identique à celui du commit de fusion M
ci-dessus. Mais, nous nous débarrassons du commit E
, comme il n'a jamais existé (indiqué par des points - ligne de fuite). En raison de cette oblitération, E
devrait être local pour le développeur Ed et n'aurait jamais dû être poussé vers un autre référentiel. L'avantage du rebase est que la forme de diamant est évitée et que l'histoire reste belle en ligne droite - la plupart des développeurs adorent ça!
git merge
n'entrelace pas les commits (mais cela peut apparaître ainsi en regardant git log
). Au lieu de cela, git merge
conserve les deux histoires de développement de Dan et Ed intactes, comme cela a été vu de chaque point de vue à la fois. git rebase
donne l'impression que Dan y a travaillé en premier, et Ed l'a suivi. Dans les deux cas (fusion et rebase), l'arborescence de fichiers résultante réelle est absolument identique.
J'adore vraiment cet extrait de 10 choses que je déteste à propos de git (il donne une brève explication de rebase dans son deuxième exemple):
3. Documentation merdique
Les pages de manuel sont un tout-puissant «f *** you» 1 . Ils décrivent les commandes du point de vue d'un informaticien, pas d'un utilisateur. Exemple concret:
git-push – Update remote refs along with associated objects
Voici une description pour les humains:
git-push – Upload changes from your local repository into a remote repository
Mise à jour, un autre exemple: (merci cgd)
git-rebase – Forward-port local commits to the updated upstream head
Traduction:
git-rebase – Sequentially regenerate a series of commits so they can be applied directly to the head node
Et puis nous avons
git-merge - Join two or more development histories together
ce qui est une bonne description.
1. non censuré dans l'original
Personnellement, je ne trouve pas la technique de diagramme standard très utile - les flèches semblent toujours indiquer le mauvais sens pour moi. (Ils pointent généralement vers le "parent" de chaque commit, qui finit par être en arrière dans le temps, ce qui est bizarre).
Pour l'expliquer avec des mots:
Pour des raisons que je ne comprends pas, les outils GUI pour Git n'ont jamais fait beaucoup d'efforts pour présenter les histoires de fusion plus proprement, en faisant abstraction des fusions individuelles. Donc, si vous voulez un "historique propre", vous devez utiliser le rebase.
Je me souviens d' avoir lu les messages du blog de programmeurs qui n'utilisent rebasage et d' autres qui n'utilisent rebasage.
Je vais essayer d'expliquer cela avec un exemple de mots justes. Supposons que d'autres personnes sur votre projet travaillent sur l'interface utilisateur et que vous rédigez de la documentation. Sans rebase, votre historique pourrait ressembler à:
Write tutorial
Merge remote-tracking branch 'origin/master' into fixdocs
Bigger buttons
Drop down list
Extend README
Merge remote-tracking branch 'origin/master' into fixdocs
Make window larger
Fix a mistake in howto.md
Autrement dit, les fusions et les validations de l'interface utilisateur au milieu de vos validations de documentation.
Si vous rebasiez votre code sur master au lieu de le fusionner, cela ressemblerait à ceci:
Write tutorial
Extend README
Fix a mistake in howto.md
Bigger buttons
Drop down list
Make window larger
Tous vos commits sont en haut (les plus récents), suivis du reste de la master
branche.
( Avertissement: je suis l'auteur du message "10 choses que je déteste à propos de Git" mentionné dans une autre réponse )
Bien que la réponse acceptée et la plus votée soit excellente, je trouve également utile d'essayer d'expliquer la différence uniquement par des mots:
fusionner
rebaser
résumé: Lorsque cela est possible, le rebasage est presque toujours meilleur. Faciliter la réintégration dans la branche principale.
Parce que? Work votre travail de fonctionnalité peut être présenté comme un gros `` fichier patch '' (alias diff) en ce qui concerne la branche principale, sans avoir à `` expliquer '' plusieurs parents: au moins deux, provenant d'une fusion, mais probablement beaucoup plus, s'il y a étaient plusieurs fusions. Contrairement aux fusions, plusieurs rebases ne s'additionnent pas. (un autre gros avantage)
Git rebase est plus proche d'une fusion. La différence de rebase est:
Cela signifie donc que toutes vos validations locales sont déplacées à la fin, après toutes les validations distantes. Si vous avez un conflit de fusion, vous devez également le résoudre.
J'ai trouvé un article vraiment intéressant sur git rebase vs merge , j'ai pensé le partager ici