Exercises Directory

EXERCISE 1: under-control

To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download under-control command.

Scenario:

Your task:

When you download a Git-Mastery exercise, the output will tell you which directory you need to cd into, for you to start the exercise:

Put the folder under-control/control-me under Git's control (i.e., initialise a repository in the control-me folder).


To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/under-control folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/under-control folder and run the gitmastery progress reset command.


EXERCISE 2: stage-fright

To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download stage-fright command.

Scenario:

Your task:

The attendance repo has three unstaged files. Stage them.


To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/stage-fright folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/stage-fright folder and run the gitmastery progress reset command.


EXERCISE 3: staging-intervention

To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download staging-intervention command.

Scenario:

Your task:

In the repo intervention given, unstage the following files: adam.txt, josh.txt, mary.txt. Keep other files staged.


To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/staging-intervention folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/staging-intervention folder and run the gitmastery progress reset command.


EXERCISE 4: grocery-shopping

To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download grocery-shopping command.

Scenario:

Your task:

In the shopping-list repo given, there is a shopping-list.txt.

  1. Edit it to remove at least one item from the shopping list and add at least one new item to the shopping list.
  2. Stage the change and commit it.

To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/grocery-shopping folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/grocery-shopping folder and run the gitmastery progress reset command.


EXERCISE 5: log-and-order

To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download log-and-order command.

Scenario:

You are given a repo crime-spree (apparently, containing details of some crimes).

Your task:

  1. Open the log-and-order/answers.txt file to find the questions you need to answer.
  2. Examine the list of commits in the crime-spree repo to find the answers.
  3. Enter your answers in the answers.txt file.

To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/log-and-order folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/log-and-order folder and run the gitmastery progress reset command.


EXERCISE 6: remote-control

To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download remote-control command.

Scenario:

Your task:

  1. As per the usual practice, cd into the remote-control folder.
  2. Run gitmastery verify command.
  3. Take note of the repo name provided by Git-Mastery app (in its response).
  4. Create a new public GitHub repository using the repo name given.
  5. Provide the URL of that remote (without the .git at the end) when prompted
    e.g., https://github.com/johndoe/gitmastery-johndoe-remote-control

To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/remote-control folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/remote-control folder and run the gitmastery progress reset command.


To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download link-me command.

Scenario:

Your task:

In the link-this repo provided, add the git-mastery/link-me repository as a remote named upstream.


To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/link-me folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/link-me folder and run the gitmastery progress reset command.


EXERCISE 8: push-over

To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download push-over command.

Scenario:

Your task:

Create a new commit on the main branch of the local repo in push-this folder, and push the updated main branch to the remote.


To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/push-over folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/push-over folder and run the gitmastery progress reset command.


EXERCISE 9: ignoring-something

To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download ignoring-something command.

Scenario:

Your task:

1. Update the .gitignore file (inside the files/ folder) to reflect the following requirements:

  • Git should ignore every file in the many/ folder except the file many/file22.txt.
  • why_am_i_hidden.txt should not be ignored by Git.
  • ignore_me.txt should be ignored by Git.
  • Git should ignore any runaway.txt file in this/ and any of its current and future subfolders (hint: use a pattern).

2. Commit the updated .gitignore file.


To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/ignoring-something folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/ignoring-something folder and run the gitmastery progress reset command.


EXERCISE 10: fork-repo

To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download fork-repo command.

Scenario:

Your task:

Fork the repo https://github.com/git-mastery/gm-shapes to your GitHub account, while retaining the original repo name gm-shapes.


To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/fork-repo folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/fork-repo folder and run the gitmastery progress reset command.


EXERCISE 11: clone-repo

To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download clone-repo command.

Scenario:

Your task:

  1. Fork the repo https://github.com/git-mastery/gm-shapes to your GitHub account, if you haven't done so already. Retain the original repo name gm-shapes.
  2. Clone the fork to your computer, placing it in the folder clone-repo/shapes (note how the target folder is shapes, not gm-shapes).
    If you did this step correctly, you should now have local repo shapes.
  3. Set up a remote named upstream in that shapes repo, to point to the upstream repo git-mastery/gm-shapes.

To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/clone-repo folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/clone-repo folder and run the gitmastery progress reset command.


EXERCISE 12: fetch-and-pull

To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download fetch-and-pull command.

Scenario:

Your task:

You have been given a clone of the git-mastery/gm-shapes repo.

  1. Another developer Alice has created a remote copy of this repo at https://github.com/git-mastery/gm-shapes-alice which seems to have an additional commit in the main branch.
    • Add that repo as a remote named alice-upstream.
    • Bring over Alice's additional commit to your repo.
  2. Alice's friend Bob has copied Alice's repo to https://github.com/git-mastery/gm-shapes-bob, and added one more commit.
    • Add that repo as another remote named bob-upstream.
    • Download the metadata about this new commit (i.e., fetch, not pull or merge) to your repo.

To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/fetch-and-pull folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/fetch-and-pull folder and run the gitmastery progress reset command.


EXERCISE 13: side-track

To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download side-track command.

Scenario:

Your task:

While you are working on a small Python project in the branch-me repo, you discovered two bugs. You wish to fix them in a separate branch named bug-fix, as two separate commits.

The steps to follow are given below:

This repo uses main (not master) as the default branch.

  1. Create a branch named bug-fix.
    Switch to that branch.
  2. Update the greet.py file so that the greet function uses the name variable in the output, as follows:
    -    print("Hi Alice")
    +    print(f"Hi {name}")
    
    Commit the changes.
  3. Update the calculator.py file such that the add function returns the sum of two numbers, as follows:
     def add(a, b):
    -    return a - b
    +    return a + b
    
    Commit the changes.
  4. Switch back to the main branch.

The final result should be something like this:

gitGraph BT:
    %%{init: { 'theme': 'default', 'gitGraph': {'mainBranchName': 'main'}} }%%
    commit id: "[HEAD → main] ..."
    branch bug-fix
    commit id: "Fix greet.py"
    commit id: "[feature] Fix calculator.py"
    checkout main

To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/side-track folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/side-track folder and run the gitmastery progress reset command.


EXERCISE 14: branch-bender

To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download branch-bender command.

Scenario:

Your task:

Do the following operations in the given webapp repo, in the given order:

  1. Merge feature/login onto the main branch, while ensuring a merge commit is created (i.e., no fast-forwarding).
  2. Merge feature/dashboard onto the main branch.
  3. Merge feature/payments onto the main branch.

The final result should look like this:

gitGraph
commit
branch feature/login
checkout main
branch feature/dashboard
checkout main
branch feature/payments
checkout feature/login
commit
commit
checkout main
merge feature/login
checkout feature/dashboard
commit
commit
commit
checkout main
merge feature/dashboard
checkout feature/payments
commit
commit
checkout main
merge feature/payments

To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/branch-bender folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/branch-bender folder and run the gitmastery progress reset command.


EXERCISE 15: branch-forward

To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download branch-forward command.

Scenario:

You are writing the outline for a story. You now have two parallel storylines in two branches.

Your task:

Merge only the branch(es) that can be fast-forwarded. Use fast-forward merging.

Tip: Ensure you have switched to the destination branch before initiating the merge.


To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/branch-forward folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/branch-forward folder and run the gitmastery progress reset command.


EXERCISE 16: merge-undo

To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download merge-undo command.

Scenario:

You are keeping notes on the characters of a play that you are writing. In the main story line (which is in the main branch), you introduced two characters, Rick and Morty. You had two other characters in two separate branches daughter and son-in-law. Just now, you introduced these two characters to the main story line by merging the two branches to the main branch.

gitGraph BT:
    commit id: "Add Rick"
    branch daughter
    branch son-in-law
    checkout daughter
    commit id: "[daughter] Add Beth"
    checkout son-in-law
    commit id: "[son-in-law] Add Jerry"
    checkout main
    commit id: "Add Morty"
    merge daughter id: "Merge daughter"
    merge son-in-law id: "[HEAD → main] Merge son-in-law"

However, now you realise this is premature, and wish to undo that change.

Your task:

Undo the merging of branches son-in-law and daughter. The result should be as follows:

gitGraph BT:
    commit id: "Add Rick"
    branch daughter
    branch son-in-law
    checkout daughter
    commit id: "[daughter] Add Beth"
    checkout son-in-law
    commit id: "[son-in-law] Add Jerry"
    checkout main
    commit id: "[HEAD → main] Add Morty"

To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/merge-undo folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/merge-undo folder and run the gitmastery progress reset command.


EXERCISE 17: conflict-mediator

To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download conflict-mediator command.

Scenario:

Your task:

The given repo conflict has an unmerged branch josh and a merged branch john.
Merge branch josh onto main. This will result in a merge conflict in the script.py file.
Resolve the merge conflict and complete the merge.
The intended outcome is print('Hello Everyone and World!').


To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/conflict-mediator folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/conflict-mediator folder and run the gitmastery progress reset command.


EXERCISE 18: branch-rename

To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download branch-rename command.

Scenario:

In the rename-this repo, you have been working on the login feature for your application on the branch login. On second thoughts, you now wish you had named it feature/login, to indicate the category of work done in the branch.

gitGraph BT:
    commit id: "m1"
    commit id: "m2"
    branch login
    commit id: "b1"
    checkout main
    commit id: "[HEAD → main] m3"
    checkout login
    commit id: "[login] b2"

Your task:

In the rename-this repo, rename the login branch to feature/login.

Expected result:

gitGraph BT:
    commit id: "m1"
    commit id: "m2"
    branch feature/login
    commit id: "b1"
    checkout main
    commit id: "[HEAD → main] m3"
    checkout feature/login
    commit id: "[feature/login] b2"

To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/branch-rename folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/branch-rename folder and run the gitmastery progress reset command.


EXERCISE 19: branch-delete

To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download branch-delete command.

Scenario:

In the delete-my-branches repo, you were trying out two alternative optimisation approaches in two parallel branches optimization-approach-1 and optimization-approach-2, to decide which one is better.

You decided that the approach in the branch optimization-approach-1 is better and merged it. As the work has already been merged, you can now delete that branch to reduce clutter.

gitGraph BT:
    commit id: "Implement loading"
    commit id: "Fix loading bug"
    branch opt...approach-1
    commit id: "Apply bubble sort"
    commit id: "[opti...-1] Fix sorting bug"
    checkout main
    branch opt...approach-2
    commit id: "[opti...-2] Apply merge sort"
    checkout main
    merge opt...approach-1 id: "[HEAD → main] Merge ...'...approach-1"

Since you no longer need the work done in the branch optimization-approach-2, you can discard it by deleting the branch.

Your task:

  1. Delete the optimization-approach-1 branch.
  2. Delete the optimization-approach-2 branch as well.

Expected outcome:

gitGraph BT:
    commit id: "Implement loading"
    commit id: "Fix loading bug"
    branch _
    commit id: "Apply bubble sort"
    commit id: "Fix sorting bug"
    checkout main
    merge _ id: "[HEAD → main] Merge ...'...approach-1"

To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/branch-delete folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/branch-delete folder and run the gitmastery progress reset command.


EXERCISE 20: mix-messy-docs

To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download mix-messy-docs command.

Scenario:

You are writing user documentation for a product. You have already written documentation for a few new features, each in a separate branch. You wish to accumulate this work in a separate branch called development until the next product release.

gitGraph BT:
  commit id: "Add features.md"
  commit id: "Mention feature for creating books" tag: "v10"
  branch feature-search
  branch feature-delete
  branch list
  checkout feature-delete
  commit id: "Mention feature for deleting books"
  checkout feature-search
  commit id: "Mention feature for searching books"
  checkout feature-delete
  commit id: "Add missing period"
  checkout main
  commit id: "Fix phrasing of heading"
  checkout feature-search
  commit id: "Add more details on the search feature"
  checkout list
  commit id: "Add partial docs for listing books"

Your task:

  1. Create a new branch development, starting from the commit tagged v1.0
  2. Merge the feature-search branch onto the development branch, without using fast-forwarding (i.e., create a merge commit). Delete the feature-search branch.
  3. Similarly, merge the feature-delete branch onto the development branch. Resolve any merge conflicts -- in the features.md, the delete feature should appear after the search feature (see below). Delete the feature-delete branch.
    features.md
    # Features
    
    ## Create Book
    
    Allows creating one book at a time.
    
    ## Searching for Books
    
    Allows searching for books by keywords.
    Works only for book titles.
    
    ## Deleting Books
    
    Allows deleting books.
    
  4. The list branch is not yet ready to be merged but rename it as feature-list, to be consistent with the naming convention you have been following in this repo.

Expected final result:

gitGraph BT:
  commit id: "Add features.md"
  commit id: "Mention feature for creating books" tag: "v10"
  branch deleted-feature-search
  branch deleted-feature-delete
  branch feature-list
  branch development
  checkout deleted-feature-delete
  commit id: "Mention feature for deleting books"
  checkout deleted-feature-search
  commit id: "Mention feature for searching books"
  checkout deleted-feature-delete
  commit id: "Add missing period"
  checkout main
  commit id: "Fix phrasing of heading"
  checkout deleted-feature-search
  commit id: "Add more details on the search feature"
  checkout feature-list
  commit id: "Add partial docs for listing books"
  checkout development
  merge deleted-feature-search
  merge deleted-feature-delete

To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/mix-messy-docs folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/mix-messy-docs folder and run the gitmastery progress reset command.


EXERCISE 21: mix-messy-graph

To download the exercise:

  • Navigate inside the gitmastery-exercises folder.
  • Run gitmastery download mix-messy-graph command.

Scenario:

You are writing user documentation for a product. You have already written documentation for a few new features, each in a separate branch. You have merged the feature-search branch.

gitGraph BT:
  commit id: "Add features.md"
  commit id: "Mention feature for creating books" tag: "v10"
  branch feature-search
  branch feature-delete
  branch list
  checkout feature-delete
  commit id: "Mention feature for deleting books"
  checkout feature-search
  commit id: "Mention feature for searching books"
  checkout feature-delete
  commit id: "Add missing period"
  checkout main
  commit id: "Fix phrasing of heading"
  checkout feature-search
  commit id: "Add more details on the search feature"
  checkout list
  commit id: "Add partial docs for listing books"
  checkout main
  merge feature-search id: "Merge search feature"

At this point, you realise this way of merging can result in a complicated revision graph. Instead, you wish to merge these changes in a way that results in a simple linear revision graph.

Your task:

  1. Undo the merging of feature-search.

  2. Squash-merge the feature-search branch onto the main branch with the commit message Add the search feature. Delete the feature-search branch.

  3. Similarly, squash-merge and delete the feature-delete branch with the commit message Add the delete feature, while resolving any merge conflicts -- in the features.md, the delete feature should appear after the search feature (expected content given below):

    features.md
    # Features
    
    ## Creating Books
    
    Allows creating one book at a time.
    
    ## Searching for Books
    
    Allows searching for books by keywords.
    Works only for book titles.
    
    ## Deleting Books
    
    Allows deleting books.
    
  4. The list branch is not needed, as you have decided not to have that feature. Delete that branch. The resulting revision graph should be as follows:

gitGraph BT:
  commit id: "Add features.md"
  commit id: "Mention feature for creating books" tag: "v10"
  commit id: "Fix phrasing of heading"
  commit id: "Add the search feature"
  commit id: "Add the delete feature"

To verify your work:

  • Navigate to anywhere inside the gitmastery-exercises/mix-messy-graph folder (or any sub-folder of it).
  • Run the gitmastery verify command.

To reset the exercise and start over, navigate to the gitmastery-exercises/mix-messy-graph folder and run the gitmastery progress reset command.