Come scegliere una ciliegia da un ramo remoto?


135

Sto riscontrando problemi nell'eseguire una scelta della ciliegia. Sul mio computer locale, sono attualmente nel mio ramo "master". Voglio scegliere una commessa da un altro ramo, chiamato "zebra". Il ramo "zebra" è un ramo remoto.

Quindi stato git:

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

Ok, ora provo a scegliere il commit che voglio:

git cherry-pick xyz
fatal: bad object xyz

dove "xyz" è la firma del commit che mi interessa, che si è verificato sul ramo "zebra".

Quindi la prima domanda ovvia è: perché non riesco a trovare il commit a cui mi riferisco? In realtà non capisco come stia funzionando, per essere onesti. Git memorizza qualcosa come un database di commit localmente nella mia directory di lavoro, per tutti gli altri rami? Quando si esegue il comando cherry-pick, va e cerca quel database locale per trovare il commit di cui sto parlando?

Dato che "zebra" è un ramo remoto, stavo pensando di non avere i suoi dati localmente. Quindi ho cambiato filiale:

git checkout zebra
Switched to branch 'zebra'

Quindi ora qui sul mio computer locale, posso vedere che i file nella directory riflettono correttamente lo stato di zebra. Torno al master, provo di nuovo a scegliere ciliegia (sperando che i dati di commit siano ora disponibili), ma ottengo lo stesso problema.

Ho un fraintendimento fondamentale di quello che sta succedendo qui, qualsiasi aiuto sarebbe grande.


2
concettualmente tutto sembra giusto. sei sicuro di utilizzare l'hash corretto (firma mentre lo chiami) del commit? prova 'git show <hash>' per verificare.
0xc0de,

Ciao, sì, positivo: entrambi i miei rami sono su github e posso usarli per trovare le pagine di commit in quel modo. Se ho capito, lo stato della mia macchina localmente è tale che git non riesce a trovare l'hash da 'zebra' mentre si trova nel contesto di 'master'. Devo in qualche modo dirlo che anche la "zebra" esiste localmente?
user291701

oh, e facendo 'git show xyz' si ottiene lo stesso errore "fatale: oggetto cattivo". (e sto sostituendo xyz con l'hash corretto).
user291701

E per chiarire, posso usare il mio hash 'xyz' per guardare il commit su github senza problemi, come: " github.com/me/test/commit/xyz ".
user291701

Risposte:


195

Dato che "zebra" è un ramo remoto, stavo pensando di non avere i suoi dati localmente.

Hai ragione a dire che non hai i dati giusti, ma hai provato a risolverli nel modo sbagliato. Per raccogliere dati localmente da una fonte remota, è necessario utilizzare git fetch. Quando lo hai fatto, git checkout zebrasei passato a qualunque sia stato lo stato di quel ramo l'ultima volta che hai recuperato. Quindi, prima scarica dal telecomando:

# 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


1
Ho provato questo approccio per scegliere una correzione a monte su Github e si è scoperto che l'hash del check-out era diverso da quello su Github. Quindi ho dovuto fare il check-out, ottenere l'hash e scegliere ciliegia.
DustWolf

1
Manca davvero un'opzione per passare il telecomando in cherry-pick come: git cherry-pick <remote> <hash>
Jared,

ha funzionato bene dopo aver recuperato il ramo remoto. Grazie :)
Adeel,

sì, ha funzionato dopo aver recuperato anche per me. Maggiori informazioni su git cherry-pick sono disponibili su atlassian.com/git/tutorials/cherry-pick
Satheesh M

12

Proprio come un addendum alla risposta accettata dall'OP:

Se hai problemi con

fatal: bad object xxxxx

questo perché non hai accesso a quel commit. Ciò significa che non hai quel repository archiviato localmente. Poi:

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

Dove xxxxxxx è l'hash di commit desiderato.


hmm quando ho già aggiunto il repository senza la bandiera upstream?
Gobliins,

10

Aggiunta di repository remoti (come "pippo") da cui vogliamo scegliere

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

Prendi i loro rami

$ git fetch foo

Elenca i loro commit (questo dovrebbe elencare tutti i commit nel recuperato foo)

$ git log foo/master

Scegli il commit di cui hai bisogno

$ git cherry-pick 97fedac

5

Dopo aver unito un ramo di sviluppo al master, di solito elimino il ramo di sviluppo. Tuttavia, se voglio selezionare i commit nel ramo di sviluppo, devo usare l' hash di commit merge per evitare l'errore "bad object".


3

È necessario prima estrarre entrambi i dati del ramo sull'unità locale.

Quello che sta succedendo è il tuo tentativo di scegliere da branch-a a branch-b, dove al momento sei su branch-b, ma la copia locale di branch-a non è ancora stata aggiornata (devi eseguire un pull git su prima entrambi i rami).

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

output:
[branch-b <hash>] log data
Autore: Autore <Autore
1 file modificato, 1 inserimento (+), 3 eliminazioni (-)


1

Ho restituito questo errore dopo aver utilizzato l'id commit da una scheda ID commit richiesta pull. Tale commit è stato successivamente eliminato e unito. Nella richiesta pull di github, cerca questo testo: "unisci commit xxxxxxx in ..." invece di tentare di usare gli ID commit dalla scheda commit.


1

Il commit dovrebbe essere presente nel tuo locale, controlla usando git log.

Se il commit non è presente, prova git fetchad aggiornare il locale con il telecomando più recente.


0

Questo può anche essere facilmente raggiunto con SourceTree:

  • controlla la tua filiale principale
  • aprire la scheda "Registro / Cronologia"
  • trova il commit xyz e fai clic destro su di esso
  • fai clic su "Unisci ..."

fatto :)


Questo non è corretto Perché ora stai unendo la TESTA del maestro in zebra invece di solo commit selezionati.
Chef Faraone,

0

Se hai recuperato, ma ciò accade ancora, potrebbe essere un motivo il seguente.

Può accadere che il commit che stai tentando di selezionare non appartenga più a nessun ramo. Questo può accadere quando ti ribassi.

In tal caso, nel repository remoto:

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

Quindi nel tuo repository, recupera di nuovo. Verrà recuperato il nuovo ramo, incluso quel commit.


0

Ho risolto questo problema andando sul ramo con l'impegno che voglio scegliere.

git checkout <branch With Commit To Cherry-Pick>

usa il registro per trovare l'hash di commit

git log

quando hai trovato il tuo hash taglia e incolla sul blocco note. se usando il comando basta scorrere verso l'alto per ottenere l'hash, quindi controllare il ramo in cui si desidera effettuare il commit.

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

infine, chiamare cherry-pick da git (note) -x è aggiungere il messaggio di cherry-pick all'originale. "Quando registri il commit, aggiungi una riga che dice" (cherry scelto da commit ...) "al messaggio di commit originale al fine di indicare da quale commit è stata selezionata questa modifica."

git cherry-pick -x <your hash commit to add to the current branch>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.