web-dev-qa-db-fra.com

Comment fusionner un commit spécifique dans Git

J'ai créé une branche à partir d'un référentiel dans GitHub et engagé 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 seulement sans les 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
929
netawater

' git cherry-pick ' devrait être votre réponse ici.

Appliquez la modification introduite par un commit existant.

N'oubliez pas de lire la réponse de bdonlan à propos des conséquences de la cueillette dans ce billet:
"Extraire tous les commits d'une branche, les commissions spécifiées sont transférés à une autre" , où:

_A-----B------C
 \
  \
   D
_

devient:

_A-----B------C
 \
  \
   D-----C'
_

Le problème avec ce commit est que git considère qu'il s'engage à inclure tout l'historique devant lui.

Où C 'a un identifiant _SHA-1_ différent.
De même, sélectionner un commit dans une branche à une autre implique essentiellement de générer un patch, puis de l’appliquer, perdant ainsi l’historique de cette façon également.

Ce changement d'ID de validation rompt la fonctionnalité de fusion de git, entre autres choses (bien que, s'il est utilisé avec parcimonie, des heuristiques peuvent l'afficher).
Plus important encore, il ignore les dépendances fonctionnelles - si C utilisait réellement une fonction définie dans B, vous ne le saurez jamais .

1095
VonC

Vous pouvez utiliser git cherry-pick pour appliquer un seul commit à votre branche actuelle.

Exemple: git cherry-pick d42c389f

657
bdonlan

Essayons de prendre un exemple et de comprendre:

J'ai une branche, disons maître, pointant sur X <commit-id>, et j'ai une nouvelle branche pointant sur Y <sha1>.

Where Y <commit-id> = <master> branche commits - peu de commits

Maintenant, disons que pour la branche Y, je dois fermer les commits entre la branche principale et la nouvelle branche. Voici la procédure que nous pouvons suivre:

Étape 1:

git checkout -b local Origin/new

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

Étape 2:

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

Fusionnez les commits de la branche principale vers la nouvelle branche et créez également une validation de fusion du message de journal avec des descriptions sur une ligne provenant d'au plus <n> validations réelles en cours de fusion.

Pour plus d'informations et de paramètres sur la fusion de Git, veuillez consulter:

git merge --help

De même, si vous devez fusionner un commit spécifique, vous pouvez utiliser:

git cherry-pick <commit-id>
26
Upen