lab 16 Undoing Committed Changes

Goals

Undoing Commits 01

Sometimes you realized that a change that you have already committed was not correct and you wish to undo that commit. There are several ways of handling that issue, and the way we are going to use in this lab is always safe.

Essentially we will undo the commit by creating a new commit that reverses the unwanted changes.

Change the file and commit it. 02

Change the hello.rb file to the following.

File: hello.rb

# This is an unwanted but committed change
name = ARGV.first || "World"

puts "Hello, #{name}!"

Execute:

git add hello.rb
git commit -m "Oops, we didn't want this commit"

Create a Reverting Commit 03

To undo a committed change, we need to generate a commit that removes the changes introduced by our unwanted commit.

Execute:

git revert HEAD

This will pop you into the editor. You can edit the default commit message or leave it as is. Save and close the file. You should see …

Output:

$ git revert HEAD --no-edit
[master 16e777e] Revert "Oops, we didn't want this commit"
 1 file changed, 1 insertion(+), 1 deletion(-)

Since we were undoing the very last commit we made, we were able to use HEAD as the argument to revert. We can revert any arbitrary commit earlier in history by simply specifying its hash value.

Note: The --no-edit in the output can be ignored. It was necessary to generate the output without opening the editor.

Check the log 04

Checking the log shows both the unwanted and the reverting commits in our repository.

Execute:

git hist

Output:

$ git hist
* 16e777e 2013-10-06 | Revert "Oops, we didn't want this commit" (HEAD, master) [Ismail Dhorat]
* 4451119 2013-10-06 | Oops, we didn't want this commit [Ismail Dhorat]
* dc44f2e 2013-10-06 | Added a comment (v1) [Ismail Dhorat]
* 5ec54fd 2013-10-06 | Added a default value (v1-beta) [Ismail Dhorat]
* e606a20 2013-10-06 | Using ARGV [Ismail Dhorat]
* 5d95e74 2013-10-06 | First Commit [Ismail Dhorat]

This technique will work with any commit (although you may have to resolve conflicts). It is safe to use even on branches that are publicly shared on remote repositories.

Up Next 05

Next, let’s look at a technique that can be used to remove the most recent commits from the repository history.

Table of Contents