Disons que nous avons la situation suivante dans Git:
Un référentiel créé:
mkdir GitTest2 cd GitTest2 git init
Certaines modifications dans le master ont lieu et sont validées:
echo "On Master" > file git commit -a -m "Initial commit"
Feature1 a dérivé le maître et certains travaux sont effectués:
git branch feature1 git checkout feature1 echo "Feature1" > featureFile git commit -a -m "Commit for feature1"
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
Le bug est corrigé dans la branche du correctif et fusionné dans le maître (peut-être après une demande de pull / révision de code):
echo "Bugfix" > bugfixFile git commit -a -m "Bugfix Commit" git checkout master git merge --no-ff hotfix1
Le développement de feature1 se poursuit:
git checkout feature1
Disons que j'ai besoin du correctif dans ma branche de fonctionnalités, peut-être parce que le bogue s'y produit également. Comment puis-je y parvenir sans dupliquer les validations dans ma branche de fonctionnalités?
Je veux éviter d'obtenir 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 tirage: tous ces commits seront également inclus dans la demande de tirage et doivent être revus bien que cela ait déjà été fait (car le correctif est déjà dans le maître).
Je ne peux pas faire de git merge master --ff-only
: "fatal: impossible d'avancer rapidement, avorter.", Mais je ne sais pas si cela m'a aidé.
la source
feature1
est complètement locale, jetez un œil àgit rebase
.git rebase
semble être de la magie noire pour moi ....git branch feature1
etgit checkout feature1
pourrait être combiné engit checkout -b feature1
et 4. pourrait être entièrement réduit àgit checkout -b hotfix1 master
Réponses:
Comment fusionner la branche principale dans la branche de fonctionnalité? Facile:
Il est inutile de forcer une fusion rapide ici, car cela ne peut pas être fait. Vous vous êtes engagé à la fois dans la branche de fonctionnalité et la branche principale. L'avance rapide est impossible maintenant.
Jetez un œil à GitFlow . C'est un modèle de branchement pour git qui peut être suivi, et vous l'avez déjà fait inconsciemment. C'est également une extension de Git qui ajoute quelques commandes pour les nouvelles étapes du workflow qui font des choses automatiquement que vous auriez autrement dû faire manuellement.
Alors, qu'avez-vous bien fait dans votre flux de travail? Vous avez deux branches avec lesquelles travailler, votre branche feature1 est fondamentalement la branche "develop" du modèle GitFlow.
Vous avez créé une branche de correctifs à partir de master et l'avez fusionnée. Et maintenant tu es coincé.
Le modèle GitFlow vous demande de fusionner le correctif également à la branche de développement, qui est "feature1" dans votre cas.
La vraie réponse serait donc:
Cela ajoute toutes les modifications qui ont été apportées à l'intérieur du correctif à la branche de fonctionnalité, mais seulement ces modifications. Ils peuvent entrer en conflit avec d'autres changements de développement dans la branche, mais ils n'entreront pas en conflit avec la branche principale si vous fusionnez éventuellement la branche de fonction vers le maître.
Soyez très prudent avec le rebasage. Ne rebasiez que si les modifications que vous avez apportées sont restées locales dans votre référentiel, par exemple si vous n'avez poussé aucune branche vers un autre référentiel. Le rebasage est un excellent outil pour organiser vos commits locaux dans un ordre utile avant de le diffuser dans le monde, mais le rebasage ultérieur gâchera les choses pour les débutants git comme vous.
la source
git merge master
volonté fusionnera à partir de votre copie locale de master, donc même si vous avez fait ungit pull
dans votre branche de fonctionnalité après que quelqu'un d'autre a fusionné une branche différente en master, vous devrezgit checkout master
, puisgit pull
, puis àgit checkout feature1
nouveau et ALORSgit merge master
.git fetch
etgit merge origin/master
git pull origin master
fusionnera automatiquementorgin/master
avec la branche actuelleVous devriez pouvoir rebaser votre branche sur master:
Gérez tous les conflits qui surviennent. Lorsque vous arriverez aux commits avec les corrections de bugs (déjà en master), Git dira qu'il n'y a pas eu de changements et qu'ils ont peut-être déjà été appliqués. Vous continuez ensuite le rebase (tout en sautant les commits déjà en master) avec
Si vous effectuez une
git log
sur votre branche de fonctionnalité, vous verrez la validation de correction de bogue n'apparaître qu'une seule fois, et dans la partie principale.Pour une discussion plus détaillée, consultez la documentation du livre Git sur
git rebase
( https://git-scm.com/docs/git-rebase ) qui couvre ce cas d'utilisation exact.================ Modifier pour un contexte supplémentaire ====================
Cette réponse a été fournie spécifiquement pour la question posée par @theomega, en tenant compte de sa situation particulière. Notez cette partie:
Baser sa branche privée sur le maître est exactement ce qui donnera ce résultat. En revanche, la fusion de master dans sa branche ferait précisément ce qu'il ne souhaite pas spécifiquement : ajouter une validation qui n'est pas liée à l'implémentation de la fonctionnalité sur laquelle il travaille via sa branche.
Pour m'adresser aux utilisateurs qui lisent le titre de la question, sautez le contenu et le contexte réels de la question, puis ne lisez que la première réponse à l'aveuglette en supposant qu'elle s'appliquera toujours à leur (différent) cas d'utilisation, permettez-moi d'élaborer:
git merge master
comme dans la réponse de @ Sven).Enfin, si vous n'êtes pas satisfait du fait que cette réponse ne soit pas la mieux adaptée à votre situation même si c'était pour @theomega, l'ajout d'un commentaire ci-dessous ne sera pas particulièrement utile: je ne contrôle pas quelle réponse est sélectionnée, seul @theomega le fait.
la source
-f
lorsque vous poussez pour écraser la branche avec la version rebasée. Faites attention!-f
? Ou mon flux de travail complet est-il défectueux parce que j'en ai besoin-f
?feature1
de Github.master
dans une branche privée (il mentionne "sa" branche locale). Dans ce cas,rebase
c'est bien et c'est le même cas d'utilisation que le "nettoyage" que vous mentionnez.Sur la base de cet article , vous devez:
créer une nouvelle branche basée sur la nouvelle version du master
git branch -b newmaster
fusionnez votre ancienne branche de fonctionnalité en une nouvelle
git checkout newmaster
résoudre les conflits sur une nouvelle branche de fonctionnalité
Les deux premières commandes peuvent être combinées à
git checkout -b newmaster
.De cette façon, votre historique reste clair car vous n'avez pas besoin de fusions antérieures. Et vous n'avez pas besoin d'être aussi super prudent car vous n'avez pas besoin de refaire Git.
la source
git merge
1. fusion
origin/master
branche àfeature
branche2. fusion
feature
branche àorigin/master
branchela source
La réponse de Zimi décrit ce processus de manière générale. Voici les détails:
Créez et basculez vers une nouvelle branche. Assurez-vous que la nouvelle branche est basée sur
master
elle inclura les correctifs récents.Après être passé à la nouvelle branche, fusionnez les modifications de votre branche de fonctionnalité existante. Cela ajoutera vos validations sans dupliquer les validations du correctif.
Sur la nouvelle branche, résolvez tous les conflits entre votre fonctionnalité et la branche principale.
Terminé! Utilisez maintenant la nouvelle branche pour continuer à développer votre fonctionnalité.
la source
Voici un script que vous pouvez utiliser pour fusionner votre branche principale dans votre branche actuelle.
Le script fait ce qui suit:
Enregistrez ce code en tant que fichier de commandes (.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.
la source
Vous pourrez peut-être faire un "choix" pour extraire les validations exactes dont vous avez besoin dans votre branche de fonctionnalités.
Faites un
git checkout hotfix1
pour accéder à la branche hotfix1. Ensuite, faites ungit log
pour obtenir le hachage SHA-1 (grande séquence de lettres et de chiffres aléatoires qui identifie de manière unique une validation) de la validation en question. Copiez cela (ou les 10 premiers caractères environ).Ensuite,
git checkout feature1
pour revenir sur votre branche de fonctionnalités.Alors,
git cherry-pick <the SHA-1 hash that you just copied>
Cela va tirer ce commit, et seulement ce commit, dans votre branche de fonctionnalité. Ce changement sera dans la branche - vous venez de le "sélectionner". Ensuite, reprenez le travail, éditez, validez, poussez, etc. au contenu de votre cœur.
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é dans ce commit particulier , sachez qu'il n'a pas à le refaire, et juste "sauter".
la source
git merge
fonctionne dans ce "replay commits", comme vous semblez le laisser entendre ("et juste le sauter"). Le mélange de la cueillette des cerises et de la fusion peut apparemment entraîner des problèmes; voir: news.ycombinator.com/item?id=3947950Je suis sur la branche des fonctionnalités et j'ai fait des refactorings. Je veux maintenant fusionner les modifications principales dans ma branche de fonctionnalité. Je suis loin derrière. Remarque Je ne souhaite pas extraire les modifications principales dans ma section locale car ma branche de fonction a des modules déplacés d'un endroit à un autre. J'ai trouvé que jouer ci-dessous sans tirer ne fonctionne pas. il dit "Déjà à jour".
Cela fonctionne ci-dessous, notez l'utilisation de git merge origin / master:
la source