Skip to main content

Git magic - Bring back from the dead

I had this interesting scenario where I did hard reset and force push to a commit. However I wanted one of the change from the lost commit. 

Once again, Git magic came in handy. Git never erases anything off its memory too soon. This magic spell as I call, is one of a kind and most git enthusiasts must know it by now. 

Introducing reflog

We all know what you get when you do git log. Let me anyway spell it out, git log gives you a list of changes or in other words, commits available as of the moment in that local repository in the chronologically descending order. 

Similarly, git reflog gives you a list if changes or in other words, change history that happened in that local repository in chronologically descending order. For instance, if you have amended the same commit 5 times, you can choose to go back to the 3rd commit amend and restart your work from there.

This situation is what I call as, 

Bring back from the dead

Let us consider the following scenario,

  • You worked and pushed a change
  • Customer comes in and says that they don’t want the change and so you git reset hard to the previous commit
  • Now after a day, customer comes back and says they want that change back again

What options do you have?

  • Try and bring back the changes from your mind?
  • Look for the closed PR changes and re-do them manually from there?
  • or worse, scold your customer inside yourself and do the first point?
I’ve been at that stages. Some of my backend buddies used to use their IDE’s local cache to get them back. All this while me, a lame Sublime text user has been under the impression it’s some magic that IntelliJ does that sublime cannot. Little I knew it was all Git underneath. 

What is the real option here?

It's Bring it back from the dead. Please read on. 😊
  1. Open your git repo in terminal
  2. Do git reflog
  3. This will show a huge list of historical changes. When you look at this, you’ll know the steps you did to get your repo to where it is now. git log is like calculating displacement and git reflog is like finding the distance covered, what all stops you made.
  4. A typical reflog will look like,

    ef9080e HEAD@{1}: commit (amend): build: add changes for success
    gh0191f HEAD@{2}: commit (amend): build: add changes for success
    hi1202g HEAD@{3}: commit (amend): build: add changes for success
    f1be775 HEAD@{4}: reset: moving to HEAD@{1}
    e3g351f HEAD@{5}: reset: moving to HEAD@{13}
    6b63233 HEAD@{6}: rebase (finish): returning to refs/heads/build-failing-issue
    6b63233 HEAD@{7}: rebase (pick): build: testing build fail
    2224786 (tag: v1.9.0, upstream/master, origin/master, origin/HEAD, master) HEAD@{8}: rebase (start): checkout upstream/master

    You could know what change happened at that Head pointer by reading the type as highlighted in the orange and the change message in black.

    /**
     *
    @disclaimer
     * The commit hash and messages used are not real and wrote for demo purposes
    */
  5. Here choose a change you want to go back to. Unlike the commit hash, you’ll have to choose a head pointer. Something like HEAD@{1} or HEAD@{10} or HEAD@{15} or it could go on
  6. Copy that and do git reset --hard {copied_HEAD_pointer} which will look something like,

       
    git reset --hard HEAD@{4}

  7. Tada. You’ve moved to the change you need. Just do a git push --force and you’re ready to ship the code. 
I hope this is helpful for folks who like terminal a lot more than IDEs and for people who were curious to know the tech underneath the IDEs

Comments

Popular posts from this blog

Confluence: 5 quick things that you need

As part of my work experiments, this week I would like to write down the things that one needs to know in confluence that can up-skill their documentation works. I will cover the following 5 things, How to Anchor link a title? How to Anchor link to a section? How to create a dashing dashboard? Panel - Confluence Macro Layouts - Confluence Tools Content by Label - Confluence Macro 1. How to Anchor link a title? This is the most required thing. Most useful when one has to refer to a section internally on the same confluence page. Let's consider you have a page with three different sections and titles as shown below, In this, if you want to add an internal anchor from a text in paragraph 3 to a title in paragraph 1, you can add it as follows, Choose the word that needs Anchor Click on the link icon from the Toolbar above In the link box, enter #Page Title 1 Click Insert That is it. Your anchor from the selected text to Page Title 1 is ready. This can be tested out in the preview itsel

Git magic - Squash commits

Back with another git magic. When it comes to merging a pull request on Github, there are two options Rebase and Merge Squash and Merge What is Rebase and Merge? When one chooses Rebase and Merge, all the commits in the PR are added to the target branch. For example, if the PR has 5 commits, all of those commits will be visible in the PR history of the target branch. What is Squash and Merge? When a PR is merged by choosing Squash and Merge, all the commits in the PR are combined into one PR and then added to the target branch. Once again, if the PR has 5 commits or any number of commits, they are combined and added to the target branch. Therefore, this is what Squash means. Combining 'n' different commits into one single commit is called squashing. In this blog post, we will go through the commands that can squash commits.  Advantages of Squashing commits No more redundant commits In a pull request, one may have 'n' different commits for one change. They might have bee

npm-link | What NPM won't tell you!

Hello readers. So back with another easy yet unexplored feature of npm/yarn packages. We as frontend developers / SDK developers, have to deal with more than one repositories where we actually code contribute. Most SDK developers would know this already or they use the not-so-well documented 'npm link' command . /**  *  @disclaimer  * Please read this post fully before executing any command. My scenario might not be the same as yours.  * This article below uses a repo from my current workplace as an example which is open-source and does not violate the Cisco Confidentiality Policies */ To make this article easier to understand, some representations, Host - Package that needs another local package as part of its node modules. Let's assume the path to this package is  ~/Documents/Repos/demo-app Adhoc - Local package that is added into another package as a dependency. Let's assume the path to this package is  ~/Documents/Repos/semver-monorepo What is npm link? This is a co