Eu tenho um repo1
e repo2
na máquina local. Eles são muito semelhantes, mas o último é algum tipo de outro ramo ( repo1
não é mais mantido).
/path/to/repo1 $ git log HEAD~5..HEAD~4
<some_sha> Add: Introduce feature X
Como aplicar as alterações feitas por cometer <some_sha>
em repo1
que repo2
?
Preciso preparar algum patch ou é possível fazer algum cherry-pick
entre os repositórios?
Que tal fazer o mesmo, mas por intervalo de commits?
Respostas:
Como um hack, você pode tentar modificar a receita para comparar commits em dois repositórios diferentes na página GitTips , ou seja:
onde
../repo
é o caminho para o outro repositório.Com o Git moderno, você pode usar várias revisões e intervalos de revisão com a escolha certa .
O
$(git --git-dir=../repo/.git rev-parse --verify <commit>)
está aqui para traduzir<commit>
(por exemploHEAD
, ouv0.2
, oumaster~2
, que são valores no segundo repositório do qual você copiou) no identificador SHA-1 de confirmação. Se você conhece o SHA-1 de uma alteração que deseja escolher, não é necessário.NOTE, entretanto, que o Git pode pular a cópia de objetos do repositório de origem, pois ele não sabe que o repositório de objetos alternativos é apenas temporário, para uma operação. Pode ser necessário copiar objetos do segundo repositório com:
Isso coloca os objetos emprestados do segundo repositório no armazenamento do repositório original
Não testado.
Uma solução não tão hacky é seguir a resposta knittl :
git format-patch
git am --3way
para aplicar patchesfonte
fatal: unable to read tree ...
mas depois quegit reset HEAD^
tudo funcionar bem<commit>
mas orev-parse --verify
comando não gosta, pois aceita apenas valores de confirmação únicos. Mas comocherry-pick
aceita valores de commit único e de intervalo, pergunto: por que érev-parse
necessário?git rev-parse
é necessário se você quiser para se referir a uma submissão pelo seu nome à base de ref em outro repositório, por exemplomaster
,HEAD^^
ou algo assim; rev-parse o transforma em identificador SHA-1 universal.Você provavelmente deseja usar
git format-patch
egit am
aplicar esse patch ao seu repositório.Ou, em uma linha:
fonte
GIT_ALTERNATE_OBJECT_DIRECTORIES
(isso corromperia meu repositório).--ignore-whitespace
aogit am
comando pode resolver quaisquer conflitos e evitar a necessidade de realizar uma fusão de 3 viasVocê pode fazer
cherry-pick
se adicionar o segundo repo como remoto ao primeiro (e depoisfetch
).fonte
git fetch [remote-name]
no segundo repo e depoisgit cherry-pick [sha1]
.cherry-pick
. Portanto, embora possa parecer a maneira "certa", nem sempre é a mais prática.Eu escrevi um pequeno script para aplicar a saída diff do diff do repo https://github.com/raghakh/android-dev-scripts/commit/a57dcba727d271bf2116f981392b0dcbb22734d0
fonte