Changes to IBAMR's source code are managed with the git version control system. IBAMR's developers work on GitHub with the https://www.github.com/IBAMR/ organization.
GitHub, as the name implies, is a tool for working with git repositories: we use GitHub to track things that need to be fixed or improved in IBAMR with the issue tracker.
IBAMR has about a dozen regular contributors, who, at any time, are working on dozens of new features and fixes. We use git to track these changes, handle merging of new features, and keep a log of all commited changes to the library.
Changes to IBAMR are peer-reviewed: instead of simply pushing new features as they are finished, all changes undergo a period when the core IBAMR developers review the new code and check it for possible bugs, style problems, and consistency with the rest of the library. Git facilitates this workflow with branches: changes to IBAMR are first commited to branches, which are then considered (via GitHub's pull request mechanism) for merging with the master branch of GitHub. This is a simplified variant of what is usually called the gitflow model: the primary difference being that our develop and master branches are the same. Some branches for IBAMR are actively developed by multiple users; these branches are located in the IBAMR repository on GitHub itself. It is also possible to develop branches outside of the IBAMR organization: this is discussed below in the Forking, Cloning, and making a simple fix example.
If you are new to git and GitHub we recommend starting with the spoon-knife (all its missing is a fork) example to see how forks and clones work.
The easiest way to get started with IBAMR is to create a GitHub account and fork the official (that is, https://www.github.com/IBAMR/IBAMR) IBAMR repository by clicking on the Fork button in the top right. This will create a separate copy of the IBAMR/IBAMR repository in your own GitHub account. After doing this, you can clone the repository to your local computer in the same way as was done for Spoon-Knife.
Once you have a local copy of IBAMR you can start making changes. With a brand-new repository one usually needs to set their authorship information:
git config --local user.name "John Doe" git config --local user.email "john.doe@lab.gov"
It is usually helpful to tell the git repository on your computer about a few other git repositories: these are called remotes. The most important remote is your fork on GitHub (which is, itself, another git repository). The convention is to call this remote the origin. Similarly, the official IBAMR repository on GitHub is, by convention, called the upstream remote. If you cloned your GitHub fork then that fork should be set as your origin:
> git remote show origin
* remote origin
Fetch URL: https://github.com/john.doe/ibamr
Push URL: https://github.com/john.doe/ibamr
HEAD branch: master
[...]
if this isn't set up, then try running
git remote add origin https://github.com/john.doe/ibamr
Use the same command to set up upstream:
git remote add upstream https://github.com/ibamr/ibamr
That should be all the configuration your local repository needs: at this point your authorship information is set up and the repository is correctly linked with your copy of IBAMR on GitHub and the official IBAMR repository.
Suppose that you wanted to add another function to
ibtk/src/lagrangian/LEInteractor.cpp
. You should start by creating a branch
with a relevant name. If we added a function that calculated the number of
interaction points, for example, we should name it something like
git checkout -b add-leinteractor-count-ib-points
Once we are on the branch and have made changes we can stage changes by executing
git add ibtk/src/lagrangian/LEInteractor.cpp
and then commit them with a brief but explanatory message:
git commit -m "Added a function for counting IB points."
You can inspect the commit by viewing the commit log:
git log
which will show the commit message, commit hash, time and date, and authorship information. Once this is done, one can put the commit on GitHub by running
git push origin add-leinteractor-count-ib-points
and, navigating to https://github.com/ibamr/ibamr, one can then open a pull
request by hitting the button Compare & Pull Request
.
Sometimes its necessary to take a sequence of commits on a branch (here
feature-branch
) and reorder, reword, or recombine them in some way. The best
way to do this is to do an interactive rebase:
git checkout feature-branch
git rebase -i master
This does two things:
- It puts the commits in
feature-branch
on top of those inmaster
: if there are merge conflicts, then git will stop and ask you to fix them. - The
-i
for (interactive) flag displays, in your editor, the commits and their hashes. Each line contains one commit: one can reorder commits by reordering the lines. Changingpick
in the leftmost column will alter what is done with the commit:reword
: change the commit messagefixup
: combine this commit with the one above it. The commit message is removed.squash
: combine this commit with the one above it. The commit message is kept.edit
: Keep the commit, but pause the rebase afterwards so that one can make additional changes.
After rebasing it is necessary to force push the newly edited commit history for
feature-branch
to the remote branch. This can be achieved using:
git push -f origin feature-branch
The commit history for the remote branch should now reflect the edited local
changes made to feature-branch
.
One can also use rebasing to keep a branch up to date with another branch:
suppose you have made lots of commits on feature-branch
and other developers
have made commits on master
. To get commits on master into feature-branch
you should run
git checkout feature-branch
git rebase master
This will 'replay' the commits in feature-branch
on top of (that is, after all
of it's commits) master
. Rebasing is preferable to merging since it keeps all
related commits together. Merging interleaves the commits on master
and
feature-branch
: this is undesirable since it makes it difficult to keep track
of which commits are unique to feature-branch
.
If there are more commits in another repository that you want on the current branch then you can run, for example,
git pull origin feature-branch
to get commits from origin
's branch named feature-branch
in the current
branch.
- Most installations of git include a simple branch and commit visualization
tool named
gitk
; check it out! - Using git from the command line is difficult. We recommend using a graphical interface like Git Cola, GitKraken, Tower, or (for emacs users) magit.
There are lots of tutorials on the Internet that describe possible workflows with git. We suggest poking around Stack Overflow for information on more complex git commands. Another good resource are the video lectures put out by Wolfgang Bangerth, which are available on YouTube in lecture 32.75 and lecture 32.8. The first video gives an overview into how git works and the second discusses how git and GitHub work together.