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.
Respostas:
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 zebra
mudou para qualquer estado do ramo que foi a última vez que buscou. Então, busque no controle remoto primeiro:fonte
Assim como um adendo ao OP, a resposta aceita:
Se você estiver tendo problemas com
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:
Onde xxxxxxx é o hash de confirmação que você deseja.
fonte
Adicionando repositório remoto (como "foo") a partir do qual queremos escolher
Buscar seus galhos
Listar seus commits (isso deve listar todos os commits no buscado
foo
)Escolha a confirmação que você precisa
fonte
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".
fonte
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 (-)
fonte
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.
fonte
O commit deve estar presente no seu local, verifique usando
git log
.Se a confirmação não estiver presente, tente
git fetch
atualizar o local com o controle remoto mais recente.fonte
Isso também pode ser facilmente alcançado com o SourceTree:
feito :)
fonte
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:
git checkout xxxxx
git checkout -b temp-branch
Em seu repo, busque novamente. A nova ramificação será buscada, incluindo essa confirmação.
fonte
Resolvi esse problema indo para o ramo com o commit que eu quero escolher.
use log para encontrar o hash de confirmação
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.
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."
fonte