How to undo a git reset hard and branch delete
Git 找回reset --hard的代码及删除的分支
People make mistakes all the time.
I remember the first time I used git reset --hard
+ git push -f
was in early 2013. I thought it was just a small commit, but I ended up pushing a bunch of useless code to github. What should I do? At this time, some seniors came out and told me that even if the code is pushed to the server, it can still be modified, and told other colleagues not to push the code for the time being, and finally solved the problem with reset-hard and force.
Finally, after all these years, I seem to have become a "senior" (but the level has not improved too much).
Today a colleague suddenly said the code was lost - after reset hard, force push to github, in a panicked looking ...... all the memory just came back, in the previous accident, I was also apprehensive,.
Back to the beginning of this article, people will always make mistakes. In the process of correcting mistakes, we may will also make mistakes. Although the probability of two mistakes is not that big, it still may happen. So is it possible to retrieve code after reset --hard? The answer is yes! Git never deletes a commit. This is where reflog comes into play.
The official description of reflog
is this:
Reference logs, or "reflogs", record when the tips of branches and other references were updated in the local repository.
We can get 2 pieces of information from it:
It is a change log for refs, so operations like
git reset
orgit cherry-pick
are logged;It only exists locally, so you can think of it as the local undo history.
Basic Reflog operations
List reflogs:
git reflog
Or:
git log --walk-reflogs
You can see that all your previous changes are still there, so you should feel comfortable - even if you did reset --hard
, you won't lose them. At this point you should be familiar with the routine after that, find the commit you need and reset it.
Restore a branch
Similarly, a branch deleted with -D
can be recovered. Use reflog to check the record, find the hash of the commit before the branch was deleted, for example, 4c84318, and then do this:
git branch <branch-name> 4c84318