Ich habe ähnliche Beiträge zu diesem Thema gelesen und kann für mein ganzes Leben nicht herausfinden, wie ich das richtig machen soll.
Ich habe ungefähr 1000 Dateien eingecheckt, die ich nicht möchte, und ich möchte lieber nicht 1by1 durchgehen und sie alle aus dem Repo entfernen.
- Ich habe eine entfernte
master
Niederlassung. - Ich habe die örtliche
master
Niederlassung.
Sie sind beide in der gleichen Revision.
Ich möchte meine Fernbedienung um 1 Commit zurücksetzen.
Sagen Sie, meine Geschichte master
ist auf A--B--C--D--E
.
Ich möchte mein lokales auf zurücksetzen D
.
Schieben Sie es dann auf Remote, damit mein aktueller Hash sowohl Remote als auch lokal ist.
Ich habe Probleme damit.
Ich benutze Git Tower, bin aber mit der Kommandozeile vertraut. Irgendeine Hilfe?
UPDATE: Großartige Kommentare unten. Die Verwendung eines Resets scheint teilweise nicht zu empfehlen, insbesondere wenn das Repository für andere Benutzer freigegeben ist. Was ist der beste Weg, um die Änderungen des vorherigen Commits ohne Hard-Reset rückgängig zu machen ? Gibt es einen Weg?
git revert
diese Option, um auf Hard-Resets zu verzichten und Benutzer nicht zu stören.Antworten:
Wenn noch niemand Ihr Remote-Repo gezogen hat, können Sie Ihren Zweig-HEAD ändern und ihn zwangsweise auf das Remote-Repo drücken:
(oder wenn Sie direkten Zugriff auf das Remote-Repo haben, können Sie dessen HEAD-Referenz ändern , obwohl es sich um ein reines Repo handelt. )
Beachten Sie, wie von Alien-Technologie in den Kommentaren unten unter Windows (CMD-Sitzung) kommentiert, Folgendes
^^
:Update seit 2011: Die
Verwendung
git push --force-with-lease
( die ich hier vorstelle und die 2013 mit Git 1.8.5 eingeführt wurde) ist sicherer.Siehe Schwern ‚s Antwort zur Illustration.
Dann würde ich etwas vorschlagen, das die Geschichte nicht umschreibt:
git revert
lokal Ihr letztes Commit (Erstellen eines neuen Commits, das das vorherige Commit umkehrt)git revert
.quelle
reset --hard HEAD^
und nichtreset --hard HEAD^^
zurücksetzen.Setzen Sie den lokalen Zweig um eine Revision zurück (
HEAD^
bedeutet eine Revision zurück):Schieben Sie die Änderungen zum Ursprung:
Sie müssen das Drücken erzwingen, da Git sonst erkennen würde, dass Sie
origin
durch ein Commit im Rückstand sind und sich nichts ändern wird.Wenn Sie dies mit tun,
--force
wird git angewiesen,HEAD
das Remote-Repo zu überschreiben, ohne die dortigen Fortschritte zu berücksichtigen.quelle
git push origin master
Git in diesem Fall in der Lage ist, ein neues Commit auf der Fernbedienung zu erstellen, da der lokale Zweig mindestens einmal vor dem Commit liegt? Darüber hinaus muss sich letzteres wesentlich von dem unterscheiden, worauf der Kopf im Remote-Repo hinweist.Wenn Sie das letzte Commit zurücksetzen möchten, hören Sie:
Schritt 1:
Überprüfen Sie Ihre lokalen Commits mit Nachrichten
Schritt 2:
Entfernen Sie das letzte Commit, ohne die Änderungen vom lokalen Zweig (oder Master) zurückzusetzen.
ODER wenn Sie nicht möchten, dass zuletzt festgeschriebene Dateien und Aktualisierungen abgehört werden
Schritt 3:
Wir können die Dateien und Codes aktualisieren und müssen erneut mit Gewalt pushen, um das vorherige Commit zu löschen. Es wird neues Commit behalten.
Das ist es!
quelle
Durch Eingabe des folgenden Befehls können Sie Ihren Git-Commit-Verlauf anzeigen -
$ git log
Angenommen, Ihr Verlauf in diesem bestimmten Zweig ist wie folgt: commit_A, commit_B, commit_C, commit_D. Wobei commit_D das letzte Commit ist und hier bleibt HEAD. Um Ihr letztes Commit von lokal und remote zu entfernen, müssen Sie Folgendes tun:
Schritt 1: Entfernen Sie das letzte Commit lokal durch -
$ git reset --hard HEAD ~
Dadurch wird Ihr Commit-HEAD in commit_C geändert
Schritt 2: Übertragen Sie Ihre Änderung für ein neues HEAD-Commit auf Remote
$ git push origin + HEAD
Dieser Befehl löscht das letzte Commit von Remote.
PS: Dieser Befehl wurde unter Mac OS X getestet und sollte auch unter anderen Betriebssystemen funktionieren (ohne Anspruch auf andere Betriebssysteme).
quelle
Verwenden Sie für Windows-Computer:
quelle
Hier ist eine aktualisierte Version des Verfahrens, die sicherer ist.
git push -f
wird das Remote-Repository wahllos durch Ihre eigenen Änderungen ersetzen. Wenn jemand anderes Änderungen vorgenommen hat, gehen diese verloren.git push --force-with-lease
wird Ihre Rebase nur pushen, wenn das Repository wie erwartet ist. Wenn jemand anderes bereits gedrückt hat, schlägt Ihr Push fehl.Siehe –force als schädlich angesehen; Verstehen von Git's Force-with-Lease .
Ich empfehle Aliasing als
repush = push --force-with-lease
.Sag es ihnen
git pull --rebase=merges
. Anstelle von agit fetch origin
undgit merge origin/master
es wirdgit fetch origin
undgit rebase -r origin/master
. Dadurch werden alle lokalen Änderungen zusätzlich zumaster
den neuen Änderungen neu geschriebenorigin/master
.-r
behält alle Zusammenschlüsse bei, die sie möglicherweise vorgenommen haben.Ich empfehle, dies als Standardverhalten für das Ziehen festzulegen. Es ist sicher, übernimmt die Neugründung anderer und führt zu weniger unnötigen Zusammenführungen.
quelle
--force-with-lease
Option geschrieben.Ich habe ein Problem wie das Ihre mit folgenden Befehlen gelöst:
quelle
Wenn Sie direkten Zugriff auf das Remote-Repo haben, können Sie immer Folgendes verwenden:
Dies funktioniert, da nicht versucht wird, das nicht vorhandene Arbeitsverzeichnis zu ändern. Weitere Details finden Sie in der Originalantwort:
Wie kann ich das letzte Commit in einem Git Bare-Repository aufheben?
quelle
Ich wollte nur das letzte Commit aus dem Remote- und Clear-Commit-Verlauf entfernen. Das Folgende wirkte wie ein Zauber
quelle
Der Weg, um den Kopf zurückzusetzen und zum vorherigen Commit zurückzukehren, ist abgeschlossen
Aber manchmal wird es in der Gegenstelle nicht akzeptiert:
dann ist der andere Weg zu tun
Das funktioniert gut.
HINWEIS: Denken Sie daran, wenn dies
git push -f <force>
fehlgeschlagen ist, und versuchen Sie dann, es zurückzusetzen. Machen Siegit pull
vorher ein, damit Remote und Local synchron sind, und versuchen Sie es danngit revert
.Überprüfen Sie mit
git log
, ob sich Remote und Local mit demselben SHA1 am selben Commit-Punkt befinden.quelle
auf lokalen Master
Kein Grund zur Sorge, ob andere gezogen haben oder nicht.
Getan!
quelle
Wenn Sie nur das letzte Commit aus dem Remote-Repository entfernen möchten, ohne Ihr lokales Repository zu beeinträchtigen, finden Sie hier einen Einzeiler:
Dies verwendet die folgende Syntax:
Hier
<remote>
istorigin
und<refspec>
hat die folgende Struktur:Details finden Sie in
git-push(1)
. Das Vorstehende+
bedeutet "Druck auf diese Referenz erzwingen" und der andere Teil bedeutet "vonorigin/master~
nachmaster
(von entferntorigin
)". Es ist nicht schwer zu wissen, dass diesorigin/master~
das letzte Commit zuvor istorigin/master
, oder?quelle
Für mich funktionieren diese beiden Befehle:
quelle
Sie können dies auch tun:
und alle anderen, die die letzten schlechten Commits erhalten haben, zurücksetzen lassen:
quelle