2012-12-09 13 views
68

Ich habe Schwierigkeiten, eine Kirsche-Auswahl durchzuführen. Auf meinem lokalen Rechner bin ich momentan in meiner "Master" Filiale. Ich möchte ein Commit von einem anderen Zweig namens "Zebra" auswählen. Der Zweig "Zebra" ist eine entfernte Filiale.Wie kann man aus einer entfernten Niederlassung wählen?

so git status:

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

ok, ich versuche jetzt herauspicken die befehle ich will:

git cherry-pick xyz 
fatal: bad object xyz 

wo "xyz" ist die Unterschrift des commit Ich bin interessiert in, das ist auf dem Zweig "Zebra" geschehen.

Also die erste offensichtliche Frage ist, warum kann git das Commit nicht finden, das ich verweise? Ich verstehe nicht wirklich, wie das überhaupt funktioniert, um ehrlich zu sein. Speichert git so etwas wie eine Datenbank mit Commits lokal in meinem Arbeitsverzeichnis, für alle anderen Zweige? Wenn Sie den Befehl cherry-pick ausführen, wird die lokale Datenbank durchsucht, um das Commit zu finden, von dem ich spreche?

Da "Zebra" eine entfernte Niederlassung ist, dachte ich, dass ich seine Daten nicht lokal habe. So wechselte ich Zweige:

git checkout zebra 
Switched to branch 'zebra' 

so jetzt hier auf meinem lokalen Rechner, kann ich sehen, dass die Dateien in dem Verzeichnis korrekt zerbra des Staates widerspiegeln. Ich wechsle zurück zum Master, versuche noch einmal zu picken (hoffe, dass die Commit-Daten jetzt verfügbar sind), aber ein Problem.

Ich habe ein grundlegendes Missverständnis von dem, was hier vorgeht, jede Hilfe wäre großartig.

+2

konzeptionell scheint alles richtig. Sind Sie sicher, dass Sie den richtigen Hash (Signatur, wie Sie ihn nennen) des Commits verwenden? Versuchen Sie 'git show ' zu überprüfen. – 0xc0de

+0

Hallo, ja, positiv - meine beiden Zweige sind auf Github, und ich kann sie verwenden, um die Commit-Seiten auf diese Weise zu finden. Wenn ich verstehe, ist der Zustand meiner Maschine lokal so, dass Git den Hash von "Zebra" nicht finden kann, während er im Kontext von "Master" ist. Muss ich irgendwie sagen, dass "Zebra" auch lokal existiert? – user291701

+0

oh und macht 'git show xyz' gibt den gleichen Fehler "fatal: bad object". (und ich ersetze xyz mit dem richtigen Hash). – user291701

Antwort

101

Da "Zebra" eine entfernte Niederlassung ist, dachte ich, dass ich seine Daten lokal nicht habe.

Sie haben Recht, dass Sie nicht die richtigen Daten haben, aber versucht haben, sie falsch zu lösen. Um Daten lokal von einer entfernten Quelle zu sammeln, müssen Sie git fetch verwenden. Wenn Sie git checkout zebra taten, wechselten Sie zu dem, was der Status des Zweigs beim letzten Mal war. Rufen Sie also zuerst von der Fernbedienung ab:

# 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 
+0

ausgezeichnet, sehr hilfreich, danke – PierrOz

+1

Archivierter Link: http://archive.miek.nl/blog/archives/2011/12/13/cherry-picking_remote_branches/index.html – brianpeiris

+0

schön, es hat auch für mich funktioniert, danke –

1

Sie müssen zuerst beide Zweigdaten auf Ihrem lokalen Laufwerk abrufen.

Was passiert, ist Ihr Versuch, von Branch-A zu Branch-B, wo Sie gerade auf Zweig-B, aber die lokale Kopie von Branch-A ist noch nicht aktualisiert (Sie müssen durchführen ein Git ziehen zuerst an beiden Zweigen).

Schritte:
- git Kasse branch-a
- git pull Ursprung Zweig-a
- git Kasse branch-b
- git pull Ursprung Zweig-b
- git < hash kirsch Pick >

output:
[branch-b <hash>] Logdaten
Autor: Autor < Autor
1 Datei geändert, 1 Einfügung (+), 3 Löschungen (-)

1

Nach dem Zusammenführen eines Entwicklungszweigs zum Master lösche ich normalerweise den Entwicklungszweig. Wenn ich jedoch die Commits im Entwicklungszweig auswählen möchte, muss ich den Merge Commit Hash verwenden, um den Fehler "Bad Object" zu vermeiden.

0

Dies kann auch leicht mit SourceTree erreicht werden:

  • Kasse Ihr Master-Zweig
  • die "Log/History" Tab öffnen
  • Suchen Sie die xyz begehen und einen Rechtsklick darauf
  • Klick auf "Merge ..."

:) getan

+0

Das ist falsch.Weil Sie nun HEAD of master in Zebra anstatt nur ausgewählte Commits zusammenführen. –

0

Gerade als ein Zusatz zur OP Antwort akzeptiert:

Wenn Sie Probleme mit

fatal: bad object xxxxx 

aufweist, ist, weil Sie Zugang haben nicht zu, dass begehen. Dies bedeutet, dass Sie dieses Repo nicht lokal gespeichert haben. Dann:

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

Wo xxxxxxx der Hash Sie begehen wollen.

+0

hmm, wenn ich bereits das Repo ohne das Upstream-Flag hinzugefügt habe? – Gobliins

0

Ich hatte diesen Fehler nach der Verwendung der Commit-ID aus einer Pull-Request-Commit-ID-Registerkarte zurückgegeben. Dieses Commit wurde anschließend gequetscht und verschmolzen. Suchen Sie in der Github-Pull-Anforderung nach folgendem Text: "fusion commit xxxxxxx in ...", anstatt zu versuchen, die Commit-IDs aus der Registerkarte commits zu verwenden.

Verwandte Themen