Wie kann ich git reset --hard HEAD ~ 1 rückgängig machen?

12 answers
  • Pat Notz ist richtig. Sie können das Commit zurückbekommen, solange es innerhalb weniger Tage vergangen ist. git nur Müll sammelt nach etwa einem Monat oder so, es sei denn, Sie werden ausdrücklich dazu aufgefordert, neuere Blobs zu entfernen.

     $ git init
    Initialized empty Git repository in .git/
    
    $ echo "testing reset" > file1
    $ git add file1
    $ git commit -m 'added file1'
    Created initial commit 1a75c1d: added file1
     1 files changed, 1 insertions(+), 0 deletions(-)
     create mode 100644 file1
    
    $ echo "added new file" > file2
    $ git add file2
    $ git commit -m 'added file2'
    Created commit f6e5064: added file2
     1 files changed, 1 insertions(+), 0 deletions(-)
     create mode 100644 file2
    
    $ git reset --hard HEAD^
    HEAD is now at 1a75c1d... added file1
    
    $ cat file2
    cat: file2: No such file or directory
    
    $ git reflog
    1a75c1d... HEAD@{0}: reset --hard HEAD^: updating HEAD
    f6e5064... HEAD@{1}: commit: added file2
    
    $ git reset --hard f6e5064
    HEAD is now at f6e5064... added file2
    
    $ cat file2
    added new file
     

    Sie Im Beispiel kann ich sehen, dass die Datei2 als Ergebnis des Hard-Reset entfernt wurde, aber beim Zurücksetzen über das Reflog wieder eingesetzt wurde.

    29 January 2009
    jfs
  • Sie müssen die sha1 des Commits angeben, zu dem Sie wiederherstellen möchten. Sie können das sha1 erhalten, indem Sie das Reflog (git reflog) untersuchen und dann

    git reset --hard <sha1 of desired commit> >

    tun. Aber nicht warte zu lange ... nach ein paar wochen wird git das Commit als nicht referenziert betrachten und alle blobs löschen.

    09 August 2008
    Pat Notz
  • Die Antwort ist in der obigen ausführlichen Antwort verborgen. Sie können dies einfach tun:

     $> git reset --hard HEAD@{1}
     

    (Siehe die Ausgabe von git reflog show )

    26 February 2011
    markmc
  • Es ist möglich, es wiederherzustellen, wenn Git noch keinen Müll gesammelt hat.

    Mit fsck:

     $ git fsck --lost-found
    dangling commit b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf
     

    Erholen Sie sich mit Rebase das unbeirrbare Commit:

     $ git rebase b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf
     
    13 July 2014
    sverrejoh
  • Wenn Sie wirklich Glück haben, wie ich es war, können Sie in Ihren Texteditor zurückkehren und auf "Rückgängig machen" klicken.

    Ich weiß, dass das nicht wirklich eine ist richtige Antwort, aber es hat mir einen halben Arbeitstag erspart, also wird es hoffentlich auch für jemand anderen gelten!

    13 January 2012
    Chris
  • Beispiel für einen IRL-Fall:

    $ git fsck --lost-found

     Checking object directories: 100% (256/256), done.
    Checking objects: 100% (3/3), done.
    dangling blob 025cab9725ccc00fbd7202da543f556c146cb119
    dangling blob 84e9af799c2f5f08fb50874e5be7fb5cb7aa7c1b
    dangling blob 85f4d1a289e094012819d9732f017c7805ee85b4
    dangling blob 8f654d1cd425da7389d12c17dd2d88d318496d98
    dangling blob 9183b84bbd292dcc238ca546dab896e073432933
    dangling blob 1448ee51d0ea16f259371b32a557b60f908d15ee
    dangling blob 95372cef6148d980ab1d7539ee6fbb44f5e87e22
    dangling blob 9b3bf9fb1ee82c6d6d5ec9149e38fe53d4151fbd
    dangling blob 2b21002ca449a9e30dbb87e535fbd4e65bac18f7
    dangling blob 2fff2f8e4ea6408ac84a8560477aa00583002e66
    dangling blob 333e76340b59a944456b4befd0e007c2e23ab37b
    dangling blob b87163c8def315d40721e592f15c2192a33816bb
    dangling blob c22aafb90358f6bf22577d1ae077ad89d9eea0a7
    dangling blob c6ef78dd64c886e9c9895e2fc4556e69e4fbb133
    dangling blob 4a71f9ff8262701171d42559a283c751fea6a201
    dangling blob 6b762d368f44ddd441e5b8eae6a7b611335b49a2
    dangling blob 724d23914b48443b19eada79c3eb1813c3c67fed
    dangling blob 749ffc9a412e7584245af5106e78167b9480a27b
    dangling commit f6ce1a403399772d4146d306d5763f3f5715cb5a    <- it's this one
     

    $ git show f6ce1a403399772d4146d306d5763f3f5715cb5a

     commit f6ce1a403399772d4146d306d5763f3f5715cb5a
    Author: Stian Gudmundsen Høiland <stian@Stians-Mac-mini.local>
    Date:   Wed Aug 15 08:41:30 2012 +0200
    
        *MY COMMIT MESSAGE IS DISPLAYED HERE*
    
    diff --git a/Some.file b/Some.file
    new file mode 100644
    index 0000000..15baeba
    --- /dev/null
    +++ b/Some.file
    *THE WHOLE COMMIT IS DISPLAYED HERE*
     

    $ git rebase f6ce1a403399772d4146d306d5763f3f5715cb5a

     First, rewinding head to replay your work on top of it...
    Fast-forwarded master to f6ce1a403399772d4146d306d5763f3f5715cb5a.
     
    20 August 2012
    ChrisStian Høiland
  • Soweit ich weiß, verwirft --hard nicht festgeschriebene Änderungen. Da diese nicht von git verfolgt werden. Sie können jedoch auch discarded commit rückgängig machen.

     $ git reflog
     

    zeigt Listen an:

     b0d059c HEAD@{0}: reset: moving to HEAD~1
    4bac331 HEAD@{1}: commit: added level introduction....
    ....
     

    wobei 4bac331 der discarded commit ist.

    Bewegen Sie jetzt den Kopf dahin commit ::

     $ git reset --hard 4bac331
     
    02 April 2015
    suhailvs
  • Wenn Sie noch kein Müll gesammelt haben (z. B. mit git repack -d oder git gc, aber beachten Sie, dass die Speicherbereinigung auch automatisch erfolgen kann), ist Ihr Commit immer noch vorhanden - es ist einfach nicht mehr erreichbar der HEAD.

    Sie können versuchen, Ihr Commit zu finden, indem Sie die Ausgabe of git fsck --lost-found durchsehen.

    Neuere Versionen von Git hat etwas namens "reflog", ein Protokoll aller Änderungen, die an den Refs vorgenommen werden (im Gegensatz zu Änderungen, die am Inhalt des Repositorys vorgenommen werden). So wird zum Beispiel jedes Mal, wenn Sie Ihren HEAD wechseln (d. H. Jedes Mal, wenn Sie a git checkout wechseln, um die Zweige zu wechseln), das protokolliert werden. Und natürlich manipulierten Sie auch den HEAD, so dass er auch protokolliert wurde. Sie können auf ältere Zustände Ihrer Referenzen auf ähnliche Weise zugreifen, wie auf ältere Zustände Ihres Repositorys, indem Sie an @ anstelle von a ~, li ke git reset HEAD@{1}.

    Ich habe eine Weile gebraucht, um zu verstehen, was der Unterschied zwischen HEAD @ {1} und HEAD ~ 1 ist, daher hier eine kleine Erklärung:

    && 9&&] de>

    S o, HEAD~1 bedeutet "zum Commit wechseln, bevor das Commit, auf das der HEAD aktuell zeigt", was bedeutet, dass "" zum < Commit, auf das der HEAD gezeigt hat, bevor er darauf zeigte, wo er momentan auf "." zeigt.

    Damit können Sie Ihr verlorenes Commit leicht finden und wiederherstellen.

    29 August 2008
    Jörg W Mittag
  • Ich weiß, dass dies ein alter Faden ist ... aber da viele Leute nach Wegen suchen, um Dinge in Git rückgängig zu machen, denke ich immer noch, dass es eine gute Idee sein kann, hier weiterhin Tipps zu geben.

    Wenn Sie in git gui ein git add hinzufügen oder etwas von links oben nach links unten verschieben, wird der Inhalt der Datei in einem Blob gespeichert, und der Dateiinhalt kann wiederhergestellt werden Klecks.

    Es ist also möglich, eine Datei wiederherzustellen, auch wenn sie nicht festgeschrieben wurde, aber hinzugefügt werden muss.

     git init  
    echo hello >> test.txt  
    git add test.txt  
     

    Nun wird der Blob erstellt, aber vom Index referenziert, so dass er nicht mit git fsck aufgelistet wird, bis wir ihn zurücksetzen. Wir setzen also zurück ...

     git reset --hard  
    git fsck  
     

    Sie erhalten einen baumelnden Klecks ce013625030ba8dba906f756967f9e9ca394464a

     git show ce01362  
     

    gibt Ihnen den Dateiinhalt "hallo" zurück

    Um unreferenzierte Commits zu finden, die ich gefunden habe irgendwo ein Tipp, der darauf hinweist.

     gitk --all $(git log -g --pretty=format:%h)  
     

    Ich habe es als Werkzeug in git gui und es ist sehr praktisch.

    20 January 2014
    martin
  • Bevor Sie mit der Beantwortung beginnen, fügen Sie etwas Hintergrund hinzu und erklären, was das ist HEAD.

    First of all what is HEAD?

    HEAD ist lediglich ein Verweis auf das aktuelle Commit (neueste) des aktuellen Zweigs.
    Es kann nur ein einzelnes HEAD at geben eine beliebige Zeit (außer git worktree)

    Der Inhalt von HEAD wird in .git/HEAD gespeichert und enthält die 40 Byte SHA-1 des aktuellen Commits.


    detached HEAD

    Wenn Sie sind nicht auf dem letzten Commit - was bedeutet, dass HEAD auf ein früheres Commit in der Historie verweist, das als detached HEAD bezeichnet wird.

    Wie kann ich git reset --hard HEAD ~ 1 rückgängig machen?

    In der Befehlszeile sieht es so aus: SHA-1 anstelle des Zweigs, da HEAD nicht auf die Spitze des aktuellen Zweigs zeigt

    Wie kann ich git reset --hard HEAD ~ 1 rückgängig machen?


    Einige Optionen zur Wiederherstellung von einem getrennten HEAD:


    git checkout

     git checkout <commit_id>
    git checkout -b <new branch> <commit_id>
    git checkout HEAD~X // x is the number of commits t go back
     

    Dadurch wird ein neuer Zweig ausgecheckt, der auf das gewünschte Commit zeigt.
    Mit diesem Befehl wird ein bestimmter Commit ausgecheckt.
    An dieser Stelle können Sie einen Zweig erstellen und ab diesem Zeitpunkt mit der Arbeit beginnen .

     # Checkout a given commit. 
    # Doing so will result in a `detached HEAD` which mean that the `HEAD`
    # is not pointing to the latest so you will need to checkout branch
    # in order to be able to update the code.
    git checkout <commit-id>
    
    # create a new branch forked to the given commit
    git checkout -b <branch name>
     

    git reflog

    Sie können auch immer reflog verwenden.
    git reflog zeigt jede Änderung an, mit der HEAD aktualisiert wurde. Wenn Sie den gewünschten Reflog-Eintrag auschecken, wird HEAD auf dieses Commit zurückgesetzt.

    Bei jeder Änderung des HEAD wird in reflog

     ein neuer Eintrag angezeigt git reflog
    git checkout HEAD@{...}
     

    Damit kehren Sie zum gewünschten Commit zurück.

    Wie kann ich git reset --hard HEAD ~ 1 rückgängig machen?


    git reset HEAD --hard <commit_id>

    "Bewegen" Sie Ihren Kopf zurück zum gewünschten Commit.

     # This will destroy any local modifications.
    # Don't do it if you have uncommitted work you want to keep.
    git reset --hard 0d1d7fc32
    
    # Alternatively, if there's work to keep:
    git stash
    git reset --hard 0d1d7fc32
    git stash pop
    # This saves the modifications, then reapplies that patch after resetting.
    # You could get merge conflicts, if you've modified things which were
    # changed since the commit you reset to.
     
    • Hinweis: ( Ab Git 2.7 )
      können Sie auch git rebase --no-autostash verwenden / li>


    git revert <sha-1>

    "Rückgängig machen" des angegebenen Commit- oder Commit-Bereichs.
    Der Befehl reset "macht" alle Änderungen rückgängig, die im angegebenen Commit vorgenommen wurden.
    Ein neues Commit mit dem Undo-Patch wird festgeschrieben Das ursprüngliche Commit bleibt auch in der Historie erhalten.

     # add new commit with the undo of the original one.
    # the <sha-1> can be any commit(s) or commit range
    git revert <sha-1>
     

    Dieses Schema veranschaulicht, welcher Befehl was tut.
    Wie Sie s können

    21 April 2018
    CodeWizard