Hacking The History — Git Amend

Patryk Kosieradzki
4 min readApr 23, 2021

--

Forgot to do something in your last commit? Take it easy, git amend to the rescue

Today you’re gonna learn one of many ways to hack and rewrite your history in git. Git amend is great and I use it literally everyday. It is perfect for situations when you already created a commit, but forgot about some changes or just simply want to edit the commit message.

REMEMBER !

Avoid messing with pushed history on branches, where you’re not the only one making changes. Shared branches are usually harder to maintain and you can easily mess up your teammate’s work.
If you’re an advanced git user then you can do whatever you want

One last thing before we start

✉️ Android Dev Newsletter

If you enjoy learning about Android like I do and want to stay up to date with the latest, worth reading articles, programming news and much more, consider subscribing to my newsletter 👇
https://androiddevnews.com/

🎙 Android Talks Podcast

If you’re a Polish speaker and want to listen to what I have to say about Android, architecture, security and other interesting topics, check out my podcast 👇
https://androidtalks.buzzsprout.com/

Here’s how it’s done:

First, we have to check our existing commit history, to do that we use git log. This is a record of all commits that are in your repo:

git log

You should see something like this as the output:

commit 355e47d4d495a7d10ec0814cd1e472b03ee77d1b (HEAD -> master, origin/master)
Author: pmarciszekkosieradzki patryk.kosieradzki@gmail.com
Date: Mon Apr 26 21:35:56 2021 +0200
Improved stylingcommit 27d1bb599ce8f914c5e4d42b0ec08095a73c2f10
Author: pmarciszekkosieradzki patryk.kosieradzki@gmail.com
Date: Mon Apr 26 21:28:28 2021 +0200
Created first file

As you can see I have a simple branch with two commits on it. Both of them have been pushed from my local to the remote. Unfortunately I forgot to add one more thing to 355e47d… commit. What options do I have now?

Well… I can simply create a new commit with these changes and I’ll be fine:

commit a3ee725e0a3e6265df4747cd7fc558e200b56dbe (HEAD -> master, origin/master)
Author: pmarciszekkosieradzki patryk.kosieradzki@gmail.com
Date: Mon Apr 26 21:40:24 2021 +0200
Fixed typocommit 355e47d4d495a7d10ec0814cd1e472b03ee77d1b
Author: pmarciszekkosieradzki patryk.kosieradzki@gmail.com
Date: Mon Apr 26 21:35:56 2021 +0200
Improved stylingcommit 27d1bb599ce8f914c5e4d42b0ec08095a73c2f10
Author: pmarciszekkosieradzki patryk.kosieradzki@gmail.com
Date: Mon Apr 26 21:28:28 2021 +0200
Created first file

That was simple, it’s just a new commit. Isn’t this ok? Well, no. Commits are great and you should be doing small changes to the code and committing them with a good message, but creating a new commit to fix a typo, or to add one small thing you forgot about in the previous commit is just lazy and not good-looking.

How to do it properly

First we add some changes to the changelist:

git add .

Then we amend it:

git commit --amend

After executing this command, you should get something like this. This file will show up in your console or on your screen (most probably on vim/nano):

Improved styling and added readme.md
Please enter the commit message for your changes. Lines starting
with '#' will be ignored, and an empty message aborts the commit.
#
Date: Mon Apr 26 21:35:56 2021 +0200
#
On branch master
Changes to be committed:
modified: a.txt
new file: second.txt
#

You can edit commit messages here and anything you’d like. After you finish editing just save and exit the file.

On vim you just use this to save and exit:

:wq

Let’s see what git reflog says now. It is a record of all commits that are or were referenced in your repo at any time:

4dad158 (HEAD -> master) HEAD@{0}: commit (amend): Improved styling
.
.
.
a3ee725 HEAD@{7}: commit: Fixed typo
355e47d (origin/master) HEAD@{8}: commit: Improved styling
27d1bb5 HEAD@{9}: commit (initial): Created first file

As you can see the new commit is created. But why did git create a new commit instead of overriding the old one? Well, git has to be able to come back to any branch state at any time, so instead the new commit is created and it will be pushed on top of the old one.

How to push the “new” commit?

Now to push the updated commit, we just use push force:

git push -f origin master

Let’s check what commits do we see on our branch now:

commit 4dad158f6574c96f6647ba1ce1fa2ce965884ce3 (HEAD -> master, origin/master)
Author: pmarciszekkosieradzki patryk.kosieradzki@gmail.com
Date: Mon Apr 26 21:35:56 2021 +0200
Improved stylingcommit 27d1bb599ce8f914c5e4d42b0ec08095a73c2f10
Author: pmarciszekkosieradzki patryk.kosieradzki@gmail.com
Date: Mon Apr 26 21:28:28 2021 +0200
Created first file

That’s all folks. You now know how to amend commits. Hope you learned something and should you have any questions please do not hesitate to contact me

--

--

Patryk Kosieradzki

Senior Android Engineer @ Moss, Podcaster @ AndroidTalks, based in Warsaw, Poland