Assignment 6 - GitHub Flow
Objectives
- More practice with Git branching and merging
- Practice of a proper Git workflow to handle merge conflicts properly in a team environment
Interactive class
The Setup, Part A, and Part B of this assignment were worked on in an interactive class.
Setup
- You must have completed Lab: GitHub CLI setup prior to starting this assignment.
- Run the command
git config pull.rebase merge - Click this link: https://classroom.github.com/a/SIP7ZMX7
- Teams:
- The first teammate: Create a name like “alice-bob” using your first names.
- The second (and third) teammate: Join the team your partner made.
- Finally, accept the assignment.
- Click the link to your team repo on the confirmation page.
- You will see a repo like the following:

git clonethe repository to your computer, and open the directory in PyCharm.- Configure
pytest:- If you do not have a
.venv/folder, click the bottom right of PyCharm where your Python version is listed. SelectAdd New Interpreter -> Add Local Interpreter, then hit Okay on the pop-up. - Open an Integrated Terminal window in PyCharm.
- Run
pip install pytest pytest-cov
- If you do not have a
PAUSE HERE and wait for the instructor
Part A - race to main
- Run
main.py, which won’t do much, but may create some additional files in your workspace. - You should be on the
mainbranch. Add a comment with only your name to the top ofmain.pyin a comment, e.g.,# Alice Bobberton. - Stage, commit, and push the change. Some of you will not be able to…
PAUSE HERE and wait for the instructor
What happens? How do you fix the problem?
- The partners need to pull, resolve the conflicts, add, commit, and push the changes.
- Make sure that each partner has added, committed, and pushed their name.
- Once done, all partners
git pullthe main branch.
PAUSE HERE and wait for the instructor
Committing to the same branch in a remote repository is a race. Two, three, five, or 10 people committing to the same branch is chaos.
Part B - proper git flow
B.1 - Group discussion
- Make sure that
main.pyin the remote repo’smainbranch contains all team members’ names. - Make sure everyone’s local
mainbranch is up to date with the remotemainbranch by runninggit pull. - Open
string_stuff.pyand discuss:- Who will implement
reverse_words() - Who will implement
count_vowels() - (If you have a 3-person team): who will implement
is_palindrome() - You do not need to edit
main.pyfor this assignment.
- Who will implement
- Each person creates a new feature branch to work in. Use a descriptive branch name reflective of the work you will be doing, not your name.
PAUSE HERE and wait for the instructor
B.2 - Individual work
- Each person implements their function in their branch – not in the
main/masterbranch. Talk to and help one another. You can use internet resources, but cite them in a comment if you do.- All of your work should be in
string_stuff.py - Do not worry about writing test code yet.
- All of your work should be in
- Remember to do small, incremental commits when appropriate.
- Run
main.pyand manually test your work. - Stage, commit, and
pushyour changes to the remote. Pay attention to the console because you may have to run a variant of thegit pushcommand.
PAUSE HERE and wait for the instructor
Integrate your work with main
Now it is time to integrate your changes into main. It will not be painless as there is still a race, but there is a right way and a wrong way to do it. We already did the wrong way. Here is the right way:
git switch maingit pull: make sure you have the latest changes from themainbranch in case someone else committed something.git switch <your-branch>git merge main: this merges the changes frommaininto your branch.- Resolve any conflicts in your branch and commit the changes to your branch.
git switch main: now we switch back tomaingit merge <your-branch>: bring the changes from your branch into main. This should be smooth because you already resolved merge conflicts between your-branch and main.git push: now push the updatedmainto the remote.
This flow will help ensure that main is “good, clean, code”. Merge conflicts will usually only happen in your branch, which is where you want to deal with them.
If each person completes steps 1-7 before anyone else pushes to main, the process will be smooth. If main changes while you are in the middle of these steps, you will not be allowed to push in step 7. You will have to pull main and resolve the merge conflicts either in main or in your-branch.
Good communication helps
A simple heads-up to your partner of, “Hey, I just pushed some changes to main. Make sure to integrate them into your branch” goes a long way.
And “I’m getting ready to integrate to main. Please don’t push anything yet” also helps.
B.3 - Integrate group work
Ensure that everyone’s changes to their branches are integrated into the main branch using proper merging. Make sure main.py runs and works properly for the completed functions.
Part C - for homework due Monday
Part C will add tests to the project to give you some more practice writing test cases in addition to practicing your Git workflow. Code really isn’t complete until it is tested, and developers write unit tests for the code they implement.
Preparation
- Complete Part B first.
- Ensure that your
mainremote branch is up-to-date, correct, and “good code”. - Ensure that each partner has checked out and pulled the
mainbranch updates. - Ensure that each partner has merged
maininto their branch.
At this point, all branches and main should be at the same version, so everyone is starting from the same place.
Instructions
You will write pytest unit test cases in test_string_stuff.py for each of the functions. Refer to the testing labs as necessary. Work with your partners.
- Individual work
- The partner who wrote a function also writes the tests for that same function in
test_string_stuff.py. - Each partner must write a minimum of two test cases: (1) testing “normal” input, (2) verifying the assertions are raised correctly.
- Commit and push your work to the same branch you worked on while implementing the function, not to
main. - You do not need to write test cases for
main.py.
- The partner who wrote a function also writes the tests for that same function in
- Group integration: Follow the Git Flow from your worksheet to integrate your work into
main. Each person:git switch maingit pull: make sure you have the latest changes from themainbranch in case someone else committed something.git switch <your-branch>git merge main: this merges the changes frommaininto your branch.- Resolve any conflicts in your branch and commit the changes to your branch.
git switch main: now we switch back tomaingit merge <your-branch>: bring the changes from your branch into main. This should be smooth because you already resolved merge conflicts between your-branch and main.git push: now push the updatedmainto the remote.
- Finishing up:
- Make sure that all functions and tests work in the
mainbranch. - Ensure that you have total branch coverage of the functions you implemented in
string_stuff.py.- You do not need to commit any coverage information to your repo. The
.gitignorefile should be ignoring these files, and that’s okay!
- You do not need to commit any coverage information to your repo. The
- Make sure that your “final” version of
mainis pushed to GitHub.
- Make sure that all functions and tests work in the
Assignment 6 Rubric
- (15pts)
git loghistory shows multiple commits to each partner’s branch and integration into main following the prescribed Git Flow - (15pts) Final version of
maincontains functionally correct implementations and test cases achieving 100% branch coverage of all functions implemented instring_stuff.py.
Final submission due Sunday, October 26
You will push all your branches and finished code to GitHub.