Question Git fusionner le master 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 dans le maître ont lieu et se sont engagées.

    echo "On Master" > file
    git commit -a -m "Initial commit"
    
  3. Feature1 a dérivé le maître et un peu de travail est 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 correctif est établie

    git checkout master
    git branch hotfix1
    git checkout hotfix1
    
  5. Le bogue est corrigé dans la branche de correctif et fusionné dans le maître (peut-être après une demande d'extraction / révision de code):

    echo "Bugfix" > bugfixFile
    git commit -a -m "Bugfix Commit"
    git checkout master
    git merge --no-ff hotfix1
    
  6. Le développement sur feature1 continue:

    git checkout feature1
    

Maintenant, ma question: Dites que j'ai besoin du correctif dans ma branche de fonctionnalité, peut-être parce que le bug se produit également là. Comment puis-je y parvenir sans dupliquer les commits dans ma branche de fonctionnalité? Je veux éviter d'avoir deux nouveaux commits sur ma branche de fonctionnalité qui n'ont aucun rapport avec l'implémentation de la fonctionnalité. Cela semble particulièrement important pour moi si j'utilise Pull Requests: Tous ces commits seront également inclus dans la Pull Request et devront être revus même si cela a déjà été fait (car le correctif est déjà dans le master).

Je ne peux pas faire un git merge master --ff-only: "fatal: pas possible d'avancer rapidement, avorter.", mais je ne suis pas sûr si cela m'a aidé.


591
2018-06-06 07:18


origine


Réponses:


Vous devriez être capable de rebaser votre branche sur master:

git checkout feature1
git rebase master

Gérer tous les conflits qui surviennent Quand vous arrivez aux commits avec les corrections de bogues (déjà en master), git dira qu'il n'y a pas eu de changements et que peut-être ils ont déjà été appliqués. Vous continuez ensuite le rebasage (tout en sautant les commits déjà dans le maître) avec

git rebase --skip

Si vous effectuez un git log sur votre branche de fonctionnalité, vous verrez que la correction de bug n'apparaît qu'une seule fois, et dans la partie principale.

Pour une discussion plus détaillée, jetez un oeil aux documents du livre Git sur git rebase (https://git-scm.com/docs/git-rebase) qui couvrent ce cas d'utilisation exact.


352
2018-06-06 07:24



Comment fusionner la branche maîtresse dans la branche de fonctionnalité? Facile:

git checkout feature1
git merge master

Il ne sert à rien de forcer une fusion rapide vers l'avant, car cela ne peut pas être fait. Vous vous êtes engagé à la fois dans la branche de fonctionnalité et dans la branche principale. Avance rapide est impossible maintenant.

Jettes un coup d'oeil à Gitflow. C'est un modèle de branchement pour git qui peut être suivi, et vous l'avez déjà fait inconsciemment. C'est aussi une extension de git qui ajoute des commandes pour les nouvelles étapes du workflow qui font automatiquement les choses que vous auriez dû faire manuellement.

Alors qu'avez-vous fait dans votre flux de travail? Vous avez deux branches avec lesquelles travailler, votre branche feature1 est essentiellement la branche "develop" du modèle gitflow.

Vous avez créé une branche de correctif de maître et l'avez fusionnée. Et maintenant vous êtes coincé.

Le modèle gitflow vous demande de fusionner également le correctif à la branche devel, qui est "feature1" dans votre cas.

Donc la vraie réponse serait:

git checkout feature1
git merge --no-ff hotfix1

Cela ajoute toutes les modifications apportées dans le correctif à la branche d'entités, mais uniquement ces modifications. Ils peuvent entrer en conflit avec d'autres changements de développement dans la branche, mais ils ne seront pas en conflit avec la branche principale si vous ramenez la branche de fonctionnalité à master finalement.

Soyez très prudent avec rebasing. Rebase uniquement si les modifications que vous avez effectuées sont restées locales dans votre référentiel, par ex. vous n'avez pas poussé de branches vers un autre référentiel. Rebasing est un excellent outil pour vous aider à organiser vos commits locaux dans un ordre utile avant de le pousser dans le monde, mais rebaser après gâcher des choses pour les débutants git comme vous.


698
2018-06-06 08:42



En s'appuyant sur Cet article vous devriez:

  • créer une nouvelle branche qui est basée sur la nouvelle version du maître
  • fusionne votre ancienne branche d'entités en une nouvelle
  • résoudre le conflit sur la nouvelle branche de fonctionnalité

De cette façon, votre historique reste clair car vous n'avez pas besoin de back-fusion. Et vous n'avez pas besoin d'être si super prudent puisque vous n'avez pas besoin de git rebase


42
2018-06-09 14:16



La réponse de Zimi décrit ce processus en général. Voici les détails:

1) Créez et passez à une nouvelle branche. Assurez-vous que la nouvelle branche est basée sur master donc il inclura 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 le passage à la nouvelle branche, fusionnez les modifications de votre branche d'entités existante. Cela ajoutera vos validations sans dupliquer les validations de correctif.

git merge feature1

3) Sur la nouvelle branche, résolvez tout conflit entre votre fonctionnalité et la branche principale.

Terminé! Utilisez maintenant la nouvelle branche pour continuer à développer votre fonctionnalité.


12
2018-03-08 08:56



Vous pourriez être en mesure de faire un "choix de cerise" pour tirer le exact commit (s) dont vous avez besoin dans votre branche de fonctionnalité.

Fait une git checkout hotfix1 pour obtenir sur la branche hotfix1. Ensuite, faites un git log pour obtenir le hachage SHA1 (grande séquence de lettres aléatoires et de nombres qui identifie de manière unique une validation) de la validation en question. Copiez cela (ou les 10 premiers caractères).

Alors, git checkout feature1 pour revenir sur votre branche de fonctionnalité.

Alors, git cherry-pick <the SHA1 hash that you just copied>

Cela tirera cet engagement, et seulement cette validation, dans votre branche de fonctionnalité. Ce changement sera dans la branche - vous l'avez juste "sélectionné". Ensuite, reprenez le travail, éditez, commettez, poussez, etc. au contenu de votre coeur.

Lorsque, finalement, vous effectuez une autre fusion d'une branche dans votre branche de fonctionnalité (ou vice-versa), git reconnaîtra que vous avez déjà fusionné ce particulier commettre, sachez qu'il n'a pas à le refaire, et "saute dessus".


8
2017-10-02 05:39