Como escolher cereja de uma filial remota?

135

Estou tendo problemas para executar uma escolha de cerejeira. Na minha máquina local, atualmente estou no meu ramo "mestre". Quero escolher cereja em um commit de outro ramo, chamado "zebra". O ramo "zebra" é um ramo remoto.

Então, status git:

# On branch master
nothing to commit (working directory clean)

Ok, agora eu tento escolher o commit que eu quero:

git cherry-pick xyz
fatal: bad object xyz

onde "xyz" é a assinatura do commit no qual estou interessado, que aconteceu no ramo "zebra".

Portanto, a primeira pergunta óbvia é: por que o git não consegue encontrar o commit que estou referenciando? Eu realmente não entendo como isso está funcionando, em primeiro lugar, para ser honesto. O git armazena algo como um banco de dados de confirmações localmente no meu diretório de trabalho, para todos os outros ramos? Ao executar o comando cherry-pick, ele pesquisa o banco de dados local para encontrar o commit que estou falando?

Como "zebra" é uma ramificação remota, eu estava pensando que não tinha seus dados localmente. Então eu troquei ramos:

git checkout zebra
Switched to branch 'zebra'

Portanto, agora na minha máquina local, posso ver que os arquivos no diretório refletem o estado da zebra corretamente. Volto ao master, tento escolher novamente (esperando que os dados de confirmação estejam disponíveis agora), mas recebo o mesmo problema.

Eu tenho um mal-entendido fundamental sobre o que está acontecendo aqui, qualquer ajuda seria ótima.

user291701
fonte
2
conceitualmente, tudo parece certo. tem certeza de que está usando o hash correto (assinatura como você chama) da confirmação? tente 'git show <hash>' para verificar.
0xc0de
Oi, sim positivo - ambos os meus ramos estão no github, e eu posso usá-los para encontrar as páginas de confirmação dessa maneira. Se eu entendi, o estado da minha máquina localmente é tal que o git não consegue encontrar o hash da 'zebra' enquanto estiver no contexto de 'master'. De alguma forma, preciso dizer que a 'zebra' existe localmente também?
usar o seguinte comando
ah e fazer 'git show xyz' dá o mesmo erro "fatal: objeto ruim". (e estou substituindo xyz pelo hash correto).
usar o seguinte comando
E para esclarecer, eu posso usar meu hash 'xyz' para examinar o commit no github sem problemas, como: " github.com/me/test/commit/xyz ".
usar o seguinte comando

Respostas:

195

Como "zebra" é uma ramificação remota, eu estava pensando que não tinha seus dados localmente.

Você está certo de que não possui os dados corretos, mas tentou resolvê-los da maneira errada. Para coletar dados localmente de uma fonte remota, você precisa usar git fetch. Quando você git checkout zebramudou para qualquer estado do ramo que foi a última vez que buscou. Então, busque no controle remoto primeiro:

# fetch just the one remote
git fetch <remote>
# or fetch from all remotes
git fetch --all
# make sure you're back on the branch you want to cherry-pick to
git cherry-pick xyz
Peter Lundgren
fonte
1
Link arquivado: archive.miek.nl/blog/archives/2011/12/13/…
brianpeiris
1
Tentei essa abordagem para escolher uma correção upstream no Github e verificamos que o hash do check-out era diferente daquele no Github. Portanto, eu tive que verificar, pegar o hash e escolher a cereja.
DustWolf
1
Realmente faltando aqui uma opção para passar remotamente em cherry-pick como: git cherry-pick <remote> <hash>
Jared
funcionou bem depois de buscar a ramificação remota. Obrigado :)
Adeel
sim funcionou depois de buscar para mim também. Mais informações sobre o git cherry-pick estão disponíveis em atlassian.com/git/tutorials/cherry-pick
M
12

Assim como um adendo ao OP, a resposta aceita:

Se você estiver tendo problemas com

fatal: bad object xxxxx

isso é porque você não tem acesso a esse commit. O que significa que você não tem esse repositório armazenado localmente. Então:

git remote add LABEL_FOR_THE_REPO REPO_YOU_WANT_THE_COMMIT_FROM
git fetch LABEL_FOR_THE_REPO
git cherry-pick xxxxxxx

Onde xxxxxxx é o hash de confirmação que você deseja.

Cezar Augusto
fonte
hmm quando eu já adicionei o repo sem a bandeira upstream?
precisa
10

Adicionando repositório remoto (como "foo") a partir do qual queremos escolher

$ git remote add foo git://github.com/foo/bar.git

Buscar seus galhos

$ git fetch foo

Listar seus commits (isso deve listar todos os commits no buscado foo)

$ git log foo/master

Escolha a confirmação que você precisa

$ git cherry-pick 97fedac
Muhammad Soliman
fonte
5

Depois de mesclar um ramo de desenvolvimento ao mestre, geralmente excluo o ramo de desenvolvimento. No entanto, se eu quiser escolher as confirmações no ramo de desenvolvimento, preciso usar o hash de confirmação de mesclagem para evitar o erro "objeto ruim".

Juuso Ohtonen
fonte
3

Precisa puxar os dois dados da filial em sua unidade local primeiro.

O que está acontecendo é a sua tentativa de escolher cereja do ramo-a para o ramo-b, onde você está atualmente no ramo-b, mas a cópia local do ramo-a ainda não foi atualizada (você precisa executar um git pull ambos os ramos primeiro).

etapas:
- git checkout branch-a
- git pull branch branch-a
- git checkout branch-b
- git pull origin branch-b
- git cherry-pick <hash>

saída:
dados do log [branch-b <hash>]
Autor: Autor <
Arquivo do autor 1 alterado, 1 inserção (+), 3 exclusões (-)

temyong
fonte
1

Eu recebi esse erro depois de usar o ID de confirmação de uma guia de ID de confirmação de solicitação de recebimento. Esse commit foi posteriormente esmagado e mesclado. Na solicitação pull do github, procure este texto: "consolidação consolidada xxxxxxx em ..." em vez de tentar usar os IDs de consolidação na guia de consolidação.

Maria
fonte
1

O commit deve estar presente no seu local, verifique usando git log.

Se a confirmação não estiver presente, tente git fetchatualizar o local com o controle remoto mais recente.

Kuldeep Saxena
fonte
0

Isso também pode ser facilmente alcançado com o SourceTree:

  • confira seu ramo principal
  • abra a guia "Log / Histórico"
  • localize o commit xyz e clique com o botão direito nele
  • clique em "Mesclar ..."

feito :)

Giona
fonte
Isto está incorreto. Porque agora você está mesclando o HEAD do master na zebra, em vez de apenas nas confirmações selecionadas.
Chef Faraó
0

Se você buscou, ainda assim isso acontece, o seguinte pode ser um motivo.

Pode acontecer que o commit que você está tentando escolher, não pertença mais a nenhum ramo. Isso pode acontecer quando você se refaz.

Nesse caso, no repositório remoto:

  1. git checkout xxxxx
  2. git checkout -b temp-branch

Em seu repo, busque novamente. A nova ramificação será buscada, incluindo essa confirmação.

lulalala
fonte
0

Resolvi esse problema indo para o ramo com o commit que eu quero escolher.

git checkout <branch With Commit To Cherry-Pick>

use log para encontrar o hash de confirmação

git log

quando você encontrar seu hash, recorte e cole no bloco de notas. se estiver usando o comando, role para cima para obter o hash e faça o checkout do ramo em que você deseja colocar o commit.

git checkout < branch I Want To Place My Cherry-Picked-Hash In>

por fim, chame cherry-pick do git (note) -x é anexar sua mensagem de cherry-pick ao original. "Ao gravar o commit, anexe uma linha que diz" (cereja escolhida no commit ...) "à mensagem de commit original para indicar de qual commit essa alteração foi escolhida."

git cherry-pick -x <your hash commit to add to the current branch>
RVscript
fonte