Was genau macht git rebase --skip?

107

Ich habe gerade eine gemacht git pull --rebase origin master und es gab einen Konflikt.

Erstens befand sich dieser Konflikt in einer Datei, die ich nicht berührt hatte, und war ungefähr 10 Commits zurück. Warum passiert das?

Ich habe dann versehentlich getippt git rebase --skipund es hat diesen Patch übersprungen.

Besorgt darüber, dass ich ein Commit übersprungen hatte, überprüfte ich eine neue Version des Hauptzweigs und machte einen Unterschied zwischen dem Zweig, auf dem ich die Rebase durchgeführt hatte, und dem neuen Hauptzweig. Die einzigen Änderungen, die im Diff angezeigt werden, sind das letzte Festschreiben. Wenn Sie sich das Protokoll ansehen, wird der Patch, der übersprungen wurde, im Festschreibungsverlauf angezeigt.

Kann jemand erklären, was hier los ist?

mrwooster
quelle
11
Wie geben Sie versehentlich git rebase --skip. Vielleicht falsch? :)
Manojlds
3
Ha! Wollte --abort eingeben, aber aus einem unbekannten Grund kam es als --skip heraus. Ich habe nicht wirklich nachgedacht. :)
Mrwooster
9
Die Shell-Historie ist gut darin (damit Sie etwas ausführen, das Sie nicht wollten).
Florian Klein

Antworten:

60

Es macht das, was es sagt, es überspringt ein Commit. Wenn du läufstrebase --abort bei einem späteren Konflikt während derselben Rebase ausgeführt werden, wird das übersprungene Commit natürlich auch zurückgesetzt.

Wenn Ihre Änderung bereits im Upstream vorhanden war, kann Git Ihr Commit nicht anwenden (sollte es jedoch normalerweise automatisch überspringen, wenn der Patch genau der gleiche ist). Ihr eigenes Commit wird übersprungen, aber die Änderung bleibt im aktuellen HEAD bestehen, da sie bereits vorgelagert angewendet wurde.

Sie sollten wirklich sicherstellen, dass Sie keine wichtige Änderung von Ihnen entfernt haben;) (Verwenden Sie das Reflog, um zum Zustand vor der Rebase zurückzukehren.)

stricken
quelle
4
Warum wird das Commit immer noch im Protokoll angezeigt? Und warum wird das fehlende Commit jetzt im Diff angezeigt?
Mrwooster
3
Ja, der Konflikt wurde bereits im Upstream gelöst ... aus irgendeinem Grund bringt Git Rebase alte Zusammenführungskonflikte hervor ... eine andere Sache, die mich verwirrt? ... bedeutet dies, dass der Konflikt übersprungen wurde, aber der Patch angewendet wurde, der den Konflikt gelöst hat Konflikt?
Mrwooster
3
Sie haben Ihr eigenes Commit übersprungen, das die gleiche Änderung wie ein Commit vorgelagert hatte. Sie haben Ihr Commit übersprungen, aber die Änderung wurde noch vorgenommen (da sie bereits stromaufwärts vorhanden war)
stricken Sie am
1
@mittal nein, ich glaube nicht, dass --skipes der richtige Weg ist. Beim Überspringen wird ein Commit vollständig übersprungen, und alle in diesem Commit vorgenommenen Änderungen werden gelöscht.
Stricken
3
@mittal: Man denke an git rebaseals das Kopieren von Commits von einem Zweig auf einen anderen Zweig. Wenn Sie also ein Commit überspringen, wird der ursprüngliche Inhalt des Commits übersprungen und der Patch wird nicht angewendet (sodass alle an einer Datei vorgenommenen Änderungen nicht in Ihren Zielzweig gelangen). Am einfachsten ist es, ein einfaches Git-Repository mit zwei Zweigen mit jeweils mehreren Commits einzurichten und dann zu versuchen, ein Commit neu zu starten und zu überspringen (Sie können git rebase --interactiveangeben, welche Commits kopiert ( pick) oder übersprungen ( skip) werden
knittl