J'ai bifurqué une branche à partir d'un référentiel dans GitHub et j'ai commis quelque chose de spécifique pour moi. Maintenant, j'ai trouvé que le dépôt d'origine avait une bonne fonctionnalité qui était à HEAD
.
Je veux le fusionner uniquement sans commits précédents. Que devrais-je faire? Je sais comment fusionner tous les commits:
git branch -b a-good-feature
git pull repository master
git checkout master
git merge a-good-feature
git commit -a
git push
Réponses:
'
git cherry-pick
' devrait être votre réponse ici.N'oubliez pas de lire la réponse de bdonlan sur les conséquences de la sélection des cerises dans ce post:
"Tirez tous les commits d'une branche, poussez les commits spécifiés vers une autre" , où:
devient:
la source
Vous pouvez utiliser git cherry-pick pour appliquer un seul commit par lui-même à votre branche actuelle.
Exemple:
git cherry-pick d42c389f
la source
git cherry-pick d42c
ougit cherry-pick d42c3
fonctionnera. Git est intelligent. ;)d42c389f
. Peut-être que le PO ne se souciait pas de créer une fusion en soi, mais la différence importe parfois.Essayons de prendre un exemple et de comprendre:
J'ai une branche, disons maître , pointant vers X <commit-id>, et j'ai une nouvelle branche pointant vers Y <sha1>.
Où Y <commit-id> = <master> branche commits - peu de commits
Maintenant, disons que pour la branche Y, je dois combler les commits entre la branche principale et la nouvelle branche. Voici la procédure que nous pouvons suivre:
Étape 1:
où local est le nom de la branche. N'importe quel nom peut être donné.
Étape 2:
Fusionnez les validations de la branche principale vers la nouvelle branche et créez également une validation de fusion du message de journal avec des descriptions d'une seule ligne d'au plus <n> validations réelles qui sont fusionnées.
Pour plus d'informations et de paramètres sur la fusion Git, veuillez vous référer à:
De plus, si vous devez fusionner un commit spécifique, vous pouvez utiliser:
la source
Y
dans votre phrase 3d? "J'ai une nouvelle branche pointant vers Y" vs "Maintenant, disons pour la branche Y", on dirait que Y était un commit puis est devenu une brancheDans mon cas d'utilisation, nous avions un besoin similaire de CD CI. Nous avons utilisé git flow avec les branches develop et master. Les développeurs sont libres de fusionner leurs modifications directement à développer ou via une demande de pull depuis une branche de fonctionnalité. Cependant, pour maîtriser, nous fusionnons uniquement les validations stables de la branche develop de manière automatisée via Jenkins.
Dans ce cas, la sélection à la cerise n'est pas une bonne option. Cependant, nous créons une branche locale à partir de l'ID de validation, puis fusionnons cette branche locale pour la maîtriser et effectuer une vérification propre mvn (nous utilisons maven). En cas de succès, libérez l'artefact de version de production sur Nexus à l'aide du plug-in de libération Maven avec l'option localCheckout = true et pushChanges = false. Enfin, lorsque tout est réussi, poussez les modifications et le tag à l'origine.
Un exemple d'extrait de code:
En supposant que vous êtes maître si cela est fait manuellement. Cependant, sur jenkins, lorsque vous retirez le dépôt, vous serez sur la branche par défaut (maître si configuré).
Cela vous donnera un contrôle total avec une fusion sans peur ou un enfer de conflit.
N'hésitez pas à le conseiller en cas de meilleure option.
la source
Les principales réponses décrivent comment appliquer les modifications d' une validation spécifique à la branche actuelle. Si c'est ce que vous entendez par «comment fusionner», utilisez simplement la sélection de cerises comme ils le suggèrent.
Mais si vous voulez réellement une fusion , c'est-à-dire que vous voulez un nouveau commit avec deux parents - la validation existante sur la branche actuelle et la validation à partir de laquelle vous vouliez appliquer des modifications - alors une sélection de cerise ne fera pas cela.
Avoir un véritable historique de fusion peut être souhaitable, par exemple, si votre processus de génération tire parti de l'ascendance git pour définir automatiquement les chaînes de version en fonction de la dernière balise (à l'aide
git describe
).Au lieu de choisir, vous pouvez faire un réel
git merge --no-commit
, puis ajuster manuellement l'index pour supprimer les modifications que vous ne souhaitez pas.Supposons que vous soyez sur une branche
A
et que vous souhaitiez fusionner le commit à l'extrémité de la brancheB
:Maintenant, vous êtes configuré pour créer un commit avec deux parents, le conseil actuel valide
A
etB
. Cependant, vous pouvez avoir appliqué plus de modifications que vous le souhaitez, y compris les modifications apportées par des validations antérieures sur la branche B. Vous devez annuler ces modifications indésirables, puis valider.(Il peut y avoir un moyen facile de rétablir l'état du répertoire de travail et de l'index tel qu'il était avant la fusion, de sorte que vous ayez une table blanche sur laquelle choisir le commit que vous vouliez en premier lieu. Mais Je ne sais pas comment obtenir cette table rase
git checkout HEAD
etgit reset HEAD
supprimera tous les deux l'état de fusion, ce qui ira à l'encontre du but de cette méthode.)Annulez donc manuellement les modifications indésirables. Par exemple, vous pourriez
pour chaque commit indésirable
012ea56
.Lorsque vous avez terminé d'ajuster les choses, créez votre commit:
Maintenant, vous n'avez que le changement que vous vouliez, et l'arbre d'ascendance montre que vous avez fusionné techniquement à partir de B.
la source