Getting your hands dirty with Githug

Programming Image


    Githug is an awesome program to help you improve your git skills. It contains several levels, that start off with some easy tasks and will go deeper with every level. At first, you start with initializing a bare git repo, adding and committing files, and configuring the .gitignore file. But then you get to remote repositories, stashing, rebasing, merging, and reflogs. I found it very useful, to improve my knowledge about git and found myself reading the man files more often, getting to know some awesome details about git.

    Githug is written in Ruby and maintained on Github. There are more levels to come, so this blog will be updated continuously. If you find any errors or missing levels, feel free to comment below.


    Githug requires Ruby 1.8.7 or higher. You can check which version of Ruby is installed with the following command:

    ruby --version

    If ruby is not installed, follow the installation instructions on

    Once you have installed Ruby, you're good to install Githug. To install it, run the command:

    gem install githug

    If you get a complaint about permissions, you can rerun the command with sudo:

    sudo gem install githug


    Game Instructions

    After Githug is installed, change the directory to the location where you want the game-related assets to be stored. Then run githug:


    You will be prompted to create a directory.

    No githug directory found, do you wish to create one? [yn]

    Type y (yes) to continue, n (no) to cancel and quit Githug.


    Githug has 4 game commands:

    • githug play - The default command, checks your solution for the current level
    • githug hint - Gives you a hint (if available) for the current level
    • githug reset - Reset the current level or reset the level to a given name or path
    • githug levels - List all the levels

    Also, before you start the game, make sure, your branch at this stage is master. If it's not, change your branch to master using the command:

    git checkout -b master



    As I had some trouble myself with some of those levels, I thought, that it might be helpful for other people to find a solution to the levels. I decided to make my solutions available, hoping they might help you. My approach to solving the levels might differ from your approach, but that’s the beauty of such problems. There often isn’t this one way to get things done. But without any further ado, here’s my solution.

    Make sure you move into the git_hug directory created by Githug to continue with the game.

    cd git_hug

    Level 1: init

    A new directory, git_hug, has been created; initialize an empty repository in it.

    git init


    Level 2: config

    Set up your git name and email, this is important so that your commits can be identified.

    git config --global "Ashutosh Krishna"
    git config --global "[email protected]"


    Level 3: add

    There is a file in your folder called README, you should add it to your staging area
    Note: You start each level with a new repo. Don't look for files from the previous one.

    git add README


    Level 4: commit

    The README file has been added to your staging area, now commit it.

    git commit -m "Add README"


    Level 5: clone

    Clone the repository at

    git clone

    Level 6: clone_to_folder

    Clone the repository at to my_cloned_repo.

    git clone my_cloned_repo


    Level 7: ignore

    The text editor 'vim' creates files ending in .swp (swap files) for all files that are currently open.  We don't want them creeping into the repository.  Make this repository ignore those swap files which are ending in .swp.

    vim .gitignore

    This opens the 'vim' editor. Press I to Insert Text and add the following in the .gitignore file:


    To save and exit, press the Esc key and type :wq, and press Enter.

    Level 8: include

    Notice a few files with the '.a' extension.  We want git to ignore all but the 'lib.a' file.

    vim .gitignore

    Add the following in the .gitignore file:



    Level 9: status

    There are some files in this repository, one of the files is untracked, which file is it?

    git status


    Level 10: number_of_files_committed

    There are some files in this repository, how many of the files will be committed?

    git status


    Level 11: rm

    A file has been removed from the working tree, however the file was not removed from the repository.  Find out what this file was and remove it.

    git status
    git rm deleteme.rb


    Level 12: rm_cached

    A file has accidentally been added to your staging area, find out which file and remove it from the staging area.

    *NOTE* Do not remove the file from the file system, only from git.

    git status
    git rm --cached deleteme.rb


    Level 13: stash

    You've made some changes and want to work on them later. You should save them, but don't commit them.

    git stash


    Level 14: rename

    We have a file called oldfile.txt. We want to rename it to newfile.txt and stage this change.

    git mv oldfile.txt newfile.txt
    git add newfile.txt


    Level 15: restructure

    You added some files to your repository, but now realize that your project needs to be restructured.  Make a new folder named src and using Git move all of the .html files into this folder.

    mkdir src
    git mv *.html src


    Level 16: log

    You will be asked for the hash of most recent commit.  You will need to investigate the logs of the repository for this.

    git log


    Level 17: tag

    We have a git repo and we want to tag the current commit with new_tag.

    git tag new_tag


    Level 18: push_tags

    There are tags in the repository that aren’t pushed into remote repository. Push them now.

    git push --tags


    Level 19: commit_amend

    The README file has been committed, but it looks like the file forgotten_file.rb was missing from the commit. Add the file and amend your previous commit to include it.

    git add forgotten_file.rb
    git commit --amend


    Level 20: commit_in_future

    Commit your changes with the future date (e.g. tomorrow).

    git commit --date=2022-01-18


    Level 21: reset

    There are two files to be committed. The goal was to add each file as a separate commit, however both were added by accident. Unstage the file to_commit_second.rb using the reset command (don’t commit anything).

    git reset HEAD to_commit_second.rb


    Level 22: reset_soft

    You committed too soon. Now you want to undo the last commit, while keeping the index.

    git reset --soft HEAD^


    Level 23: checkout_file

    A file has been modified, but you don't want to keep the modification.  Checkout the config.rb file from the last commit.

    git checkout config.rb


    Level 24: remote

    This project has a remote repository.  Identify it.

    git remote


    Level 25: remote_url

    The remote repositories have a url associated to them.  Please enter the url of remote_location.

    git remote -v


    Level 26: pull

    You need to pull changes from your origin repository.

    git pull origin master


    Level 27: remote_add

    Add a remote repository called `origin` with the url

    git remote add origin


    Level 28: push

    Your local master branch has diverged from the remote origin/master branch. Rebase your commit onto origin/master and push it to remote.

    git rebase origin/master master
    git push origin master


    Level 29: diff

    There have been modifications to the app.rb file since your last commit.  Find out which line has changed.

    git diff

    This outputs:

    diff --git a/app.rb b/app.rb
    index 4f703ca..3bfa839 100644
    --- a/app.rb
    +++ b/app.rb
    @@ -23,7 +23,7 @@ get '/yet_another' do
       erb :success
     get '/another_page' do
    -  @message = get_response('data.json')
    +  @message = get_response('server.json')
       erb :another

    The changes start at Line 23 and the next three lines are changed. So the answer is 26.


    Level 30: blame

    Someone has put a password inside the file `config.rb` find out who it was.

    git blame config.rb


    Level 31: branch

    You want to work on a piece of code that has the potential to break things, create the branch test_code.

    git branch test_code


    Level 32: checkout

    Create and switch to a new branch called my_branch.  You will need to create a branch like you did in the previous level.

    git checkout -b my_branch


    Level 33: checkout_tag

    You need to fix a bug in the version 1.2 of your app. Checkout the tag v1.2.

    git checkout v1.2


    Level 34: checkout_tag_over_branch

    You need to fix a bug in the version 1.2 of your app. Checkout the tag v1.2 (Note: There is also a branch named v1.2).

    git checkout tags/v1.2


    Level 35: branch_at

    You forgot to branch at the previous commit and made a commit on top of it. Create branch test_branch at the commit before the last.

    git branch test_branch HEAD^

    To know more about HEAD, HEAD^ and HEAD~, refer to this tutorial.

    Level 36: delete_branch

    You have created too many branches for your project. There is an old branch in your repo called 'delete_me', you should delete it.

    git branch -d delete_me


    Level 37: push_branch

    You've made some changes to a local branch and want to share it, but aren't yet ready to merge it with the 'master' branch.  Push only 'test_branch' to the remote repository

    git push origin test_branch


    Level 38: merge

    We have a file in the branch feature; Let's merge it to the master branch.

    git merge feature


    Level 39: fetch

    Looks like a new branch was pushed into our remote repository. Get the changes without merging them with the local repository

    git fetch


    Level 40: rebase

    We are using a git rebase workflow and the feature branch is ready to go into master. Let's rebase the feature branch onto our master branch.

    git checkout feature
    git rebase master


    If you read this far, support the author to show them you care.


    To add a comment, please Signup or Login