Feature Branches

Web Only

This textbook was authored for the CIS 400 - Object-Oriented Design, Implementation, and Testing course at Kansas State University. This section describes assignments specific to the Fall 2022 offering of that course. If you are not enrolled in the course, please disregard this section.

As we are creating a project iteratively this semester, it is a good chance to practice using feature branches with Git. This is a skill you will likely need to use in your future development efforts and career, and it can help solve many problems you may otherwise encounter when developing a project iteratively.

Using Remote-Tracking Feature Branches

In the GitHub section, we talked about both feature branches and remote repositories. It is important to understand that when you create a branch, you do so in the local (i.e. on your machine) repository.

For example, if you wanted to create a feature branch for data milestone 1, you would use this Git command on your development machine:

$ git branch ms1

And then check it out using the command:

$ git checkout ms1

As you work you can add and commit as normal, i.e.:

$ git add . 
$ git commit -a -m "A description of what changed"

Any commits you make will be made on the feature branch ms1, not your main branch.

Pushing Feature Branches to GitHub

At this point, your feature branch, and any of its commits, are only on your local machine. If you want to make them available on your origin (GitHub) repository, you’ll need to push them there. You can do this with the command:

$ git push origin ms1

This creates a corresponding branch, ms1 in your GitHub repository, and pushes all the changes from your local ms1 branch to your GitHub one (which is often referred to as origin/ms1).

Warning

The git push command pushes the currently checked out local branch to the specified branch of the specified remote repository. So if you have the local ms1 branch checked out and push to the origin repo ms1 branch, your two branches will be in sync.

But if you have a different branch checked out, i.e. ms2 and issue the command git push origin ms1, your local ms2 changes will be applied to your remote ms1 branch!

Likewise, if you specify a different remote branch to push to, i.e. you have ms1 checked out but use the command git push origin master, the changes from your local ms1 branch will be applied to your remote master branch.

Thus, you should always be certain you are pushing to the correct branch. You can check what branch is currently checked out with the command:

$ git branch  

This will list all local branches, and the currenlty checked out one will have an astrisk next to it (*).

Pushing a feature branch named in accordance with the guidelines (i.e. ms1, ms2) to your origin repository will trigger an evaluation by the Pendant tool if you have webhooks set up. You can visit the tool at: https://pendant.cs.ksu.edu to see the results.

Pulling a Remote Feature Branch to Another Local Machine

The other big benefit to pushing your feature branches to GitHub is that you can then pull them into other local repos you have cloned on other machines. For example, if you pushed your changes from a lab computer, you can pull those changes into a corresponding branch on your home PC.

However, there is one more step involved the first time you pull a new branch, as you will need a local branch to correspond to it. You can create that branch, and set it up to track the remote branch, with a single command:

$ git checkout -b ms1 origin/ms1

This command creates a local branch ms1 that tracks the remote branch origin/ms1. Because the local ms1 branch now tracks origin/ms1, when you have it checked out, you can use the command:

$ git pull 

And git will pull from origin/ms1 into the local ms1 branch. Alternatively, you can use the full command:

$ git pull origin ms1 

But you must again be careful that you are pulling the right corresponding branch.

Merging your Feature Branch into Master

Finally, when you have finished the milestone, you’ll want to merge your new changes from the feature branch into the main branch:

$ git checkout main 
$ git merge ms1 

And push the newly expanded main branch to GitHub:

$ git push origin main

After which you’ll need to create a release to turn in.