Quelle est la différence entre "git merge" et "git rebase'?
Quelle est la différence entre git merge
et git rebase
?
- depuis ma réponse a été supprimée, visitez ce lien pour obtenir le droit de réponse à cette question: git-scm.com/book/en/Git-Branching-Rebasing#The-Basic-Rebase
- Par la façon dont je vais ajouter ce site. Tout ce que vous devez savoir à propos de git apprendre en jouant: pcottle.github.io/learnGitBranching
- Lisez d'abord ceci: git-scm.com/book/en/v2/... Alors: git-scm.com/book/en/v2/Git-Branching-Rebasing, Vous allez vraiment comprendre.
- de contrôle de version, Quand vous utilisez git rebase au lieu de git merge? - Débordement de pile
Vous devez vous connecter pour publier un commentaire.
Supposons qu'à l'origine il y avait 3 s'engage,
A
,B
,C
:Puis développeur Dan créé commettre
D
, et développeur Ed créé commettreE
:Évidemment, ce conflit devrait être résolu d'une certaine manière. Pour cela, il existe 2 façons:
De FUSION:
À la fois s'engage
D
etE
sont toujours là, mais nous créons de fusion s'engagerM
qui hérite changements des deuxD
etE
. Cependant, cela crée diamant forme, qui beaucoup de gens trouvent très déroutant.REBASE:
Nous créons commettre
R
, laquelle le contenu du fichier est identique à celle de fusion de commettreM
ci-dessus. Mais, nous nous débarrassons de commettreE
, comme il n'a jamais existé (indiqué par des points - ligne de fuite). En raison de cet effacement,E
devraient être locale développeur Ed et n'aurait jamais été poussé à un autre référentiel. L'avantage de cela est que diamant forme est évitée, et l'histoire reste belle ligne droite, la plupart des développeurs de l'amour que!git merge --squash
etgit rebase
, qui à la fois d'essayer de créer une histoire qui montre le code qui existe réellement dans un seul endroit. Git merge (ou de traction) sera interleave s'engage par jour, à la recherche comme certains s'engage existé (quand il n'y a aucun moyen de savoir si ils ne l'avaient jamais fait) et impliquant le code à toute date effectivement travaille de concert (il n'y a pas de telle implication, ni est-il souvent vrai). OMIgit merge
pas--squash
ne doit jamais être utilisé, il est juste à court de la création se trouve que seuls les plus circonspects, l'ingénieur peut voir à travers.git merge
ne pas interleave s'engage (mais il pourrait le paraître en regardantgit log
). Au lieu de cela,git merge
tient à la fois de développement histoires par Dan et Ed conservée intacte, comme il a été vu à partir de chaque point de vue à la fois.git rebase
fait ressembler que Dan a travaillé sur le premier, et Ed l'a suivi. Dans les deux cas (fusion et rebase), réel résultant de l'arborescence de fichiers est absolument identique.J'aime vraiment cet extrait de 10 Choses que je déteste au sujet de git (il donne une courte explication pour rebase dans sa deuxième exemple):
Et puis nous avons
qui est une bonne description.
1. non censurées dans l'original
Personnellement je ne trouve pas la norme de création de diagrammes technique très utile - les flèches semblent toujours point le mauvais sens pour moi. (Généralement, ils pointent en direction de la "mère" de chaque commit, qui finit par se reculer dans le temps, ce qui est bizarre).
De l'expliquer en mots:
Pour des raisons que je ne comprends pas, d'outils graphiques pour Git n'ont jamais fait beaucoup d'efforts pour présenter une fusion des histoires plus proprement, dans l'abstraction de l'individu se confond. Donc, si vous voulez un "nettoyage" de l'histoire, vous devez utiliser rebase.
Je me souviens avoir lu des messages de blog à partir de programmeurs qui seulement utilisation rebase et d'autres qui jamais utilisation rebase.
Exemple
Je vais essayer d'expliquer cela avec juste des mots exemple. Disons que d'autres personnes sur votre projet de travail sur l'interface utilisateur, et vous êtes à la rédaction de la documentation. Sans cela, votre histoire pourrait ressembler à quelque chose comme:
Qui est, de fusions et de l'INTERFACE utilisateur s'engage dans le milieu de votre documentation s'engage.
Si vous relocalisée votre code sur master au lieu de les fusionner, il ressemblerait à ceci:
Tous vos commits sont en haut (la plus récente), suivi par le reste de la
master
branche.(Disclaimer: je suis l'auteur de "10 choses que je déteste au sujet de Git" post appelé dans une autre réponse)
Tandis que l'accepté et le plus upvoted réponse est génial, j'en outre trouver utile d'essayer d'expliquer la différence seulement par les mots:
de fusion
rebase
résumé: Lorsque cela est possible, rebase est presque toujours la meilleure. Prise de ré-intégration dans la branche principale plus facile.
Parce que? ➝ votre fonction peut être présenté comme un gros fichier de patch’ (aka diff) à l'égard de la branche principale, de ne pas avoir "d'expliquer" plusieurs parents: Au moins deux, venant de l'une fusion, mais probablement beaucoup plus, si il y avait plusieurs fusions. Contrairement à la fusion, plusieurs rebases ne s'additionnent pas. (un autre gros plus)
Git rebase est plus proche d'une fusion. La différence de rebase est:
Cela signifie donc que toutes vos modifications locales sont déplacés à la fin, après tout, la distance s'engage. Si vous avez un conflit de fusion, vous devez les résoudre aussi.
Facile à comprendre pouvez voir ma figure.
Rebase va changer commettre hachage, de sorte que si vous voulez éviter beaucoup de conflits, il suffit d'utiliser rebase lorsque la branche est fait/complet comme stable.