4212 Stimmen

Löschen von Übertragungen aus einem Zweig in Git

Ich würde gerne wissen, wie ich eine Übertragung löschen kann.

Unter delete Ich meine, dass es so ist, als ob ich diesen Commit nicht gemacht hätte, und wenn ich in Zukunft einen Push mache, werden meine Änderungen nicht in den entfernten Zweig gepusht.

Ich habe die Git-Hilfe gelesen und denke, dass ich den folgenden Befehl verwenden sollte git reset --hard HEAD . Ist dies korrekt?

64 Stimmen

Ich denke, das ist no ein Duplikat von Git letzte Übergabe rückgängig machen da er fragt, wie er löschen soll cualquier von einem Zweig übertragen. Ich denke auch, dass keine der Antworten auf diese Frage eingeht. Sie alle spulen die letzten Commits zurück, nicht cherry-pick y delete eine einzelne Übergabe, die vielleicht schon eine Weile zurückliegt.

22 Stimmen

@Chris, die Antwort mit git rebase -i HEAD~10 geht auf diese Frage ein, da es Ihnen erlaubt, die zu löschenden Commits willkürlich auszuwählen. Git wendet die Commits in dem von Ihnen angegebenen Bereich einzeln an und ignoriert dabei Commits, die Sie aus dem Protokoll entfernt haben. Ich habe diesen Befehl heute verwendet, um die zweit- und drittjüngsten Commits in meinem Repo zu löschen, während ich den obersten beibehalten habe. Ich stimme zu, dass keine der anderen Antworten zufriedenstellend ist.

0 Stimmen

@MST ja, ich hätte sagen sollen, dass keine der Optionen in der akzeptierten Antwort auf diese Frage eingeht, aber Sie haben absolut Recht - dieser Befehl scheint zu funktionieren

5347voto

gahooa Punkte 121696

Vorsichtig: git reset --hard LÖSCHT IHRE ÄNDERUNGEN IM ARBEITSVERZEICHNIS . Achten Sie darauf, dass alle lokalen Änderungen, die Sie beibehalten möchten, zu speichern bevor Sie diesen Befehl ausführen.

Angenommen, Sie sitzen auf diesem Commit, dann wird dieser Befehl ihn vernichten...

git reset --hard HEAD~1

Le site HEAD~1 bedeutet die Übergabe vor dem Kopf.

Oder Sie könnten sich die Ausgabe von git log Suchen Sie die Commit-ID des Commits, zu dem Sie ein Backup erstellen möchten, und gehen Sie folgendermaßen vor:

git reset --hard <sha1-commit-id>

Wenn Sie es bereits geschoben haben, müssen Sie es mit Gewalt schieben, um es loszuwerden...

git push origin HEAD --force

Cependant Wenn andere sie bereits gezogen haben, sollten Sie besser einen neuen Zweig anlegen. Denn wenn sie ziehen, wird es einfach in ihre Arbeit zusammengeführt, und Sie werden es wieder nach oben geschoben bekommen.

Wenn Sie bereits gepusht haben, ist es vielleicht besser, wenn Sie git revert um einen "Spiegelbild"-Commit zu erstellen, der die Änderungen rückgängig macht. Beide Übertragungen sind jedoch im Protokoll enthalten.


ZU IHRER INFORMATION. git reset --hard HEAD ist ideal, wenn Sie WORK IN PROGRESS loswerden wollen. Es setzt Sie auf die letzte Übertragung zurück und löscht alle Änderungen in Ihrem Arbeitsbaum und Index.


Wenn Sie einen Commit finden wollen, den Sie "gelöscht" haben, finden Sie ihn normalerweise in git reflog es sei denn, Sie haben Ihr Repository in den Müll geworfen.

72 Stimmen

HEAD~1 oder einfach HEAD^ . Wenn Sie geschoben haben, sollten Sie git revert stattdessen.

17 Stimmen

Natürlich können Sie auch HEAD~n "zurückgehen" n von Ihrem Kopf aus verpflichtet. Vielleicht können Sie von diesem Punkt aus interpretieren ... --hard HEAD auch als HEAD~0 => Löschen von laufenden Arbeiten.

0 Stimmen

@beamrider9 Das ist was --hard bedeutet.

880voto

Greg Hewgill Punkte 882617

Wenn Sie den Commit noch nirgendwo veröffentlicht haben, können Sie git rebase -i um diese Übergabe zu entfernen. Finden Sie zunächst heraus, wie weit der Commit zurückliegt (ungefähr). Dann tun Sie das:

git rebase -i HEAD~N

Le site ~N bedeutet, dass die letzte N übergibt ( N muss eine Zahl sein, zum Beispiel HEAD~10 ). Dann können Sie die Datei, die Git Ihnen präsentiert, bearbeiten, um den fehlerhaften Commit zu löschen. Wenn Sie diese Datei speichern, schreibt Git alle folgenden Commits so um, als ob der gelöschte Commit nicht existieren würde.

Das Git Book hat eine gute Abschnitt über die Umbasierung mit Bildern und Beispielen.

Seien Sie jedoch vorsichtig damit, denn wenn Sie etwas ändern, das Sie ont anderweitig geschoben werden, ist ein anderer Ansatz erforderlich, es sei denn, Sie haben vor, einen Force Push durchzuführen.

2 Stimmen

Hinweis: Wenn Sie zufällig irgendwelche --no-ff Merges in diesem letzten Stapel von Commits haben, wird rebase diese zerstören :( Dies wird unter -p auf diese Seite . Das Problem ist, wenn man -i durch -p ersetzt, bekommt man nicht mehr das Pop-up mit den Auswahlmöglichkeiten für "edit this commit, sqush that one", etc etc. Kennt jemand die Lösung?

0 Stimmen

Ist dies besser als die Antwort "Hard Reset", da dadurch nicht die Dateien gelöscht werden, sondern nur die falsche Übermittlungsmeldung? Denn es scheint meine Dateien gelöscht zu haben. Wenn die Datei gelöscht werden soll, fügen Sie dies bitte als deutliche Warnung hinzu!

4 Stimmen

Was ist, wenn Sie ihn geschoben haben? (nur ich benutze das Remote Repo)

698voto

1800 INFORMATION Punkte 125009

Eine andere Möglichkeit ist einer meiner persönlichen Lieblingsbefehle:

git rebase -i <commit>~1

Damit wird die Rebase im interaktiven Modus gestartet -i an der Stelle kurz vor der Übergabe, die Sie umlegen wollen. Der Editor startet und listet alle Commits auf, die seit diesem Zeitpunkt gemacht wurden. Löschen Sie die Zeile mit dem Commit, den Sie auslöschen wollen, und speichern Sie die Datei. Rebase wird den Rest der Arbeit erledigen, indem es nur diesen Commit löscht und alle anderen in das Protokoll zurückschreibt.

5 Stimmen

Thx, btw, wenn Sie auf irgendwelche Probleme stoßen (wie leere Commits) können Sie verwenden git rebase --continue

18 Stimmen

Noch einfacher: git rebase -i HEAD~1

3 Stimmen

Wahnsinn. git rebase -i HEAD~1 hat das Repo wirklich sehr aufgeräumt! Es ist schwer zu sagen, was genau es bewirkt hat, aber das Ganze sieht viel ordentlicher aus. Ein bisschen beunruhigend, eigentlich.

458voto

Rob Punkte 4986

Ich füge diese Antwort an, weil ich nicht verstehe, warum jemand, der gerade versucht hat, seine Arbeit zu übertragen, diese Arbeit wegen eines Fehlers in Git löschen möchte!

Wenn Sie Ihre Arbeit beibehalten und den Commit-Befehl (den Sie vor dem Pushen in die Repo gefangen haben) einfach "rückgängig" machen wollen:

git reset --soft HEAD~1

Verwenden Sie nicht die Option --hard Flagge, es sei denn, Sie wollen Ihre seit dem letzten Commit laufende Arbeit zerstören.

8 Stimmen

Hier ein Beispiel, warum das so ist: Sie machen ein kleines Stück Arbeit auf einem Entwicklungsserver, das Sie committen. Dann stellt sich heraus, dass dieser Server keinen ausgehenden HTTPS-Zugang hat, so dass Sie den Commit nirgendwo veröffentlichen können. Am einfachsten ist es, so zu tun, als wäre es nie passiert, und den Patch von Ihrem lokalen Rechner aus neu zu machen.

2 Stimmen

@KarthikBose es würde immer den Reflog geben. auch nach git reset --hard HEAD~1 Ihr vorheriger letzter Commit wäre über reflog verfügbar (bis Sie ihn löschen); siehe auch hier: gitready.com/intermediate/2009/02/09/

1 Stimmen

Vielleicht verwende ich git falsch, aber in einer Situation möchte ich die --hard Option ist, wenn ich mehrere entfernte Zweige habe und in den falschen Zweig gepusht habe. Sagen wir, ich habe einen master Zweig und eine staging Zweig arbeite ich an einem lokalen Zweig, führe dann aber versehentlich einen Merge durch und schiebe ihn in den Master-Zweig, um dann festzustellen, dass ich etwas falsch gemacht habe. Dann möchte ich den HEAD von master auf den zweitjüngsten Commit zurücksetzen et alle Spuren dieses fehlerhaften Pushs vom Master entfernen, da er nicht angeblich Meister zu sein

252voto

raittes Punkte 5101

Entfernen einer gesamten Übertragung

git rebase -p --onto SHA^ SHA

Ersetzen Sie natürlich "SHA" durch die Referenz, die Sie loswerden wollen. Das "^" in diesem Befehl ist wörtlich zu nehmen.

http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep

0 Stimmen

Vielen Dank für diesen Link! Ich habe mich gefragt, warum ich nach dem Ausführen dieses Programms immer noch die Übergabe SHA in meinem Git-Reflog sehe?

6 Stimmen

-p, --preserve-merges Wiedererstellen von Merge Commits, anstatt die Historie durch erneutes Abspielen von Commits, die ein Merge Commit einleitet, zu verflachen. Merge-Konfliktlösungen oder manuelle Änderungen an Merge-Commits werden nicht beibehalten.

19 Stimmen

Es heißt: "Ersetzen Sie SHA durch die Referenz, die Sie loswerden wollen", aber in der Zeile steht SHA zweimal. Ich habe Folgendes getan: git rebase -p --onto 5ca8832c120^ 5ca8832c120 Aber es hat sich nichts geändert. Soll ich denselben SHA zweimal verwenden? Wenn nicht, welches ist dann die SHA für die zu entfernende Übergabe und welches ist die andere SHA?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X