How can I undo git reset --hard HEAD~1?

后端 未结 18 3106
逝去的感伤
逝去的感伤 2020-11-22 00:21

Is it possible to undo the changes caused by the following command? If so, how?

git reset --hard HEAD~1
18条回答
  •  甜味超标
    2020-11-22 00:43

    In most cases, yes.

    Depending on the state your repository was in when you ran the command, the effects of git reset --hard can range from trivial to undo, to basically impossible.

    Below I have listed a range of different possible scenarios, and how you might recover from them.

    All my changes were committed, but now the commits are gone!

    This situation usually occurs when you run git reset with an argument, as in git reset --hard HEAD~. Don't worry, this is easy to recover from!

    If you just ran git reset and haven't done anything else since, you can get back to where you were with this one-liner:

    git reset --hard @{1}
    

    This resets your current branch whatever state it was in before the last time it was modified (in your case, the most recent modification to the branch would be the hard reset you are trying to undo).

    If, however, you have made other modifications to your branch since the reset, the one-liner above won't work. Instead, you should run git reflog to see a list of all recent changes made to your branch (including resets). That list will look something like this:

    7c169bd master@{0}: reset: moving to HEAD~
    3ae5027 master@{1}: commit: Changed file2
    7c169bd master@{2}: commit: Some change
    5eb37ca master@{3}: commit (initial): Initial commit
    

    Find the operation in this list that you want to "undo". In the example above, it would be the first line, the one that says "reset: moving to HEAD~". Then copy the representation of the commit before (below) that operation. In our case, that would be master@{1} (or 3ae5027, they both represent the same commit), and run git reset --hard to reset your current branch back to that commit.

    I staged my changes with git add, but never committed. Now my changes are gone!

    This is a bit trickier to recover from. git does have copies of the files you added, but since these copies were never tied to any particular commit you can't restore the changes all at once. Instead, you have to locate the individual files in git's database and restore them manually. You can do this using git fsck.

    For details on this, see Undo git reset --hard with uncommitted files in the staging area.

    I had changes to files in my working directory that I never staged with git add, and never committed. Now my changes are gone!

    Uh oh. I hate to tell you this, but you're probably out of luck. git doesn't store changes that you don't add or commit to it, and according to the documentation for git reset:

    --hard

    Resets the index and working tree. Any changes to tracked files in the working tree since are discarded.

    It's possible that you might be able to recover your changes with some sort of disk recovery utility or a professional data recovery service, but at this point that's probably more trouble than it's worth.

提交回复
热议问题