Le guide ultime de Git Merge et Git Rebase

Bienvenue dans notre guide ultime des commandes git mergeet git rebase. Ce tutoriel vous apprendra tout ce que vous devez savoir sur la combinaison de plusieurs branches avec Git.

Git Merge

La git mergecommande fusionnera toutes les modifications apportées à la base de code sur une branche distincte de votre branche actuelle en tant que nouveau commit.

La syntaxe de la commande est la suivante:

git merge BRANCH-NAME

Par exemple, si vous travaillez actuellement dans une branche nommée devet que vous souhaitez fusionner toutes les nouvelles modifications qui ont été apportées dans une branche nommée new-features, vous émettez la commande suivante:

git merge new-features

Remarque: s'il y a des modifications non validées sur votre branche actuelle, Git ne vous permettra pas de fusionner tant que toutes les modifications de votre branche actuelle n'auront pas été validées. Pour gérer ces modifications, vous pouvez soit:

Créer une nouvelle branche et valider les modifications

git checkout -b new-branch-name git add . git commit -m ""

Les cacher

git stash # add them to the stash git merge new-features # do your merge git stash pop # get the changes back into your working tree

Abandonnez tous les changements

git reset --hard # removes all pending changes

Git Rebase

Rebaser une branche dans Git est un moyen de déplacer l'intégralité d'une branche vers un autre point de l'arborescence. L'exemple le plus simple consiste à déplacer une branche plus haut dans l'arbre. Disons que nous avons une branche qui a divergé de la branche principale au point A:

 /o-----o---o--o-----o--------- branch --o-o--A--o---o---o---o----o--o-o-o--- master

Lorsque vous rebasez, vous pouvez le déplacer comme ceci:

 /o-----o---o--o-----o------ branch --o-o--A--o---o---o---o----o--o-o-o master

Pour rebase, assurez-vous d'avoir tous les commits que vous voulez dans le rebase dans votre branche principale. Vérifiez la branche que vous souhaitez rebaser et taper git rebase master(où master est la branche sur laquelle vous souhaitez rebaser).

Il est également possible de rebaser sur une branche différente, de sorte que par exemple une branche qui était basée sur une autre branche (appelons-la fonctionnalité) soit rebasée sur master:

 /---o-o branch /---o-o-o-o---o--o------ feature ----o--o-o-A----o---o--o-o-o--o--o- master

Après git rebase master branchou git rebase masteraprès avoir vérifié la branche, vous obtiendrez:

 /---o-o-o-o---o--o------ feature ----o--o-o-A----o---o--o-o-o--o--o- master \---o-o branch

Git rebase interactif dans la console

Pour utiliser git rebasedans la console avec une liste de commits, vous pouvez choisir, modifier ou supprimer le rebase:

  • Entrez git rebase -i HEAD~5avec le dernier nombre étant n'importe quel nombre de commits à partir du plus récent vers l'arrière que vous souhaitez examiner.
  • Dans vim, appuyez sur esc, puis ipour commencer l'édition du test.
  • Sur le côté gauche, vous pouvez écraser le pickavec l'une des commandes ci-dessous. Si vous voulez écraser un commit dans un précédent et ignorer le message de commit, entrez fà la place du pickdu commit.
  • Enregistrez et quittez votre éditeur de texte.
  • Lorsque le rebase est arrêté, effectuez les ajustements nécessaires, puis utilisez git rebase --continuejusqu'à ce que le rebase réussisse.
  • Si le rebase réussit, vous devez forcer le transfert de vos modifications avec git push -fpour ajouter la version rebasée à votre référentiel distant.
  • En cas de conflit de fusion, il existe plusieurs moyens de résoudre ce problème, notamment en suivant les suggestions de ce guide. Une solution consiste à ouvrir les fichiers dans un éditeur de texte et à supprimer les parties du code que vous ne souhaitez pas. Puis utilisez git add suivi de git rebase --continue. Vous pouvez ignorer la validation en conflit en entrant git rebase --skip, arrêtez le rebasage en exécutant git rebase --abortdans votre console.
pick 452b159  pick 7fd4192  pick c1af3e5  pick 5f5e8d3  pick 5186a9f  # Rebase 0617e63..5186a9f onto 0617e63 (30 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but stop to edit the commit message. # e, edit = use commit, but stop to amend or add commit. # s, squash = use commit, meld into previous commit and stop to edit the commit message. # f, fixup = like "squash", but discard this commit's log message thus doesn't stop. # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out

Fusionner les conflits

Un conflit de fusion se produit lorsque vous effectuez des validations sur des branches distinctes qui modifient la même ligne de manière conflictuelle. Si cela se produit, Git ne saura pas quelle version du fichier conserver dans un message d'erreur similaire au suivant:

CONFLICT (content): Merge conflict in resumé.txt Automatic merge failed; fix conflicts and then commit the result.

Si vous regardez le resumé.txtfichier dans votre éditeur de code, vous pouvez voir où le conflit a eu lieu:

<<<<<<>>>>>> updated_address

Git a ajouté quelques lignes supplémentaires au fichier:

  • <<<<<<< HEAD
  • =======
  • >>>>>>> updated_address

Pensez   =======à la ligne de démarcation du conflit. Tout entre <<<<<<< HEADet =======est le contenu de la branche actuelle vers laquelle pointe la référence HEAD. D'autre part, tout entre   =======et >>>>>>> updated_addressest le contenu de l'être branche fusionnée, updated_address.

Git Merge vs Git Rebase

Les deux git mergeet git rebasesont des commandes très utiles, et l'une n'est pas meilleure que l'autre. Cependant, il existe des différences très importantes entre les deux commandes que vous et votre équipe devez prendre en compte.

À chaque git mergeexécution, un commit de fusion supplémentaire est créé. Chaque fois que vous travaillez dans votre référentiel local, avoir trop de validations de fusion peut rendre l'historique des validations déroutant. Une façon d'éviter la validation de fusion consiste à utiliser à la git rebaseplace.

git rebase is a very powerful feature. That being said, it is risky as well if it is not used in the right way. git rebase alters the commit history, so use it with care. If rebasing is done in the remote repository, then it can create a lot of issues when other developers try to pull the latest code changes from the remote repository. Remember to only run git rebase in a local repository.

That's all you need to know to merge and rebase with the best of 'em.