J'ai une machine locale repo1
et repo2
sur. Ils sont très similaires, mais ce dernier est une sorte d'autre branche ( repo1
n'est plus maintenue).
/path/to/repo1 $ git log HEAD~5..HEAD~4
<some_sha> Add: Introduce feature X
Comment appliquer les modifications apportées par engagement <some_sha>
dans repo1
la repo2
?
Dois-je préparer un patch, ou est-il possible d'en faire cherry-pick
entre les dépôts?
Que diriez-vous de faire la même chose mais pour une gamme de commits?
Réponses:
En guise de hack, vous pouvez essayer de modifier la recette pour comparer les commits dans deux référentiels différents sur la page GitTips , c'est-à-dire:
où
../repo
est le chemin vers l'autre référentiel.Avec Git moderne, vous pouvez utiliser plusieurs révisions et plages de révisions avec cherry-pick .
Le
$(git --git-dir=../repo/.git rev-parse --verify <commit>)
est là pour traduire<commit>
(par exempleHEAD
, ouv0.2
, oumaster~2
, qui sont des valeurs dans le deuxième référentiel à partir duquel vous copiez) en identifiant SHA-1 de commit. Si vous connaissez SHA-1 d'un changement que vous souhaitez sélectionner, ce n'est pas nécessaire.Notez cependant que Git peut ignorer la copie d'objets depuis le référentiel source, car il ne sait pas que le référentiel d'objets alternatifs n'est que temporaire, pour une opération. Vous devrez peut-être copier des objets du deuxième référentiel avec:
Cela place les objets empruntés au deuxième référentiel dans le stockage du référentiel d'origine
Pas testé.
Une solution pas si hacky est de suivre la réponse tricotée :
git format-patch
git am --3way
pour appliquer des correctifsla source
fatal: unable to read tree ...
mais aprèsgit reset HEAD^
tout fonctionne bien<commit>
mais larev-parse --verify
commande ne l'aime pas car elle n'accepte que des valeurs de validation uniques. Mais commecherry-pick
accepte les valeurs de validation simples et de plage, je demande: pourquoi est-ilrev-parse
nécessaire?git rev-parse
est nécessaire si vous voulez faire référence à un commit par son nom basé ref dans un autre dépôt, par exemplemaster
,HEAD^^
ou quelque chose comme ça; rev-parse le transforme en identifiant universel SHA-1.Vous voudrez probablement utiliser
git format-patch
puisgit am
appliquer ce correctif à votre référentiel.Ou, en une seule ligne:
la source
GIT_ALTERNATE_OBJECT_DIRECTORIES
(celle-ci corromprait mon référentiel).--ignore-whitespace
à lagit am
commande peut résoudre les conflits et éviter de devoir effectuer une fusion àVous pouvez le faire
cherry-pick
si vous ajoutez le deuxième dépôt en tant que distant au premier (puisfetch
).la source
git fetch [remote-name]
dans le deuxième repo et ensuitegit cherry-pick [sha1]
.cherry-pick
. Donc, même si cela peut sembler être la «bonne» façon, ce n'est pas toujours la plus pratique.J'ai écrit un petit script pour appliquer la sortie diff de repo diff https://github.com/raghakh/android-dev-scripts/commit/a57dcba727d271bf2116f981392b0dcbb22734d0
la source