git deep dive part 8: Revert the change
Tags: git
Published: 2020-05-08 07:38:48

---
title: git deep dive part 8: Revert the change
published: true
description: git deep dive
tags: git
---

In the [previous article](https://dev.to/kenakamu/git-deep-dive-part-7-cherry-pick-565h), I explain how to cherry pick the commit. In this article, I explain how git [revert](https://git-scm.com/docs/git-revert) works.

# What is revert

So far, every time I change something, I just do ``git reset``. The reason why I can do this without any concern is that I am the only one who is working on the project.

But what if others also working on the same repository? I cannot simply ignore the current commit chain anymore. So how can I revert the change? Let's imagine I want to undo the cherry-pick I did in the previous article which I mark in gray color below.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/djgnngwyt0s1i3g1lvi3.png)

The proper way to revert the change is to create new commit by parenting the last commit.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/l3p2hir4wboyjvoscem5.png)

# What git revert does?

Let's run git revert to see how it works. First make sure I am in master branch and all the commits are there.

```shell
gitDeepDive> git log --oneline --graph --all
* 8618d72 (HEAD -> master) cherry-pick 367c2d0
* c36490a update docs
| * 867d90c (dev) update hello.txt
| * 367c2d0 Update news
|/
* 2adbcac (test) Add doc folder and files
* 16f1fa8 commit hello.txt
```
Run ``git revert`` now. I specify HEAD to specify current commit. This is a bit tricky point that I need to specify the commit I want to revert, not the commit I want to *revert from*.

```shell
git revert HEAD
```
git opens editor to modify the commit comment. I accept the default message. Once revert completed, I run ``git log`` to see the current commit chain. I see the new commit 3705a85 was created. 

```shell
gitDeepDive> git log --oneline --graph --all
* 3705a85 (HEAD -> master) Revert "cherry-pick 367c2d0"
* 8618d72 cherry-pick 367c2d0
* c36490a update docs
| * 867d90c (dev) update hello.txt
| * 367c2d0 Update news
|/
* 2adbcac (test) Add doc folder and files
* 16f1fa8 commit hello.txt
```

I use ``git cat-file -p`` command to see the commit detail. I used ``git cat-file <type>`` and ``git ls-tree`` before, but I can do the same with ``git cat-file -p``. 

The new commit is pointing to the same objects as c36490a, rather than creating new object which makes sense as no contents were modified.

```shell
gitDeepDive> git cat-file -p 3705a85
tree f371f103be5837efc8944c6f600bab8fe4f90bc1
parent 8618d7243be90c53dddb867f118a520570f92eb5
author Kenichiro Nakamura <kenakamu@microsoft.com> 1588922393 +0900
committer Kenichiro Nakamura <kenakamu@microsoft.com> 1588922393 +0900

Revert "cherry-pick 367c2d0"

This reverts commit 8618d7243be90c53dddb867f118a520570f92eb5.
gitDeepDive> git cat-file -p f371f103
040000 tree 4090a77139baf325825d406ce817b2bc1d6df168    docs
100644 blob 1fdc81c0f8321569c31fba418e242973be35c354    hello.txt
gitDeepDive> git cat-file -p c36490a
tree f371f103be5837efc8944c6f600bab8fe4f90bc1
parent 2adbcacc0047a991956dedb4b16691ba244674b3
author Kenichiro Nakamura <kenakamu@microsoft.com> 1588865351 +0900
committer Kenichiro Nakamura <kenakamu@microsoft.com> 1588865351 +0900

update docs
gitDeepDive> git cat-file -p f371f10
040000 tree 4090a77139baf325825d406ce817b2bc1d6df168    docs
100644 blob 1fdc81c0f8321569c31fba418e242973be35c354    hello.txt
```
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/larzun03405l5wj7rg6k.png)

# Summary

Revert is just create new commit pointing to existing object if I revert to previous commit. Of course if I revert from several commits back, I may encounter conflict, and in that case, git may create new object depending on how I resolve the conflict.

I explain stash/apply in the next article.