Ich weiß, dass das Umschreiben der Geschichte schlecht ist, yada yada.
Aber wie kann man einige Commits dauerhaft aus dem Remote-Zweig entfernen?
Ich weiß, dass das Umschreiben der Geschichte schlecht ist, yada yada.
Aber wie kann man einige Commits dauerhaft aus dem Remote-Zweig entfernen?
Antworten:
Sie sind git reset --hard
Ihr lokaler Zweig, um Änderungen aus dem Arbeitsbaum und dem Index zu entfernen, und Sie haben git push --force
Ihren überarbeiteten lokalen Zweig auf die Fernbedienung. ( andere Lösung hier besteht darin, den Remote-Zweig zu löschen und erneut zu verschieben.)
Diese SO-Antwort zeigt die Gefahr eines solchen Befehls, insbesondere wenn Personen für ihre eigenen lokalen Repos von der Remote-Historie abhängig sind.
Sie müssen bereit sein , Menschen auf die darauf zu hinweisen, aus vorgelagerten REBASE RECOVERING Abschnitt der git rebase
Manpage
Mit Git 2.23 (August 2019, neun Jahre später) würden Sie den neuen Befehl verwenden git switch
.
Das heißt:
(ersetzengit switch -C mybranch origin/mybranch~n
n
durch die Anzahl der zu entfernenden Commits )
Dadurch werden der Index und der Arbeitsbaum wie gewohnt wiederhergestellt git reset --hard
.
push --force
weg
git gc
auf der Remote-Seite nicht immer oft genug ausgeführt. Zum Beispiel auf GitHub: twitter.com/githubhelp/status/387926738161774592?lang=es
Beachten Sie einfach last_working_commit_id
, dass Sie beim Zurücksetzen eines nicht funktionierenden Commits das verwenden müssen
git reset --hard <last_working_commit_id>
Wir dürfen also nicht auf das zurücksetzen, commit_id
was wir nicht wollen.
Dann müssen wir sicher zum Remote-Zweig pushen:
git push --force
git reset --hard
soll man machen.
In diesem Tutorial werden drei Optionen angezeigt . Falls der Link bricht, lasse ich die Hauptschritte hier.
1 Setzen Sie das vollständige Commit zurück
git revert dd61ab23
2 Löschen Sie das letzte Commit
git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
oder, wenn der Zweig lokal verfügbar ist
git reset HEAD^ --hard
git push <<remote>> -f
Dabei ist + dd61 ... Ihr Commit-Hash und git interpretiert x ^ als übergeordnetes Element von x und + als erzwungenen, nicht schnell vorgeschobenen Push.
3 Löschen Sie das Commit aus einer Liste
git rebase -i dd61ab23^
Dies wird geöffnet und der Editor zeigt eine Liste aller Commits an. Löschen Sie den, den Sie entfernen möchten. Beenden Sie den Rebase und drücken Sie die Kraft, um das Repo durchzuführen.
git rebase --continue
git push <remote_repo> <remote_branch> -f
Wenn Sie beispielsweise die letzten 3
Commits löschen möchten , führen Sie den folgenden Befehl aus, um die Änderungen aus dem Dateisystem (Arbeitsbaum) und dem Commit-Verlauf (Index) in Ihrem lokalen Zweig zu entfernen:
git reset --hard HEAD~3
Führen Sie dann den folgenden Befehl (auf Ihrem lokalen Computer) aus, um den Remote-Zweig zu zwingen, seinen Verlauf neu zu schreiben:
git push --force
Herzliche Glückwünsche! Alles erledigt!
Einige Notizen:
Sie können die gewünschte Festschreibungs-ID durch Ausführen abrufen
git log
Dann können Sie ersetzen HEAD~N
mit <desired-commit-id>
wie folgt aus :
git reset --hard <desired-commit-id>
Wenn Sie Änderungen im Dateisystem beibehalten und nur den Index (Commit-Verlauf) ändern möchten, verwenden Sie das --soft
Flag like git reset --soft HEAD~3
. Dann haben Sie die Möglichkeit, Ihre neuesten Änderungen zu überprüfen und alle oder Teile davon zu behalten oder zu löschen. Im letzteren Fall git status
zeigt runnig die seitdem geänderten Dateien an <desired-commit-id>
. Wenn Sie die --hard
Option verwenden, git status
erfahren Sie, dass Ihre lokale Niederlassung genau mit der Remote-Niederlassung identisch ist. Wenn Sie nicht verwenden , --hard
noch --soft
wird der Standardmodus verwendet , das ist --mixed
. In diesem Modus git help reset
sagt:
Setzt den Index, aber nicht den Arbeitsbaum zurück (dh die geänderten Dateien werden beibehalten, aber nicht für das Festschreiben markiert) und meldet, was nicht aktualisiert wurde.
Das mag zu spät sein, aber was mir geholfen hat, ist die cool klingende "nukleare" Option. Grundsätzlich mit dem Befehlfilter-branch
Dateien entfernen oder etwas über eine große Anzahl von Dateien während Ihres gesamten Git-Verlaufs ändern.
Es wird am besten erklärt hier .
Vereinfachung der Antwort von pctroll, ähnlich basierend auf diesem Blog-Beitrag .
# look up the commit id in git log or on github, e.g. 42480f3, then do
git checkout master
git checkout your_branch
git revert 42480f3
# a text editor will open, close it with ctrl+x (editor dependent)
git push origin your_branch
# or replace origin with your remote
Manchmal ist es am einfachsten, dieses Problem zu beheben, indem Sie an der Stelle, an der Sie wissen, dass der Code gut ist, einen neuen Zweig erstellen. Dann können Sie den fehlerhaften Zweigverlauf in Ruhe lassen, falls Sie später andere Commits daraus auswählen müssen. Dies stellt auch sicher, dass Sie keinen Commit-Verlauf verloren haben.
Von Ihrer lokalen fehlerhaften Niederlassung:
git log
Kopieren Sie den Commit-Hash, an dem sich der Zweig befinden soll, und beenden Sie das Git-Protokoll
git checkout theHashYouJustCopied
git checkout -b your_new_awesome_branch
Jetzt haben Sie einen neuen Zweig genau so, wie Sie es möchten.
Wenn Sie auch ein bestimmtes Commit aus dem fehlerhaften Zweig behalten müssen, der sich nicht in Ihrem neuen Zweig befindet, können Sie einfach das gewünschte Commit auswählen:
git checkout the_errant_branch
git log
Kopieren Sie den Commit-Hash des einen Commits, den Sie benötigen, um in den guten Zweig zu ziehen und das Git-Protokoll zu beenden.
git checkout your_new_awesome_branch
git cherry-pick theHashYouJustCopied
Klopfe dir auf den Rücken.