1345 votes

Git fusionne la branche hotfix dans la branche feature

Disons que nous avons la situation suivante dans Git :

  1. Un référentiel créé :

    mkdir GitTest2
    cd GitTest2
    git init
  2. Certaines modifications du maître ont lieu et sont enregistrées :

    echo "On Master" > file
    git commit -a -m "Initial commit"
  3. Feature1 s'est branché sur master et du travail a été fait :

    git branch feature1
    git checkout feature1
    echo "Feature1" > featureFile
    git commit -a -m "Commit for feature1"
  4. Pendant ce temps, un bogue est découvert dans le code maître et une branche de correction est établie :

    git checkout master
    git branch hotfix1
    git checkout hotfix1
  5. Le bogue est corrigé dans la branche hotfix et réintégré dans le master (peut-être après une pull request/une révision du code) :

    echo "Bugfix" > bugfixFile
    git commit -a -m "Bugfix Commit"
    git checkout master
    git merge --no-ff hotfix1
  6. Le développement de la fonctionnalité 1 se poursuit :

    git checkout feature1

Disons que j'ai besoin du correctif dans ma branche de fonctionnalité, peut-être parce que le bogue s'y produit également. Comment puis-je y parvenir sans dupliquer les commits dans ma branche de fonctionnalités ?

Je veux éviter de recevoir deux nouveaux commits sur ma branche de fonctionnalité qui n'ont aucun rapport avec l'implémentation de la fonctionnalité. Cela me semble particulièrement important si j'utilise des demandes de téléchargement : Tous ces commits seront également inclus dans la demande de pull et devront être revus bien que cela ait déjà été fait (puisque le correctif est déjà dans le master).

Je ne peux pas faire un git merge master --ff-only : "fatal : Impossible d'effectuer une avance rapide, abandon", mais je ne suis pas sûr que cela m'ait aidé.

13 votes

Si la branche feature1 est complètement local, jetez un coup d'œil à git rebase .

31 votes

Merci, en tant que débutant de git, git rebase ça ressemble à de la magie noire pour moi....

13 votes

Si la branche est fonctionnalité -Seulement, la correction du bug ne devrait pas avoir lieu ici (du moins si ce n'est pas un bug bloquant) puisque le but de cette branche est de montrer une nouvelle fonctionnalité. Le bug sera corrigé lors de la fusion avec le master où le commit avec la correction est présent.

30voto

jkdev Points 930

La réponse de Zimi décrit ce processus de manière générale. Voici les détails :

  1. Créer et passer à une nouvelle branche. Assurez-vous que la nouvelle branche est basée sur master afin qu'il inclue les correctifs récents.

    git checkout master
    git branch feature1_new
    git checkout feature1_new
    
    # Or, combined into one command:
    git checkout -b feature1_new master
  2. Après avoir basculé vers la nouvelle branche, fusionnez les changements de votre branche de fonctionnalité existante. Cela ajoutera vos commits sans dupliquer les commits du correctif.

    git merge feature1
  3. Sur la nouvelle branche, résolvez tous les conflits entre votre fonctionnalité et la branche maître.

C'est fait ! Utilisez maintenant la nouvelle branche pour continuer à développer votre fonctionnalité.

2 votes

Le problème est qu'un développeur perd du temps à créer constamment de nouvelles branches lorsqu'il a besoin de faire une mise à jour par rapport à master. Nous ferions beaucoup, beaucoup de branches, probablement 3 fois par jour pendant le travail actif. Vous devriez écrire des instructions sur le nettoyage de toutes les branches locales et sur la façon de s'en débarrasser à distance également. Nous avons également besoin de conseils pour nommer toutes ces branches afin de ne pas être confus. Sans cette partie, le système de branches se transformera en chaos.

4 votes

Tu as raison, ça ne devrait pas être fait tout le temps. Seulement quand (1) les changements sur master sont nécessaires pour votre fonctionnalité, ou (2) vous êtes sur le point de fusionner votre branche avec master et il pourrait y avoir des conflits. Et pour éviter le désordre, vous pouvez supprimer votre branche après qu'elle ait été fusionnée.

2 votes

Cette approche ne fonctionne pas bien si vous avez déjà soumis une demande de pull sur la branche de fonctionnalité et que la PR est en cours, la révision du code aurait été refaite sur la nouvelle branche de fonctionnalité avec un travail inutile.

13voto

Aaron M. Points 81

Voici un script que vous pouvez utiliser pour fusionner votre branche master dans votre branche courante.

Le script fait ce qui suit :

  • Passage à la branche principale
  • Pulse la branche master
  • Retour à votre branche actuelle
  • Fusionne la branche master dans votre branche actuelle

Enregistrez ce code sous forme de fichier batch (.bat) et placez le script n'importe où dans votre référentiel. Cliquez ensuite dessus pour l'exécuter et vous êtes prêt.

:: This batch file pulls current master and merges into current branch

@echo off

:: Option to use the batch file outside the repo and pass the repo path as an arg
set repoPath=%1
cd %repoPath%

FOR /F "tokens=*" %%g IN ('git rev-parse --abbrev-ref HEAD') do (SET currentBranch=%%g)

echo current branch is %currentBranch%
echo switching to master
git checkout master
echo.
echo pulling origin master
git pull origin master
echo.
echo switching back to %currentBranch%
git checkout %currentBranch%
echo.
echo attemting merge master into %currentBranch%
git merge master
echo.
echo script finished successfully
PAUSE

10voto

Bob Gilmore Points 2161

Vous pourriez être en mesure de faire un "cherry-pick" pour tirer le exact dont vous avez besoin dans votre branche de fonctionnalité.

Faites un git checkout hotfix1 pour aller sur la branche hotfix1. Ensuite, faites un git log pour obtenir le hachage SHA-1 (grosse séquence de lettres et de chiffres aléatoires qui identifie de façon unique un commit) du commit en question. Copiez-le (ou les 10 premiers caractères environ).

Ensuite, git checkout feature1 pour retourner sur votre branche de fonctionnalité.

Ensuite, git cherry-pick <the SHA-1 hash that you just copied>

Cela va tirer ce commit, et sólo ce commit, dans votre branche de fonctionnalité. Ce changement sera dans la branche - vous l'avez juste "cherry-pické". Ensuite, reprenez votre travail, éditez, livrez, poussez, etc. à votre guise.

Lorsque, finalement, vous effectuerez une autre fusion d'une branche vers votre branche de fonctionnalité (ou vice-versa), Git reconnaîtra que vous avez déjà fusionné en ce particulier s'engager, savoir qu'il n'est pas nécessaire de le refaire, et simplement le "sauter".

1 votes

Je ne considère pas cela comme une bonne idée. Ensuite, IMO, le commit hotfix apparaîtra vraiment dans l'historique de votre branche feature, ce que vous ne voulez pas.

1 votes

"Lorsque, éventuellement, vous effectuerez une autre fusion d'une branche vers votre branche de fonctionnalités (ou vice-versa), git reconnaîtra que vous avez déjà fusionné [...]" - est-ce ainsi que cela fonctionne réellement ? Je ne pense pas que git merge fonctionne de la manière "rejouer les engagements" à laquelle vous semblez faire allusion ("et simplement les ignorer"). Mélanger le cherry picking et la fusion peut apparemment conduire à des problèmes ; voir : news.ycombinator.com/item?id=3947950

5voto

fabriciorissetto Points 100

En complément des réponses existantes, comme ces commandes sont récurrentes, nous pouvons le faire à la suite. Étant donné que nous sommes dans la branche des fonctionnalités :

git checkout master && git pull && git checkout - && git merge -

Ou les ajouter dans un alias :

alias merge_with_master="git checkout master && git pull && git checkout - && git merge -"

0voto

Tony Points 1228

Je suis sur la branche feature et j'ai fait des refactorings. Je veux maintenant fusionner les changements du maître avec ma branche de fonctionnalité. Je suis très en retard. Notez que je ne veux pas transférer les changements du master vers mon local. parce que les modules de ma branche ont été déplacés d'un endroit à l'autre. J'ai découvert que le fait d'effectuer les opérations ci-dessous sans tirer ne fonctionne pas. Il est indiqué "Déjà à jour".

 //below does not get the latest from remote master to my local feature branch without git pull
    git checkout master 
    git fetch 
    git checkout my-feature-branch 
    git merge master

Ce qui suit fonctionne, notez l'utilisation de git merge origin/master :

 git checkout master 
    git fetch 
    git checkout my-feature-branch 
    git merge origin/master

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X