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?

War es hilfreich?

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)
  1. Dies ist, was Sie rückgängig machen möchten.
  2. 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 Sie git reset --soft HEAD~ stattdessen verwenden, die wie ist git reset HEAD~ (wo HEAD~ die gleiche wie HEAD~1 ist), sondern lässt Ihre bestehenden Änderungen in Szene gesetzt.
  3. Nehmen Sie Änderungen an Baum-Dateien arbeiten.
  4. git add alles, was Sie in Ihrem neuen aufnehmen möchten begehen.
  5. 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

dauerhaft entfernen

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.

Mehr

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 sehen
git 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 letzten Commits in Git rückgängig zu machen?

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.

  1. Wenn Sie nicht möchten, um Ihre Änderungen behalten, dass Sie gemacht:

    git reset --hard HEAD^
    
  2. 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 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 Reset-Effekt LOG nach RESET

Schließlich sieht das reflog wie das Bild unten

reflog nach reflog FINAL

"Zurücksetzen des Arbeitsbaum in den letzten Commit"

git reset --hard HEAD^ 

"Clean unbekannte Dateien aus dem Arbeits Baum"

git clean    
siehe

- Git Quick Reference

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 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top