1138 Stimmen

Wie entfernt man dauerhaft einige Commits aus einem entfernten Zweig?

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?

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

765voto

hd84335 Punkte 6749

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

36 Stimmen

Perfekte, elegante, einfachste Antwort. Ich habe gerade den letzten Stabe-Commit wiederhergestellt, den ich sowohl remote als auch lokal brauchte

16 Stimmen

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.

10 Stimmen

Sie können Ihre lokalen Änderungen mit git stash speichern .... einige Dinge .... und git stash pop (Ihre lokalen Änderungen sind zurück)

746voto

VonC Punkte 1117238

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>

2 Stimmen

Seltsam. Fühlt sich an, als hätte ich das schon versucht. Zusammen mit einer Umbasierung funktioniert es wunderbar. Danke!

12 Stimmen

@Arnis: perfekt also ;) push --force weg

0 Stimmen

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 (:

183voto

reefaktor Punkte 2895

Wichtig: Stellen Sie sicher, dass Sie bei "git push -f" angeben, welche Zweige Sie bearbeiten wollen, sonst könnten Sie versehentlich andere Zweige verändern! [*]

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 Übergabe rückgängig machen
  2. Die letzte Übertragung löschen
  3. Übergabe aus einer Liste löschen

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

5 Stimmen

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!

0 Stimmen

Nur die Schritte 1 und 2 haben die Aufgabe erfüllt und die ursprüngliche Frage beantwortet. (Führen Sie Schritt 3 nicht aus)

1 Stimmen

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.

175voto

Abdollah Punkte 3529

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.

1 Stimmen

Es ist eine einfache Möglichkeit, nicht funktionierende Commits zu entfernen. Vielen Dank.

27voto

Saif Punkte 2248

TL:DR;

  1. git switch -C branch_name origin/branch_name~n
  2. git push --force

Erledigt, der entfernte Zweig wird zurückgesetzt durch n bindet.


Erläuterung:

  1. Utilisez git switch setzt den Zweig um n Commits zurück. Die -C wird zwangsweise ein neuer Zweig mit demselben Namen erstellt.

    • ersetzen. branch_name mit dem Namen Ihrer Niederlassung,
    • ersetzen. 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.

  2. Forcieren Sie die lokale Änderung

    Befehl #2: git push --force


Tipp: Rückgängig machen von (nicht übertragenen) Änderungen git reset HEAD~

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