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.
Antworten:
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, habengit checkout zebra
Sie zu dem Status gewechselt, in dem Sie zuletzt das letzte Mal abgerufen haben. Also zuerst von der Fernbedienung holen:quelle
Nur als Nachtrag zu OP akzeptierte Antwort:
Wenn Sie Probleme mit haben
Das liegt daran, dass Sie keinen Zugriff auf dieses Commit haben. Das heißt, Sie haben dieses Repo nicht lokal gespeichert. Dann:
Wobei xxxxxxx der gewünschte Commit-Hash ist.
quelle
Hinzufügen eines Remote-Repos (als "foo"), aus dem wir auswählen möchten
Hol ihre Zweige
Listen Sie ihre Commits auf (dies sollte alle Commits im abgerufenen auflisten
foo
)Wählen Sie das Commit aus, das Sie benötigen
quelle
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.
quelle
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 (-)
quelle
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.
quelle
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.quelle
Dies kann auch leicht mit SourceTree erreicht werden:
getan :)
quelle
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:
git checkout xxxxx
git checkout -b temp-branch
Dann holen Sie in Ihrem Repo noch einmal. Der neue Zweig wird einschließlich dieses Commits abgerufen.
quelle
Ich habe dieses Problem gelöst, indem ich mit dem Commit, das ich auswählen möchte, in den Zweig gegangen bin.
Verwenden Sie das Protokoll, um den Commit-Hash zu finden
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.
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."
quelle