Comment fusionner un commit spécifique dans Git

j'ai bifurqué une branche d'un dépôt à GitHub et j'ai commis quelque chose qui m'est propre. Maintenant j'ai trouvé que le dépôt original avait une bonne caractéristique qui était à HEAD .

je veux le fusionner seulement sans les propagations précédentes. Que dois-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
827
demandé sur A_P 2009-05-19 09:27:34

3 réponses

' git cherry-pick ' ça devrait être ta réponse.

appliquer le changement introduit par une commit existante.

N'oubliez pas de lire bdonlan 's réponse sur la suite de cherry-picking dans ce post:

"Tirez sur tous les commits de la branche, pousser spécifié s'engage à l'autre" , où:

A-----B------C
 \
  \
   D

devient:

A-----B------C
 \
  \
   D-----C'

le problème avec ce commit est que git considère commits à inclure toute l'histoire avant eux

où C 'a une autre SHA-1 ID.

De même, choisir un commit d'une branche à l'autre implique de générer un patch, puis de l'appliquer, perdant ainsi l'histoire de cette façon.

cette modification des engagements brise fonctionnalité de fusion de Git entre autres choses (bien que si utilisé avec parcimonie il ya heuristiques qui seront papier sur ce).

Plus important encore, ignore les dépendances fonctionnelles - si C utilise réellement une fonction définie en B, vous ne saurez jamais .

985
répondu VonC 2018-07-19 09:46:13

vous pouvez utiliser git cherry-pick pour appliquer un seul commit par lui-même à votre branche actuelle.

exemple: git cherry-pick d42c389f

553
répondu bdonlan 2015-02-05 11:08:49

essayons de prendre un exemple et de comprendre:

j'ai une branche, dites master , pointant vers X , et j'ai une nouvelle branche pointant vers Y .

Y = branche s'engage - quelques engage

maintenant dire pour la branche Y je dois gap-close les commits entre la branche principale et la nouvelle branche. Ci-dessous la procédure que nous pouvons suivre:

Étape 1:

git checkout -b local origin/new

où local est le nom de la succursale. N'importe quel nom peut être donné.

Étape 2:

  git merge origin/master --no-ff --stat -v --log=300

fusionne les commits de la branche principale à la nouvelle branche et crée aussi une commit de fusion du message de journal avec des descriptions d'une ligne au plus commits réels qui sont fusionnés.

pour plus d'informations et de paramètres sur la fusion Git, veuillez vous référer à:

git merge --help

aussi si vous avez besoin de fusionner un commit spécifique, alors vous pouvez utiliser:

git cherry-pick <commit-id>
14
répondu user3799762 2016-07-05 16:17:09