Wie kann man aus einem entfernten Zweig Kirschen pflücken?

135

Ich habe Probleme, einen Kirschpickel auszuführen. Auf meinem lokalen Computer bin ich derzeit in meinem "Master" -Zweig. Ich möchte ein Commit aus einem anderen Zweig namens "Zebra" auswählen. Der "Zebra" -Zweig ist ein entfernter Zweig.

Also git status:

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

Ok, jetzt versuche ich, das gewünschte Commit auszuwählen:

git cherry-pick xyz
fatal: bad object xyz

Dabei ist "xyz" die Signatur des Commits, an dem ich interessiert bin, das auf dem Zweig "Zebra" passiert ist.

Die erste offensichtliche Frage ist also, warum Git das Commit, auf das ich mich beziehe, nicht finden kann. 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? Wird beim Ausführen des Befehls cherry-pick die lokale Datenbank durchsucht, um das Commit zu finden, von dem ich spreche?

Da "Zebra" ein entfernter Zweig ist, dachte ich, ich habe seine Daten nicht lokal. Also habe ich die Filialen gewechselt:

git checkout zebra
Switched to branch 'zebra'

Jetzt kann ich hier auf meinem lokalen Computer sehen, dass die Dateien im Verzeichnis den Status von Zebra korrekt wiedergeben. Ich wechsle zurück zum Master und versuche erneut, die Auswahl zu treffen (in der Hoffnung, dass die Festschreibungsdaten jetzt verfügbar sind), aber ich habe das gleiche Problem.

Ich habe ein grundlegendes Missverständnis darüber, was hier vor sich geht. Jede Hilfe wäre großartig.

user291701
quelle
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 <hash>', um dies zu überprüfen.
0xc0de
Hallo, ja positiv - meine beiden Filialen sind auf Github und ich kann sie verwenden, um die Commit-Seiten auf diese Weise zu finden. Wenn ich das verstehe, ist der Zustand meiner Maschine lokal so, dass Git den Hash von 'Zebra' im Kontext von 'Master' nicht finden kann. Muss ich irgendwie sagen, dass 'Zebra' auch lokal existiert?
user291701
oh und 'git show xyz' macht den gleichen Fehler "fatal: bad object". (und ich ersetze xyz durch den richtigen Hash).
user291701
Und um das zu verdeutlichen, kann ich meinen 'xyz'-Hash verwenden, um das Commit auf Github ohne Probleme zu betrachten, wie zum Beispiel: " github.com/me/test/commit/xyz ".
user291701

Antworten:

194

Da "Zebra" ein entfernter Zweig ist, dachte ich, ich habe seine Daten nicht lokal.

Sie haben Recht, dass Sie nicht die richtigen Daten haben, aber versucht haben, sie falsch aufzulösen. Um Daten lokal von einer Remote-Quelle zu erfassen, müssen Sie verwenden git fetch. Als Sie dies getan haben, haben git checkout zebraSie zu dem Status gewechselt, in dem Sie zuletzt das letzte Mal abgerufen haben. Also zuerst von der Fernbedienung holen:

# 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
quelle
1
Archivierter Link: archive.miek.nl/blog/archives/2011/12/13/…
Brianpeiris
1
Versuchte diesen Ansatz, um einen Upstream-Fix für Github auszuwählen, und es stellte sich heraus, dass sich der ausgecheckte Hash von dem für Github unterschied. Deshalb musste ich auschecken, mir den Hasch holen und das herauspicken.
DustWolf
1
Hier fehlt wirklich eine Option, um Remote in Cherry-Pick wie zu übergeben: Git Cherry-Pick <remote> <hash>
Jared
funktionierte gut nach dem Abrufen des Remote-Zweigs. Danke :)
Adeel
ja hat nach dem holen auch für mich gearbeitet. Weitere Informationen zu
Satheesh M
12

Nur als Nachtrag zu OP akzeptierte Antwort:

Wenn Sie Probleme mit haben

fatal: bad object xxxxx

Das liegt daran, dass Sie keinen Zugriff auf dieses Commit haben. Das heißt, Sie haben dieses Repo nicht lokal gespeichert. Dann:

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

Wobei xxxxxxx der gewünschte Commit-Hash ist.

Cezar Augusto
quelle
hmm als ich das repo schon ohne das upstream flag hinzugefügt habe?
Gobliins
10

Hinzufügen eines Remote-Repos (als "foo"), aus dem wir auswählen möchten

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

Hol ihre Zweige

$ git fetch foo

Listen Sie ihre Commits auf (dies sollte alle Commits im abgerufenen auflisten foo)

$ git log foo/master

Wählen Sie das Commit aus, das Sie benötigen

$ git cherry-pick 97fedac
Muhammad Soliman
quelle
5

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.

Juuso Ohtonen
quelle
3

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

Was passiert, ist Ihr Versuch, von Zweig-a zu Zweig-b zu wechseln, wo Sie sich gerade in Zweig-b befinden, aber die lokale Kopie von Zweig-a ist noch nicht aktualisiert (Sie müssen einen Git-Pull-On durchführen beide Zweige zuerst).

Schritte:
- Git Checkout-Zweig-a
- Git-Pull-Ursprungszweig-a
- Git-Checkout-Zweig-b
- Git-Pull-Ursprungszweig-b
- Git-Cherry-Pick <Hash>

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

Temyong
quelle
1

Ich habe diesen Fehler zurückgeben lassen, nachdem ich die Festschreibungs-ID von einer Registerkarte für die Festschreibungs-ID für Pull-Anforderungen verwendet habe. Dieses Commit wurde anschließend gequetscht und zusammengeführt. Suchen Sie in der Github-Pull-Anforderung nach diesem Text: "Commit xxxxxxx zusammengeführt in ...", anstatt zu versuchen, die Commit-IDs auf der Registerkarte Commits zu verwenden.

Maria
quelle
1

Das Commit sollte in Ihrer Region vorhanden sein. Überprüfen Sie dies mit git log.

Wenn das Commit nicht vorhanden ist, versuchen Sie git fetch, das lokale mit der neuesten Fernbedienung zu aktualisieren.

Kuldeep Saxena
quelle
0

Dies kann auch leicht mit SourceTree erreicht werden:

  • Kasse deine Hauptniederlassung
  • Öffnen Sie die Registerkarte "Protokoll / Verlauf"
  • Suchen Sie das xyz-Commit und klicken Sie mit der rechten Maustaste darauf
  • Klicken Sie auf "Zusammenführen ..."

getan :)

Giona
quelle
Das ist falsch. Denn jetzt verschmelzen Sie den HEAD of Master mit dem Zebra anstatt nur mit ausgewählten Commits.
Chef Pharao
0

Wenn Sie abgerufen haben und dies dennoch geschieht, kann Folgendes der Grund sein.

Es kann vorkommen, dass das Commit, das Sie auswählen möchten, nicht mehr zu einem Zweig gehört. Dies kann beim Rebase passieren.

In diesem Fall beim Remote-Repo:

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

Dann holen Sie in Ihrem Repo noch einmal. Der neue Zweig wird einschließlich dieses Commits abgerufen.

lulalala
quelle
0

Ich habe dieses Problem gelöst, indem ich mit dem Commit, das ich auswählen möchte, in den Zweig gegangen bin.

git checkout <branch With Commit To Cherry-Pick>

Verwenden Sie das Protokoll, um den Commit-Hash zu finden

git log

Wenn Sie Ihren Hash gefunden haben, schneiden Sie ihn aus und fügen Sie ihn auf dem Notizblock ein. Wenn Sie den Befehl verwenden, scrollen Sie einfach nach oben, um den Hash zu erhalten, und checken Sie dann den Zweig aus, in dem Sie das Commit platzieren möchten.

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

Rufen Sie schließlich Cherry-Pick von Git (Hinweis) -x auf, um Ihre Cherry-Pick-Nachricht an das Original anzuhängen. "Fügen Sie beim Aufzeichnen des Commits eine Zeile mit der Aufschrift" (Kirsche aus Commit ausgewählt ...) "an die ursprüngliche Commit-Nachricht an, um anzugeben, aus welchem ​​Commit diese Änderung ausgewählt wurde."

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