Git never forgets, well kinda. `git-reflog`

Hi, I am gonna let you in on a little secret. Git never forgets what you do, you can mess up however you want and you will still have all your data available*. * as long as you have committed you

Hi, I am gonna let you in on a little secret. Git never forgets what you do, you can mess up however you want and you will still have all your data available*.

  • as long as you have committed you code and also only for 90 days

OK, I am not taking about the fact that you can you can see the logs of what changes you have made over a period of time. I am talking about that fact that you can even recover from something like git reset –hard HEAD~30.

Working with git is a little scary for a lot of people. Things like rebasing, resetting etc. I know a lot of people who only ever does git push, git commit, and git pull.

I am here to say that you are fine, you can do any kind of weird shit and still have everything there. Let me introduce you to the magical command:

git reflog

Here is what a sample output of git reflog will look like:

This is a rather busy tree. As you can see, every check out, every pull, every reset. All of them are in there.

OK, so how do I use them? # (https://blog.meain.io/2019/git_never_forgets_well_kinda/#ok%2C-so-how-do-i-use-them%3F) It is simple, let us consider a simple mistake that you did. Let’s say that you accidentally hard reset to HEAD~30.

If you don’t know what that does, It resets your git commit to 30 commits behind current commit. This is different form checking out HEAD~30 as in this case it rewrites the tree.

git reset –hard HEAD~30

OK, now what do you do. Delete the folder and clone again is a possibility. But let’s do it the right way.

Run git reflog. Mine looks something like this:

dfd1d3e (HEAD -> master) HEAD@{0}: reset: moving to HEAD~30 a4d53b0 (origin/master) HEAD@{1}: commit: post:rust-macros: add output and code link 6cc6335 HEAD@{2}: commit: post:local-file-as-newtab-firefox b597ae7 HEAD@{3}: commit: config: fix rss link generated afc0283 HEAD@{4}: commit: post:kubernetes 7bd3eee HEAD@{5}: commit: post:tf-serving:add tf-serving docs link 77462fb HEAD@{6}: commit (amend): post:tf-serving 07fdc2e HEAD@{7}: commit: post:tf-serving

You can see that we have everything that I have done in the past listed here. Also if you check the latest one, it does show that I did reset it to HEAD~30.

Now to restore the original state, we just do a hard reset to the one just before I did reset to HEAD~30. In my case it will be to a4d53b0.

So I will run:

git reset –hard a4d53b0

After running this we are back to where we started. Now, if I were to run git reflog, I would get something like:

a4d53b0 (HEAD -> master, origin/master) HEAD@{0}: reset: moving to a4d53b0 dfd1d3e HEAD@{1}: reset: moving to HEAD~30 a4d53b0 (HEAD -> master, origin/master) HEAD@{2}: commit: post:rust-macros: add output and code link 6cc6335 HEAD@{3}: commit: post:local-file-as-newtab-firefox b597ae7 HEAD@{4}: commit: config: fix rss link generated afc0283 HEAD@{5}: commit: post:kubernetes 7bd3eee HEAD@{6}: commit: post:tf-serving:add tf-serving docs link 77462fb HEAD@{7}: commit (amend): post:tf-serving

t is not only applicable for just resets, whatever you do, you can come here and revert it. I hope this make git a little less scary.

Write a comment
No comments yet.