Git Cherry-Pick funktioniert nicht

110

Ich versuche, ein Commit vom Master auszuwählen und es in den aktuellen Produktionszweig zu bringen. Wenn ich jedoch ausführe git cherry-pick <SHA-hash>, erhalte ich nur die folgende Meldung:

# On branch prod_20110801
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#   site/test-result/
 nothing added to commit but untracked files present (use "git add" to track)
 The previous cherry-pick is now empty, possibly due to conflict resolution.
If you wish to commit it anyway, use:

    git commit --allow-empty

Otherwise, please use 'git reset'

Hinweis: Ich habe versucht, einen Reset und einen Reset durchzuführen - hard HEAD ^, und keiner schien etwas zu ändern.

Ich bin verwirrt, warum das bei mir nicht funktioniert.

Alle Einsichten, Ratschläge oder Ideen zur Lösung dieses Problems wären hilfreich ~!

Jay Taylor
quelle
Dies geschah bei mir, als ich versehentlich versuchte, das falsche Commit auszuwählen. Passiert manchmal bei der Verwendung von Gitk.
cst1992

Antworten:

141

Git löst den Cherry-Pick als No-Op auf - alle durch dieses Commit eingeführten Änderungen wurden durch ein Commit in Ihrem aktuellen Zweig eingeführt. (Oder Git denkt das jedenfalls.) Stellen Sie sicher, dass das Commit, das Sie auswählen, noch nicht irgendwie zusammengeführt wurde, entweder als ordnungsgemäßes Zusammenführen, Rebase / Cherry-Pick oder als Stückchen-Patch. (Verwenden Sie git show <commit-id>, um den Unterschied zu sehen.)

cdhowie
quelle
16
Vielen Dank für Ihren Rat, es stellte sich heraus, dass die Kirschernte bereits stattgefunden hatte und ich sie nur auf Github schieben musste.
Jay Taylor
Richtig, ich wusste nicht, dass der Inhalt der Dateien mit der Commit-ID überprüft wurde. Ich habe nach der Commit-ID im Protokoll gesucht und konnte sie nicht finden. es stellte sich heraus, dass es bereits zusammengeführt wurde.
mparaz
Leider ist dies nicht der einzige fragliche Grund. Ich habe genau die gleiche Situation, als ich ein Commit hatte, das ein früheres Commit rückgängig macht, und als ich es in einem anderen Zweig ausgewählt habe, in der Geschichte wurden diese Änderungen nicht rückgängig gemacht (dh ich habe dieses zurückgesetzte Commit nicht ausgewählt) ). Das ist natürlich meine Schuld. In diesem Fall wird jedoch erwartet, dass Git mit dem Konfliktstatus fehlschlägt, anstatt zu klug zu sein, was zu einem verwirrten Benutzer führt.
Artem Pisarenko
Dies kann passieren, wenn Sie ein Zusammenführungs-Commit zurücksetzen und sich das Commit, das ausgewählt werden soll, im zurückgesetzten Zweig befindet.
Matt
11

In meinem Fall hat mich das verrückt gemacht, da es ziemlich offensichtlich war, dass das spezifische Commit, das ich auswählen wollte, nicht in meinem aktuellen Zweig zusammengeführt wurde.

Es stellte sich heraus, dass jemand bereits eine Woche zuvor das Commit ausgewählt hatte. Die Änderungen , aber nicht die spezifische SHA, befanden sich bereits in meiner aktuellen Niederlassung, und ich hatte sie nicht bemerkt.

Überprüfen Sie die Datei (en), die Sie auswählen möchten. Wenn die Änderungen bereits vorhanden sind, wurde bereits eine Version des Commits ausgewählt oder auf andere Weise hinzugefügt. Es besteht also keine Notwendigkeit, es erneut zu pflücken.

pkamb
quelle
Ich bin mir ziemlich sicher, dass das spezifische Commit nie in Ihrer Branche ist, als es von einem Kirschpickel eingebracht wurde, weil der Kirschpickel ein neuer Hash sein wird, oder? Oder verstehe ich falsch?
msouth
@msouth Was ich ursprünglich von anderen Antworten weggenommen habe, war "das Commit wurde bereits zusammengeführt", aber ich konnte sehen, dass es nicht in meiner Filiale war. Sie haben Recht damit, dass Cherry Pick immer ein neuer SHA ist.
Pkamb
Ja, ich dachte "das spezifische Commit, wie es durch den Hash identifiziert wird", als ich das tippte. Meine Sprache war ungenau. Ich schaue oft durch die Ausgabe von zurück, um git log --graph --pretty --decorate --onelinezu sehen, ob sich ein bestimmter SHA in meiner Niederlassung befindet oder nicht. In meiner Antwort unten erfahren Sie, wie Sie auch durcheinander geraten können, wenn Sie glauben, dass die Commit-Nachricht auf die Änderung hinweist. Es gibt eine Situation, in der dies nicht der Fall ist, und das hat mich ursprünglich zu dieser Frage geführt. Das Gehirn neigt dazu, diese Abkürzungen zu machen, und sie können gelegentlich zurückkommen, um dich zu beißen.
msouth
6

Beachten Sie auch, dass das Hinzufügen einer leeren Datei (z. B. .gitkeep) zum Baum von Cherry-Pick als leeres Commit betrachtet wird.

Neamar
quelle
In meinem Fall hatte ich vor meinem Cherry-Pick-Versuch ein Revert-Commit (das selbst ein leeres Commit zurückgesetzt hat). Ich denke also, dass alles, was leer ist, wahrscheinlich dazu führen wird, dass diese Meldung angezeigt wird.
lidkxx
3

Also, hier ist noch eine andere verwirrende Situation, in der dies auftreten kann: Ich hatte Folgendes:

Git Log Screenshot

Ich habe versucht, 9a7b12e auszuwählen, was anscheinend nichts ist - es hat sogar versucht, mir in dieser Zeile in der Git-Protokollausgabe zu sagen, dass 4497428 das war, was ich wirklich wollte. (Was ich getan habe, war nur nach der Commit-Nachricht zu suchen und den ersten Hash zu greifen, den ich gesehen habe). Wie auch immer, ich möchte nur die Leute wissen lassen, dass es einen anderen Weg gibt, wie man dazu verleitet werden kann, einen No-Op zu wählen.

msouth
quelle
10
Es ist nicht sehr hilfreich für Sie, ohne Erklärung abzustimmen - dies ist die genaue Reproduktion eines Problems, das dazu führte, dass ich diese Frage bei meiner Suche fand. Wenn Sie eine Empfehlung zur Verbesserung haben, teilen Sie mir dies bitte in Kommentaren mit, anstatt nur abzustimmen.
msouth