Toward a Git curriculum for team members
- 1Set up(29w~1m)
- 2Inspecting history(55w~1m)
- 3Referring to commits(11w~1m)
- 4Working in a team(171w~1m)
- 5Doing your work(177w~1m)
- 6Rewriting history(165w~1m)
1Set up
- We assume GNU/Linux.
- Understand that
git config --globalusually modifies the file~/.gitconfig. - Understand that
git configusually modifies the file.git/config. - Understand that Git stores data in the
.gitdirectory.
2Inspecting history
- Read the output of programs that show the newest commit on top.
- Read the output of
git log. - Read the output of
git log -p(that generates diffs). - Read the output of
git log --graph --oneline --decorate. - Read the output of
gitk. - Read the output of
gitk Ref1 ... RefN. - Understand options that are common to
git logandgitk:- refs
--all
- Read the output of
3Referring to commits
- Understand that a reference (a ref) labels a commit.
4Working in a team
- 4.1Synchronizing with others(10w~1m)
- 4.2Coordinating with others(26w~1m)
- 4.3Merging(134w~1m)
4.1Synchronizing with others
- Understand
git fetch. - Understand
git push. - Understand
git push -f.
4.2Coordinating with others
- Avoid trivial merge conflicts.
- Avoid renaming files that others are working on.
- Avoid working on the same fragment that others are working on.
- Avoid noise.
- Avoid changing whitespace/formatting.
4.3Merging
- Understand that a merge commit is a commit with more than one parents.
- Understand that Git merges are textual; Git does not understand programming.
- Understand that
git merge Refmerges Ref to the current branch.- The current branch will be the first parent; X will be the second parent.
- Develop good habits.
- Before
git merge, ensure that the working directory is clean according togit status. - Avoid editing a merge other than what is necessary to resolve conflicts.
- Avoid amending a merge commit.
- Avoid rebasing a merge commit.
- If you feel bad while merging, you can
git merge --abortto restore the repository state to what it was before the merge began.
- Before
- Resolve merge conflicts.
- Understand the three trees/versions: ours, base, and theirs.
- Resolve merge conflicts with
meldandgit gui. - Understand that
meldshows three panes in this order: ours (first parent), base, theirs (second parent).
5Doing your work
- 5.1Developing programs(99w~1m)
- 5.2Switching context(45w~1m)
- 5.3Discarding uncommited changes(33w~1m)
5.1Developing programs
- Do one thing at a time.
- Write the first line of the commit message before working. For example, the first line can be a to-do item title, or an issue identifier and the issue title.
- Do not refactor while adding feature.
- Do not add another feature while adding a feature.
- Have a feeling for commit granularity. A commit may correspond to one code review, an issue in an issue tracker, or something else.
- Every commit should leave the tree in a working state. If your commit breaks something, you may be biting more than you can chew.
- Avoid big conflicts.
- Synchronize often, at least daily.
5.2Switching context
- Avoid using
git stashfor context-switching, because we don't want a merge conflict while doinggit stash pop. Instead, just make an ordinary commit withgit commit, because we can always amend and rebase normal commits and resolve merge conflicts in the usual way.
5.3Discarding uncommited changes
- Discard uncommited changes irrecoverably with
git reset --hard. Note that they cannot be recovered. If you discard them accidentally, you will have to manually type them again. There is no warning.
6Rewriting history
- 6.1Commit-as-diff mental model(29w~1m)
- 6.2Visualizing operations(45w~1m)
- 6.3Rebasing(92w~1m)
6.1Commit-as-diff mental model
This mental model is wrong but useful123 for rewriting history.
- Pretend that a commit is a delta, a diff, a patch.
- Understand cherry-pick as replay.
- Understand rebase as automated/programmatic cherry-pick.
6.2Visualizing operations
If visualization doesn't help you, skip this.
- Think that an operation (commit, rebase, merge, etc.) transforms the picture shown by
gitk.- Visualize a commit as a circle in
gitk. - Visualize the history as a tree of commits (visualize the data structure, not the plant).
- Visualize rebasing as grafting.
- Visualize a commit as a circle in
6.3Rebasing
- Understand rebase as automated cherry-picking.
- Understand what three-argument rebase does with the tree.
- Understand
git merge-basenearest common ancestor (assuming that the repository has only one root).- Understand “nearest common ancestor”.
- Understand the ancestors of a commit.
- Understand the common ancestors of two commits.
- Understand the nearest common ancestors of two commits.
- Understand “nearest common ancestor”.
- Explain one- and two-argument rebase as special cases of three-argument rebase.
- Amend the last commit.
- Use interactive rebase.
- Read the commit list (oldest commit on top, reverse of
git log).
- Read the commit list (oldest commit on top, reverse of
- Understand
--continue,--skip, and--abort. - Join/squash commits.
- Split commits.
- Resolve merge conflicts with
meld. - Resolve rebase conflicts with
meld. - Tidy up commit history before pushing.
- Discard commits.
<2020-01-14> https://en.wikipedia.org/wiki/Lie-to-children↩
<2020-01-14> https://en.wikipedia.org/wiki/All_models_are_wrong↩
<2020-01-14> Knuth TeXbook preface https://twitter.com/johnregehr/status/1060251915777232896↩