Changing Versions

The point of a version control system such as Git is that you can move between different versions of a file (or, really, of a working directory). This means that you can make changes to files while safe in the knowledge that the old versions of the file are still safe. This can save you from having to save multiple versions of a file, e.g. script.py, script_v01.py, script_v02.py etc. etc.

To see all of the available versions of your working directory, type the command

git log

You should see output that is similar (but definitely not identical) to this

commit a8b9f7402708d8830e30a510aa55bc5bd20e0b7b
Author: Christopher Woods <chryswoods@gmail.com>
Date:   Wed Oct 28 15:49:24 2015 +0000

    Added some text to something.md to see if this was found by Git

commit 9253499e0caa7c196cf7a9737de93f3c67c2e2e8
Author: Christopher Woods <chryswoods@gmail.com>
Date:   Wed Oct 28 15:40:02 2015 +0000

    Fixing a typo in README.md. Cats do not go woof.

commit facfd1c1ffebe8e9a5b8fc4de284cdff112a1e39
Author: Christopher Woods <chryswoods@gmail.com>
Date:   Wed Oct 28 15:38:26 2015 +0000

    Added in another file

commit 63d4556a8c9dde08960440f49cf3fbbaf2e65bed
Author: Christopher Woods <chryswoods@gmail.com>
Date:   Wed Oct 28 15:11:42 2015 +0000

    Added the file README.md so that we have an initial file to
    play with in Git

Each commit is listed, one after another, starting from the latest commit and moving back to the first commit. Each commit represents a different version of the working directory, and is given its own unique ID, e.g. a8b9f7402708d8830e30a510aa55bc5bd20e0b7b.

Each commit is also tagged with the name and email address of the person who committed, together with the commit message. Hopefully you can now see why this information needed to be given to Git.

By default, git log will show information about all commits. To limit the output to only the last N commits, use the -n option. For example, to print out the log of the last 3 commits, type

git log -n 3

The log also records the date and time of each commit, and indeed, each commit represents the working directory at a different point in time. You can “move” your working directory through time by “checking out” different versions. To do this, you will need to use the unique ID of the commit you want to change to, and you will need to use the git checkout ID. where ID is the ID of the version you want to change to.

Now, change back to the first version of your working directory. In my case, this is version 63d4556a8c9dde08960440f49cf3fbbaf2e65bed (the ID of the last commit printed out by git log). For me, I do this by typing

git checkout 63d4556a8c9dde08960440f49cf3fbbaf2e65bed

You will have to use the ID number of your first version.

You should see Git output something similar to this;

Note: checking out '63d4556a8c9dde08960440f49cf3fbbaf2e65bed'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 63d4556... Added the file README.md so that we have an initial file to play with in Git

This confirms that Git has now changed the working directory to match version 63d4556a8c9dde08960440f49cf3fbbaf2e65bed. It also outputs some useful information that we will come back to later…

Type ls. You should see now that there is only the file README.md in your working directory. Take a look at README.md using your text editor. You should see that this is the original version of the file, in which the cat goes woof.

To return back to the newest version of the working directory, type

git checkout master

You should get output similar to

Previous HEAD position was 63d4556... Added the file README.md so that we have an initial file to play with in Git
Switched to branch 'master'

Now, typing ls should reveal that you have both README.md and something.md. If you take a look at README.md, you should see that this is the fixed version of the file, in which the cat goes mieow.

Note that you should not edit files in an old version of the working directory. At the moment, you should treat this as a read-only view of past versions of files.

You can retrieve an old version of a file and pull it into the new version of the working directory. To do this, use git checkout on the file that you want to restore. For example, if we want to revert back to the original version of README.md (in which the cat goes woof), then use;

git checkout 63d4556a8c9dde08960440f49cf3fbbaf2e65bed README.md

where the ID number is the one from your git log output. Type git status and you should see something like

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   README.md
#

This shows that README.md has been changed. Take a look at the file in your text editor. You should see that you have restored the old version of the file, where the cat goes woof.

If you want to keep this old version, then use git commit -a to save this change. However, you can revert this change using the command

git checkout master README.md

This command tells Git to discard any changes made to README.md and to revert that file back to what it is like in the last committed version of the working directory. Note here that master is a special (global) Git version, which refers to the latest commit of the working directory.

If you now run git status you should see that the working directory is clean, and a quick check of README.md in a text editor should show you that the cat is indeed going mieow again.


Exercise

Use git checkout ID to move the working directory to the version before you changed something.md. Verify that something.md is indeed now the old version.

Use git checkout master to move the working directory back to the latest commit. Verify that something.md is the new version.

Use git checkout ID something.md to revert something.md to its old version.

Use git commit -a to now commit the old version of something.md to the latest version of the working directory, thereby replacing the new version. Make sure you write a good commit message to explain what you have done.

Use git status to double-check that your working directory is now clean.


Previous Up Next