Question Comment fusionner un commit spécifique dans Git


J'ai forké une branche d'un dépôt dans GitHub et j'ai commis quelque chose de spécifique. Maintenant, j'ai trouvé le dépôt original avait une bonne fonctionnalité qui était à HEAD.

Je veux fusionner seulement sans commits précédents. Ce que je devrais faire? J'ai su 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

795
2018-05-19 05:27


origine


Réponses:


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

Appliquez la modification introduite par un commit existant.

Ne pas oublier de lire Bdonlanréponse à propos de la conséquence de la cueillette de cerises dans ce post:
"Tirer tous les commits d'une branche, pousser les commits spécifiés à l'autre", où:

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

devient:

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

Le problème avec cette validation est que git considère commits pour inclure toute l'histoire avant eux

Où C 'a un différent SHA-1 ID.
  De même, cerise choisir un commit d'une branche à l'autre implique essentiellement de générer un patch, puis de l'appliquer, perdant ainsi l'histoire de cette façon.

Ce changement d'ID de commit brise la fonctionnalité de fusion de git entre autres choses (bien que si utilisé avec parcimonie il y ait des heuristiques qui écraseront cela).
  Plus important encore, il ignore les dépendances fonctionnelles - si C réellement utilisé une fonction définie dans B, vous ne saurez jamais.


958
2018-05-19 05:35



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

Exemple: git cherry-pick d42c389f


528
2018-05-19 05:35



Essayons de prendre un exemple et de comprendre:

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

Y <commit-id> = commise de branche <master> - peu de validations

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. Tout nom peut être donné.

Étape 2:

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

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 ligne provenant de la plupart des <n> validations réelles qui sont fusionnées.

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

git merge --help

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

git cherry-pick <commit-id>

13
2018-05-27 05:29