Wie rückgängig machen ich die letzten lokalen Commits in Git?
-
06-09-2019 - |
Frage
ich begangen versehentlich die falschen Dateien href="https://en.wikipedia.org/wiki/Git" rel="noreferrer"> Git
Wie kann ich diese Commits aus dem lokalen Repository rückgängig machen?
Lösung
Rückgängig ein Commit und Redo
$ git commit -m "Something terribly misguided" # (1)
$ git reset HEAD~ # (2)
<< edit files as necessary >> # (3)
$ git add ... # (4)
$ git commit -c ORIG_HEAD # (5)
- Dies ist, was Sie rückgängig machen möchten.
- Damit bleibt Ihr Arbeitsbaum (den Zustand Ihrer Dateien auf der Festplatte) unverändert, aber rückgängig macht das Commit und lässt die Änderungen, die Sie unstaged verpflichtet (so werden sie als „Änderungen nicht begehen inszenierten“ erscheinen in
git status
, so dass Sie müssen sie wieder hinzufügen, bevor begehen). Wenn Sie nur wollen in mehr Änderungen an der vorherigen begehen, oder die Commit-Nachricht ändern 1 , könnten Siegit reset --soft HEAD~
stattdessen verwenden, die wie istgit reset HEAD~
(woHEAD~
die gleiche wieHEAD~1
ist), sondern lässt Ihre bestehenden Änderungen in Szene gesetzt. - Nehmen Sie Änderungen an Baum-Dateien arbeiten.
-
git add
alles, was Sie in Ihrem neuen aufnehmen möchten begehen. - Sie die Änderungen, die alte Nachricht begehen Wiederverwendung.
reset
kopiert den alten Kopf zu.git/ORIG_HEAD
;commit
mit-c ORIG_HEAD
wird mit einem Editor öffnen, die zunächst die Protokollnachricht vom alten enthält begehen und ermöglicht es Ihnen, es zu bearbeiten. Wenn Sie die Nachricht nicht bearbeiten müssen, könnten Sie die-C
Option verwenden.
Beachten Sie, dass jedoch, wenn Sie den Index keine neue Änderungen hinzugefügt haben, commit --amend
verwendet, wird in Ihrem vorherigen begehen.
Wenn der Code bereits gedrückt zu Ihrem Server und Sie haben Berechtigungen Geschichte zu überschreiben (re), dann:
git push origin master --force
Sie können auch auf diese Antwort aussehen:
So verschieben Kopf zurück zu einer früheren Stelle? (Frei stehend Kopf) & Rückgängig verpflichtet
Die obige Antwort zeigt Ihnen git reflog
, welche um herauszufinden, verwendet wird, was die SHA-1 ist, die Sie wiederherstellen möchten. Sobald Sie den Punkt, zu dem gefunden möchten Sie die Reihenfolge der Befehle zu verwenden, rückgängig zu machen, wie oben erläutert.
1 Beachten Sie jedoch, dass Sie zurücksetzen müssen, um zu einem früheren nicht begehen, wenn Sie nur einen Fehler in der Commitnachricht gemacht . Die einfachere Möglichkeit ist, git reset
(alle Änderungen an unstage Sie da gemacht haben) und dann git commit --amend
, die Ihr Standard geöffnet Nachrichteneditor vorausgefüllt mit der letzten Commit-Nachricht commit.
Andere Tipps
Rückgängig machen eine Festschreibung ist ein wenig beängstigend, wenn Sie nicht wissen, wie es funktioniert. Aber es ist wirklich erstaunlich einfach, wenn Sie verstehen.
Angenommen, Sie haben diese, wo C Ihr HEAD ist und (F) ist der Zustand Ihrer Dateien.
(F)
A-B-C
↑
master
Sie möchten nuke begehen C und es nie wieder sehen . Sie tun dies:
git reset --hard HEAD~1
Das Ergebnis ist:
(F)
A-B
↑
master
Nun B ist der Kopf. Weil Sie --hard
verwendet, Ihre Dateien auf ihren Zustand zurückgesetzt werden bei B begehen.
Ah, aber nehme begehen C keine Katastrophe, aber nur ein bisschen ab. Sie möchten rückgängig machen die commit aber Ihre Änderungen behalten für ein wenig Bearbeitung, bevor Sie eine besser begehen. Beginnend wieder von hier, mit C als HEAD:
(F)
A-B-C
↑
master
Sie können dies tun, so dass Sie den --hard
:
git reset HEAD~1
In diesem Fall ist das Ergebnis:
(F)
A-B-C
↑
master
In beiden Fällen HEAD ist nur ein Zeiger auf den neuesten begehen. Wenn Sie eine git reset HEAD~1
tun, Sie Git sagen, den Kopf zu bewegen, ein Commit Zeiger zurück. Aber (es sei denn, Sie --hard
verwenden) Sie lassen Sie Ihre Dateien, wie sie waren. So, jetzt git status
zeigt die Änderungen in C. checkt hatten Sie haben nichts verloren!
Für die leichteste Berührung, können Sie auch rückgängig machen Ihre begehen, aber lassen Sie Ihre Dateien und Ihre shas (das ist, Hashes), die Sie in verschoben haben um die diese Sie zerstört, und tun begehen.
git checkout -b someNewBranchName shaYouDestroyed
Sie haben jetzt wieder belebt, die zu begehen. Commits nicht wirklich in Git für einige 90 Tage zerstört werden, so können Sie in der Regel gehen Sie zurück und Rettung, die Sie bedeuten nicht, sie wieder loszuwerden.
Das dauerte eine Weile, um herauszufinden, vielleicht wird dies jemand helfen ...
Es gibt zwei Möglichkeiten, um „Rückgängig“ Ihre letzte verpflichten, je nachdem, ob oder nicht haben Sie bereits Ihre begehen Öffentlichkeit (gedrückt Remote-Repository):
Wie eine lokale rückgängig zu machen begehen
Lassen Sie uns sagen, dass ich vor Ort begangen, aber wollen jetzt entfernen, dass begehen.
git log
commit 101: bad commit # latest commit, this would be called 'HEAD'
commit 100: good commit # second to last commit, this is the one we want
Um alles wieder auf die Art und Weise wiederherstellen, es war vor dem letzten Commit, müssen wir reset
commit vor HEAD
:
git reset --soft HEAD^ # use --soft if you want to keep your changes
git reset --hard HEAD^ # use --hard if you don't care about keeping the changes you made
Jetzt git log
wird zeigen, dass unsere letzten entfernt commit wurde.
Wie eine öffentliche rückgängig zu machen begehen
Wenn Sie bereits Ihre Commits öffentlich gemacht, Sie begehen ein neues erstellt werden soll, das die Änderungen „zurückkehren“ Sie in Ihrem bisherigen commit (aktuelle HEAD) gemacht.
git revert HEAD
Ihre Änderungen werden nun rückgängig gemacht werden und bereit für Sie zu verpflichten:
git commit -m 'restoring the file I removed by accident'
git log
commit 102: restoring the file I removed by accident
commit 101: removing a file we don't need
commit 100: adding a file that we need
Für weitere Informationen Besuche Git Basics - Undoing Things
Hinzufügen / Entfernen von Dateien Dinge, wie Sie wollen zu bekommen:
git rm classdir
git add sourcedir
Dann ändern die commit:
git commit --amend
Das vorherige, fehlerhafte begehen wird bearbeitet werden, um den neuen Index Zustand zu reflektieren -. Mit anderen Worten, es wird sein, wie Sie nie den Fehler in erster Linie gemacht
Beachten Sie, dass Sie sollten dies nur tun, wenn Sie noch nicht gedrückt haben. Wenn Sie gedrückt haben, dann werden Sie normalerweise nur ein Update zu begehen haben.
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"
oder
git reset --hard HEAD~1
. Achtung: Der obige Befehl wird die Änderungen an den .java
Dateien (und andere Dateien), die Sie wollte begehen
Die hard reset
HEAD-1
wird Ihre Arbeitskopie auf den Zustand des Satzes verpflichten, bevor Ihr Unrecht begehen.
Um die letzten Commit ändern
Ersetzen Sie die Dateien in den Index:
git rm --cached *.class
git add *.java
Wenn es dann ein privater Zweig ist, ändern die commit:
git commit --amend
Oder, wenn es ein gemeinsamer Zweig ist, macht ein neue begehen:
git commit -m 'Replace .class files with .java files'
(, um eine Änderung vorherige commit , verwenden Sie die ehrfürchtige interaktive rebase )
Protip ™: In *.class
zu einer gitignore dies wieder geschieht zu stoppen
Um wieder ein commit
Die Änderung einer Festschreibung ist die ideale Lösung, wenn Sie die letzten begehen, sondern eine allgemeinere Lösung ist reset
ändern müssen.
zurücksetzen Sie können git einem Commit mit:
git reset @~N
Wo N
ist die Zahl der Commits vor HEAD
und @~
setzt auf die vorherige begehen.
Also, anstatt die die Änderung begeht, könnten Sie verwenden:
git reset @~
git add *.java
git commit -m "Add .java files"
Überprüfen Sie heraus git help reset
, insbesondere die Abschnitte über --soft
--mixed
und --hard
, für ein besseres Verständnis von dem, was das bedeutet.
Reflog
Wenn Sie vermasseln, können Sie immer die reflog verwenden fiel Commits zu finden:
$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started
Verwenden git revert <commit-id>
Um die ID verpflichten, nur git log
verwenden
Wenn Sie planen, einen lokalen rückgängig zu machen ganz begehen, was Sie ändern Sie auf dem begangen haben, und wenn Sie sich Sorgen, nichts über das, nur das tun, den folgenden Befehl ein.
git reset --hard HEAD^1
(Dieser Befehl ignoriert Ihre gesamte begehen und Ihre Änderungen werden vollständig von Ihrem lokalen Arbeits Baum verloren). Wenn Sie rückgängig machen möchten Ihre begehen, aber Sie möchten, dass Ihre Änderungen in den Staging-Bereich (vor wie nach git add
begehen), dann tun Sie den folgenden Befehl.
git reset --soft HEAD^1
Jetzt ist Ihre engagierten Dateien kommen in den Staging-Bereich. Nehmen wir an, wenn Sie die Dateien upstage wollen, weil Sie etwas falsch Inhalt bearbeiten müssen, dann tun Sie den folgenden Befehl
git reset HEAD
Jetzt engagierte Dateien aus dem inszenierten Bereich in den unstaged Bereich zu kommen. Jetzt Dateien bereit sind, zu bearbeiten, so was auch immer Sie ändern, möchten Sie bearbeiten gehen und fügte hinzu, es und machen eine frische / neue begehen.
Wenn Sie Git Extras installiert , können Sie git undo
laufen die neuesten Commit rückgängig zu machen. git undo 3
werden die letzten drei Commits rückgängig gemacht werden.
Ich wollte die neuesten 5 Commits in unserem gemeinsamen Repository rückgängig zu machen. Ich sah die Revision-ID, die ich auf Rollback wollte. Dann habe ich in der folgenden eingegeben haben.
prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To git@bitbucket.org:thecompany/prometheus.git
+ 09a6480...5a74047 master -> master (forced update)
prompt>
Ich ziehe git rebase -i
für diesen Job zu verwenden, da eine nette Liste erscheint, wo ich die Commits können wählen, um loszuwerden. Es ist vielleicht nicht so direkt wie einige andere Antworten hier sein, aber es nur fühlt sich richtig .
Wählen Sie, wie viele Commits Sie auflisten möchten, dann wie folgt aufrufen (gewinnen letzten drei)
git rebase -i HEAD~3
Beispielliste
pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support
Dann wird Git entfernen Commits für jede Zeile, die Sie entfernen.
Wie die bisherigen lokalen beheben commit
Mit git-gui (oder ähnliches) ein git commit --amend
auszuführen. Von der GUI können Sie einzelne Dateien aus dem Commit hinzufügen oder entfernen. Sie können auch ändern, die Nachricht zu begehen.
Wie die bisherigen lokalen rückgängig zu machen commit
Reset Sie Ihre Filiale an die vorherige Stelle (zum Beispiel unter Verwendung von gitk
oder git rebase
). Dann, um die Änderungen aus einer gespeicherten Kopie erneut anwenden. Nach der Garbage Collection in Ihrem lokalen Repository, wird es sein, wie die unerwünschte commit nie passiert. Um all das in einem einzigen Befehl zu tun, verwendet git reset HEAD~1
.
Ein Wort der Warnung: : Careless Verwendung von git reset
ist ein guter Weg, um Ihre Arbeitskopie in einen verwirrenden Zustand zu erhalten. Ich empfehle, dass Git Novizen dies vermeiden, wenn sie können.
Wie eine öffentliche rückgängig zu machen begehen
Reverse Kirsche holen ( git-revert ), um die Änderungen rückgängig zu machen.
Wenn Sie noch nicht andere Änderungen an Ihrer Filiale gezogen, können Sie einfach tun ...
git revert --no-edit HEAD
Dann drücken Sie die aktualisierte Zweig zum gemeinsamen Repository.
Die Commit-Geschichte wird zeigen beide verpflichtet, getrennt .
Erweitert: Korrektur der privaten Niederlassung in öffentlichen Repository
Dies kann gefährlich sein - sicher sein, eine lokale Kopie der Branche müssen repush
.Beachten Sie auch:. Sie wollen nicht, dies zu tun, wenn jemand anderes auf dem Zweig arbeiten kann
git push --delete (branch_name) ## remove public version of branch
Bereinigen Sie Ihre Niederlassung vor Ort dann repush ...
git push origin (branch_name)
Im Normalfall werden Sie wahrscheinlich über Ihre privaten Zweig brauchen sich keine Sorgen zu begehen Geschichte unberührte sein. Drücken Sie einfach ein Followup begehen (siehe oben: "Wie ein öffentlich verpflichten rückgängig zu machen), und später tut einem Squash-merge die Geschichte zu verbergen.
Wenn Sie haben sich verpflichtet, Müll, aber nicht gedrückt wird,
git reset --soft HEAD~1
HEAD ~ 1 ist eine Abkürzung für das Commit vor dem Kopf. Alternativ können Sie auf die beziehen SHA-1 des Hash, wenn Sie zurücksetzen möchten. -. Soft Option löscht die begehen, aber es wird alle geänderten Dateien „Änderungen werden verpflichtet,“ verlassen, wie git status sagen würde
Wenn Sie im Arbeits Baum verfolgt Dateien über alle Änderungen, um loszuwerden, da begehen die vor Kopf Gebrauch „ - hart “. Statt
oder
Wenn Sie bereits gedrückt und jemand gezogen, die in der Regel ist mein Fall, können Sie nicht verwenden git reset . Sie können jedoch tun, um eine git revert
git revert HEAD
wird erstellen Dies ist eine neue verpflichten, dass alles durch die versehentliche begehen eingeführt umkehrt.
Wenn Sie wollen, dass es dauerhaft rückgängig zu machen und Sie haben einige Repository geklont
Das Commit-ID kann durch
zu sehengit log
Dann können Sie tun -
git reset --hard <commit_id>
git push origin <branch_name> -f
SourceTree (GUI für GitHub), können Sie mit der rechten Maustaste auf das Commit und ein ‚Vertauschen Commit ‘. Dies sollte Ihre Änderungen rückgängig zu machen.
Auf dem Terminal:
Sie können alternativ verwendet werden:
git revert
Oder:
git reset --soft HEAD^ # Use --soft if you want to keep your changes.
git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.
Mit einem einzigen Befehl:
git reset --soft 'HEAD^'
Es funktioniert großartig die letzte lokale begehen!
rückgängig machen Just zurückgesetzt er den Befehl unter Verwendung git
tun:
git reset --soft HEAD~1
Erklären Sie: , was git reset
hat, ist es im Grunde reset
einem begehen würden Sie zurück gehen mögen, dann, wenn Sie es mit --soft
Schlüssel kombinieren, wird es gehen, aber die Änderungen halten in Ihre Datei (en), so dass Sie wieder auf die Bühne zu bekommen, die die Datei nur hinzugefügt wurde, ist HEAD
der Leiter der Niederlassung und wenn Sie mit ~1
(in diesem Fall auch Sie HEAD^
verwenden) kombinieren, wird es geht nur ein begehen das ist, was Sie wollen ...
erstelle ich die Schritte im Bild unten in mehr Details für Sie, einschließlich aller Schritte, die in realen Situationen geschieht kann und den Code zu begehen:
Wie die letzte Git Commit rückgängig zu machen?
Um alles wieder auf die Art und Weise wiederherstellen, es war vor dem letzten Commit, müssen wir die verpflichten, bevor HEAD zurückgesetzt werden.
-
Wenn Sie nicht möchten, um Ihre Änderungen behalten, dass Sie gemacht:
git reset --hard HEAD^
-
Wenn Sie möchten, um Ihre Änderungen halten:
git reset --soft HEAD^
Überprüfen Sie nun Ihre git log. Es wird sich zeigen, dass unsere letzten entfernt wurde commit.
Mit reflog einen korrekten Zustand finden
git reflog
reflog VOR RESET
Wählen Sie die richtige reflog (f3cb6e2 in meinem Fall), und geben Sie
git reset --hard f3cb6e2
Danach wird die Repo HEAD wird in diesem HEADid zurückgesetzt LOG nach RESET
Schließlich sieht das reflog wie das Bild unten
reflog FINAL
"Zurücksetzen des Arbeitsbaum in den letzten Commit"
git reset --hard HEAD^
"Clean unbekannte Dateien aus dem Arbeits Baum"
git clean
siehe
Hinweis: Mit diesem Befehl wird Ihre vorherige begehen löschen, so mit Vorsicht verwenden! git reset --hard
ist sicherer -
Erster Lauf:
git reflog
Es zeigt Ihnen alle möglichen Aktionen, die Sie auf Ihrem Repository durchgeführt haben, zum Beispiel verpflichten, fusionieren, ziehen, etc.
Dann tun:
git reset --hard ActionIdFromRefLog
Rückgängig letzte commit:
git reset --soft HEAD^
oder git reset --soft HEAD~
Dies wird rückgängig macht die letzten begehen.
Hier --soft
bedeutet Reset in Inszenierung.
HEAD~
oder HEAD^
bedeutet, sich zu bewegen, bevor HEAD zu begehen.
begehen Replace zuletzt auf neue begehen:
git commit --amend -m "message"
Es ersetzt die letzten mit dem neuen begehen begehen.
Eine andere Möglichkeit:
Kasse die Filiale Sie zurücksetzen wollen, dann setzen Sie Ihre lokale Arbeitskopie zurück zu dem Commit, dass Sie das späteste auf dem Remote-Server (alles danach bye-bye gehen wird) sein wollen. Um dies zu tun, in SourceTree ich rechts geklickt hat auf die und ausgewählte „Reset branch dazu verpflichten“.
Navigieren Sie dann zu Ihrem Repository lokalen Verzeichnis und führen Sie diesen Befehl:
git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME
Dies wird alle Commits nach dem aktuellen in Ihrem lokalen Repository löscht, sondern nur für diesen einen Zweig.
Typ git log
und finden Sie den letzten Hash-Code begehen und dann eingeben:
git reset <the previous co>
In meinem Fall habe ich begangen versehentlich einige Dateien, die ich nicht wollte. Also habe ich die folgende und es hat funktioniert:
git reset --soft HEAD^
git rm --cached [files you do not need]
git add [files you need]
git commit -c ORIG_HEAD
Überprüfen Sie die Ergebnisse mit gitk oder git log --stat
Einfache, führen Sie dies in der Befehlszeile:
git reset --soft HEAD~
Es gibt viele Möglichkeiten, es zu tun:
Git Befehl, um die letzten Commit / vorherigen Commits rückgängig zu machen:
Achtung: Verwenden Sie --hard Nicht, wenn Sie nicht wissen, was Sie tun. --hard ist zu gefährlich , und es könnte löschen Sie Ihre Dateien.
Grund Befehl in Git den Commit zurückzukehren ist:
$ git reset --hard <COMMIT -ID>
oder
$ git reset --hard HEAD~<n>
COMMIT-ID : ID für die commit
n: ist die Nummer des letzten verpflichtet Sie zurücksetzen wollen
Sie können die Commit-ID erhalten, wie unten dargestellt:
$ **git log --oneline**
d81d3f1 function to subtract two numbers
be20eb8 function to add two numbers
bedgfgg function to mulitply two numbers
Dabei steht d81d3f1 und be20eb8 sind begehen ID.
Lassen Sie uns jetzt einige Fälle sehen:
Angenommen, Sie das letzte begehen ‚d81d3f1‘ zurückkehren möchten. Hier sind zwei Möglichkeiten:
$ git reset --hard d81d3f1
oder
$ git reset --hard HEAD~1
Angenommen, Sie begehen 'be20eb8' zurückkehren möchten:
$ git reset --hard be20eb8
Für weitere Informationen können Sie zum Zurücksetzen Kopf auf einen bestimmten Zustand einige andere Befehle beziehen und ausprobieren:
$ git reset --help
Um zur vorherigen Revision zurückzusetzen, permanent alle unbestätigten Änderungen zu löschen:
git reset --hard HEAD~1
Verwenden Sie SourceTree (grafisches Tool für Git) Commits und Baum zu sehen. Sie können es manuell direkt zurück, indem sie rechts klicken.
für eine lokale begehen
git reset --soft HEAD~1
oder wenn Sie sich nicht erinnern genau, in welcher begehen ist, könnten Sie verwenden
git rm --cached <file>
Für eine geschobenen begehen
Der richtige Weg von Dateien aus dem Repository Geschichte zu entfernen verwendet git filter-branch
. Das heißt,
git filter-branch --index-filter 'git rm --cached <file>' HEAD
Aber ich recomnend Sie verwenden diesen Befehl mit Vorsicht. Lesen Sie mehr unter git-filter-branch (1) Handbuch Seite .