Tengo un repo1
y repo2
en una máquina local. Son muy similares, pero esta última es algún tipo de otra rama ( repo1
ya no se mantiene).
/path/to/repo1 $ git log HEAD~5..HEAD~4
<some_sha> Add: Introduce feature X
¿Cómo aplicar los cambios realizados por commit <some_sha>
in repo1
a repo2
?
¿Necesito preparar algún parche o es posible hacerlo cherry-pick
entre los repositorios?
¿Qué tal hacer lo mismo pero para un rango de confirmaciones?
Respuestas:
Como truco, puede intentar modificar la receta para comparar confirmaciones en dos repositorios diferentes en la página de GitTips , es decir:
donde
../repo
es la ruta al otro repositorio.Con Git moderno, puede usar múltiples revisiones y rangos de revisión con selección de cerebros .
El
$(git --git-dir=../repo/.git rev-parse --verify <commit>)
está aquí para traducir<commit>
(por ejemploHEAD
, ov0.2
, omaster~2
, que son valores en el segundo depósito de la copia se realiza) en SHA-1 identificador de comprometerse. Si conoce SHA-1 de un cambio que desea elegir, no es necesario.TENGA EN CUENTA, sin embargo, que Git puede omitir la copia de objetos del repositorio de origen, ya que no sabe que el repositorio de objetos alternativo es solo temporal, para una operación. Es posible que deba copiar objetos del segundo repositorio con:
Esto coloca esos objetos prestados del segundo repositorio en el almacenamiento del repositorio original
No probado.
Una solución no tan hacky es seguir la respuesta de knittl :
git format-patch
git am --3way
para aplicar parchesfuente
fatal: unable to read tree ...
pero después de quegit reset HEAD^
todo funciona bien<commit>
pero alrev-parse --verify
comando no le gusta, ya que solo acepta valores de confirmación únicos. Pero comocherry-pick
acepta valores de compromiso únicos y de rango, pregunto: ¿por qué serev-parse
necesita?git rev-parse
es necesario si se desea hacer referencia a un compromiso por su nombre a base de referencia en otro depósito, por ejemplomaster
,HEAD^^
o algo por el estilo; rev-parse lo convierte en un identificador universal SHA-1.Probablemente desee utilizar
git format-patch
y luegogit am
aplicar ese parche a su repositorio.O, en una línea:
fuente
GIT_ALTERNATE_OBJECT_DIRECTORIES
(que corrompería mi repositorio).--ignore-whitespace
algit am
comando puede resolver cualquier conflicto y evitar la necesidad de realizar una combinación de 3 víasPuede hacerlo
cherry-pick
si agrega el segundo repositorio como remoto al primero (y luegofetch
).fuente
git fetch [remote-name]
en el segundo repositorio y luegogit cherry-pick [sha1]
.cherry-pick
. Entonces, aunque pueda parecer la forma "correcta", no siempre es la más práctica.Escribí un pequeño script para aplicar la salida diff de repo diff https://github.com/raghakh/android-dev-scripts/commit/a57dcba727d271bf2116f981392b0dcbb22734d0
fuente