Ich weiß, dass das eine Umschreibung der Geschichte ist, die schlecht ist, bla bla bla.
Aber wie kann man einige Commits dauerhaft aus dem entfernten Zweig entfernen?
Ich weiß, dass das eine Umschreibung der Geschichte ist, die schlecht ist, bla bla bla.
Aber wie kann man einige Commits dauerhaft aus dem entfernten Zweig entfernen?
Beachten Sie einfach, dass Sie die last_working_commit_id
wenn eine nicht funktionierende Übertragung rückgängig gemacht wird
git reset --hard <last_working_commit_id>
Wir dürfen also nicht auf den commit_id
die wir nicht wollen.
Dann müssen wir natürlich in den entfernten Zweig pushen:
git push --force
Perfekte, elegante, einfachste Antwort. Ich habe gerade den letzten Stabe-Commit wiederhergestellt, den ich sowohl remote als auch lokal brauchte
Dadurch habe ich auch meine lokalen Änderungen verloren. Damit hatte ich nicht gerechnet. Aber meh, besser als Ihr persönliches Passwort zu Arbeit Repo zu begehen.
Sie können Ihre lokalen Änderungen mit git stash speichern .... einige Dinge .... und git stash pop (Ihre lokalen Änderungen sind zurück)
Usted git reset --hard
Ihren lokalen Zweig, um Änderungen aus dem Arbeitsbaum und dem Index zu entfernen, und Sie git push --force
(o git push --force-with-lease
) Ihren überarbeiteten lokalen Zweig auf den entfernten.
( andere Lösung hier (dabei wird der entfernte Zweig gelöscht und neu gepusht)
Este SO antworten veranschaulicht die Gefahr eines solchen Befehls, vor allem, wenn die Leute auf die entfernte Geschichte für ihre eigenen lokalen Repos angewiesen sind.
Sie müssen darauf vorbereitet sein, die Menschen auf die WIEDERHERSTELLUNG NACH EINEM VORGELAGERTEN REBASE Abschnitt der git rebase
man-Seite.
Außerdem, wie von ringo en die Kommentare Wenn der entfernte Zweig gegen Force Push geschützt ist, wird ein git revert
wie in diese Antwort vorzuziehen sein könnte.
Mit Git 2.23 (August 2019, neun Jahre später) würden Sie den neuen Befehl verwenden git switch
.
Das heißt: git switch -C mybranch origin/mybranch~n
(ersetzen n
durch die Anzahl der zu entfernenden Commits)
Dadurch wird der Index und der Arbeitsbaum wiederhergestellt, wie bei einer git reset --hard
würde.
Die Dokumentation fügt hinzu :
-C <new-branch> --force-create <new-branch>
Ähnlich wie
--create
außer, wenn<new-branch>
bereits vorhanden ist, wird sie zurückgesetzt auf<start-point>
.
Dies ist eine praktische Abkürzung für:$ git branch -f <new-branch> $ git switch <new-branch>
Seltsam. Fühlt sich an, als hätte ich das schon versucht. Zusammen mit einer Umbasierung funktioniert es wunderbar. Danke!
Ich habe BFG Repo-Reiniger um einige sensible Daten loszuwerden, was mir einen "unbenannten" Zweig mit der Originaldatei hinterließ. Nachdem ich auf den letzten gewünschten Commit zurückgesetzt und hart an den Ursprung gepusht hatte, ging alles gut (:
Es gibt drei Optionen, die in diese Anleitung . Für den Fall, dass der Link nicht funktioniert, lasse ich die wichtigsten Schritte hier.
1 Die vollständige Übertragung rückgängig machen
git revert dd61ab23
2 Löschen Sie die letzte Übertragung
git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
oder, wenn die Verzweigung lokal verfügbar ist
git reset HEAD^ --hard
git push <<remote>> -f
wobei +dd61... dein Commit-Hash ist und Git x^ als Elternteil von x und + als erzwungenes, nicht-fastforwared Push interpretiert.
3 Löschen Sie die Übergabe aus einer Liste
git rebase -i dd61ab23^
Dies öffnet einen Editor, der eine Liste aller Übertragungen anzeigt. Löschen Sie diejenige, die Sie loswerden wollen. Beenden Sie das Rebase und pushen Sie force zum Repo.
git rebase --continue
git push <remote_repo> <remote_branch> -f
Stellen Sie sicher, dass Sie bei "git push <remote_repo> <remote_branch> -f" angeben, welche Zweige Sie bearbeiten wollen, sonst könnten Sie versehentlich andere Zweige verändern!
Nur die Schritte 1 und 2 haben die Aufgabe erfüllt und die ursprüngliche Frage beantwortet. (Führen Sie Schritt 3 nicht aus)
Dies sind Optionen für verschiedene Szenarien, keine Schritte, die zu unternehmen sind. In meinem Fall hat die interaktive Umbasierung (Option 3) genau das gebracht, was ich gesucht habe.
Wenn Sie zum Beispiel die letzte 3
Commits, führen Sie den folgenden Befehl aus, um die Änderungen aus dem Dateisystem (Arbeitsbaum) und der Commit-Historie (Index) auf Ihrem lokalen Zweig zu entfernen:
git reset --hard HEAD~3
Führen Sie dann den folgenden Befehl (auf Ihrem lokalen Rechner) aus, um den entfernten Zweig zu zwingen, seinen Verlauf neu zu schreiben:
git push --force
Herzlichen Glückwunsch! Alles FERTIG!
Einige Anmerkungen:
Sie können die gewünschte Commit-ID abrufen, indem Sie
git log
Dann können Sie die HEAD~N
mit <desired-commit-id>
wie diese:
git reset --hard <desired-commit-id>
Wenn Sie Änderungen im Dateisystem behalten und nur den Index ändern wollen (Commit-Historie), verwenden Sie --soft
Flagge wie git reset --soft HEAD~3
. Dann haben Sie die Möglichkeit, Ihre letzten Änderungen zu überprüfen und alle oder Teile davon zu behalten oder zu verwerfen. Im letzteren Fall führen Sie git status
zeigt die Dateien an, die seit <desired-commit-id>
. Wenn Sie --hard
Option, git status
wird Ihnen sagen, dass Ihr lokaler Zweig genau derselbe ist wie der entfernte. Wenn Sie nicht --hard
noch --soft
wird der Standardmodus verwendet, d. h. --mixed
. In diesem Modus, git help reset
dice:
Setzt den Index zurück, aber nicht den Arbeitsbaum (d.h. die geänderten Dateien bleiben erhalten, aber nicht für die Übergabe markiert) und meldet, was nicht aktualisiert wurde.
TL:DR;
git switch -C branch_name origin/branch_name~n
git push --force
Erledigt, der entfernte Zweig wird zurückgesetzt durch n
bindet.
Erläuterung:
Utilisez git switch
setzt den Zweig um n Commits zurück. Die -C
wird zwangsweise ein neuer Zweig mit demselben Namen erstellt.
branch_name
mit dem Namen Ihrer Niederlassung,n
(am Ende des Befehls), mit der Anzahl der Commits, die Sie rückgängig machen wollen.Befehl #1: git switch -C branch_name origin/branch_name~n
Exemple : git switch -C feature/dashboard origin/feature/dashboard~1
// Dieser Befehl kehrt zurück 1 einbinden Dashboard Zweigstelle.
Forcieren Sie die lokale Änderung
Befehl #2: git push --force
Tipp: Rückgängig machen von (nicht übertragenen) Änderungen git reset HEAD~
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.
169 Stimmen
Ja, es ist wirklich schlimm und so weiter, aber aus irgendeinem Grund muss ich es mögen.
123 Stimmen
Ich weiß, dass das dumm ist, aber manchmal passiert so etwas - wie das Testen von Logins und die Verwendung von Klartextpasswörtern in Ihrem Code, die echte Anmeldedaten sind. Und schwupps...
7 Stimmen
Echte Anmeldedaten Ja, erinnert mich an ein paar Whoopos
1 Stimmen
Mögliches Duplikat von Löschen von Übertragungen aus einem Zweig in Git
1 Stimmen
Tun Sie das nicht, es wird zu Konflikten mit allen anderen Entwicklern führen.
6 Stimmen
@RajatVerma Es wird keinen Konflikt geben, wenn Sie der einzige Entwickler sind. Zur Hölle, selbst mit 2-3 Entwicklern, wenn sie alle im selben Raum sind, kann man es leicht lösen.
79 Stimmen
Ich bin dieses akademische Gerede darüber, wie gefährlich das ist und dass man es nie tun sollte, so leid. Es gibt Zeiten, in denen es viel, viel besser ist, Sachen aus der Git-History zu entfernen und sich mit den Konflikten/Brüchen anderer Entwickler auseinanderzusetzen. Es ist wirklich so einfach. Leute, die das ignorieren, haben wahrscheinlich nie außerhalb eines Klassenzimmers gearbeitet.
0 Stimmen
@crush in meinem Fall - schob eine ~100 Mb große Asset-Datei vor, die sich als unnötig erwies
11 Stimmen
@crush Meistens ist es so, dass diese "intelligenten" Menschen nicht alle möglichen Fälle in Betracht ziehen und ihnen die Perspektive fehlt, weil sie etwas wiederholen, ohne über einen möglichen Fall nachzudenken, den sie überhaupt nicht in Betracht ziehen. Manchmal müssen Regeln gebrochen werden. Das erinnert mich an Grammatik-Nazis.
4 Stimmen
Ich habe gerade Code mit Produktionsdatenbank-Passwort in plain. Andernfalls muss ich das Datenbankpasswort ändern, was zu Verbindungsproblemen bei mehreren Diensten führt, da sie alle dieselbe Datenbank mit denselben Anmeldeinformationen verwenden. Ich weiß, das ist auch schlechte Praxis, aber es funktioniert und es ist mir egal.
0 Stimmen
Wenn Sie versehentlich echte Anmeldeinformationen übertragen, müssen Sie davon ausgehen, dass jemand sie gesehen hat, bevor Sie die Übertragungen entfernen konnten, und Sie müssen diese Anmeldeinformationen ohnehin ändern. (Einige unflexible Richtlinien können natürlich verlangen, dass Sie sie trotzdem entfernen).