If you don’t know about git reflog, your life is about to get much, much better. Prepare yourself. Git is about to make just a bit more sense.
Note: I use the git visualization tool at the bottom of this post, in case you want to jump straight to the “How on earth is this possible?! I give up. Git is just magic.”
Using yesterday’s tip, suppose you have a repo with 6 files each with their own commit.
Cool. Now let’s say you did a `git reset –hard <commitID for file4>` to reset back to file 4. Note: any flavor of git reset will work for today’s scenario, since we’re not making any changes in our working directory (or so I think).
To recap these past several days:
- git reset changes history and should be avoided if you’ve already shared those commits with others (e.g. you use it when you haven’t pushed yet.)
- git revert undoes a commit by creating a new commit with those changes uncommitted (wow, what a sentence. My apologies.)
Notice how the above image confirms the git log only shows the commits up to file 4.
In addition,`ls` and `git ls-files` shows how files 5 and 6 are “gone”!
will the real Git Log please stand up? please stand up. please stand up.
The command`git reflog` will show you the actual history of your git commands AND THEIR COMMIT IDS!!
what?! what?! what?!
The lightbulb moment for me was that git was keeping those commits around, and not to mention git is also keeping an actual log of everything going on alongside my repo’s git log.
Let’s get those files back.
You’re going to do another git reset, but this time, you’re going to change history by rolling forward instead of rolling backwards.
so you’ll do `git reset –hard <commit id for file 6>`
and all our files are back. In fact, if we do a `git log` we’re back to where we were at.
How on earth is this possible?! I give up. Git is just magic.
Let’s learn some magic tricks using the git visualization tool at http://git-school.github.io/visualizing-git/
alrighty. let’s rinse and repeat the setup
notice how the commits for files 4, 5, and 6 are there, but just dotted out (or whatever the official term is).
So we never “deleted” those commits. We just told git to hide them from ourselves, but not from git.
Now for the magic. We can do a reflog here in this tool.
Notice how HEAD and master pointers just move back to that commit ID. That’s it. These HEAD and masters pointers are just that… pointers.
This is why people say “don’t delete your .git folder and start over.” Your changes aren’t “gone”. They are just playing hide and sneak because you told them to.
Got to get back. Back to the past. Samurai Jack!!