| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
| 3.2.1 The Git contributor’s cycle | ||
| 3.2.2 Pulling and rebasing | ||
| 3.2.3 Using local branches | ||
| 3.2.4 Commits | ||
| 3.2.5 Patches | ||
| 3.2.6 Uploading a patch for review | ||
| 3.2.7 The patch review cycle |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Here is a simplified view of the contribution process on Git:
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When developers push new patches to the git.sv.gnu.org
repository, your local repository is not automatically
updated. It is important to keep your repository up-to-date by
periodically pulling the most recent commits from
the remote branch. Developers expect patches to be as current as
possible, since outdated patches require extra work before they
can be used.
Occasionally you may need to rework some of your own modifications to match changes made to the remote branch (see Resolving conflicts), and it’s considerably easier to rework things incrementally. If you don’t update your repository along the way, you may have to spend a lot of time resolving branch conflicts and reconfiguring much of the work you’ve already done.
Fortunately, Git is able to resolve certain types of branch
conflicts automatically with a process called rebasing.
When rebasing, Git tries to modify your old commits so they appear
as new commits (based on the latest updates). For a more involved
explanation, see the git-rebase man page.
To pull without rebasing (recommended for translators), use the following command:
git pull # recommended for translators |
If you’re tracking the remote master branch, you should add
the ‘-r’ option (short for ‘--rebase’) to keep commits
on your local branch current:
git pull -r # use with caution when translating |
If you don’t edit translated documentation and don’t want to type ‘-r’ every time, configure the master branch to rebase by default with this command:
git config branch.master.rebase true |
If pull fails because of a message like
error: Your local changes to 'Documentation/learning/tutorial.itely' would be overwritten by merge. Aborting. |
or
Documentation/learning/tutorial.itely: needs update refusing to pull with rebase: your working tree is not up-to-date |
it means that you have modified some files in you working tree
without committing changes (see Commits); you
can use the git stash command to work around this:
git stash # save uncommitted changes git pull -r # pull using rebase (translators omit "-r") git stash pop # reapply previously saved changes |
Note that git stash pop will try to apply a
patch, and this may create a conflict. If this happens, see
Resolving conflicts.
TODO: I think the next paragraph is confusing. Perhaps prepare the reader for new terms ‘committish’ and ‘head’? -mp
Note: translators and documentation editors, if you have
changed committishes in the head of translated files using commits
you have not yet pushed to git.sv.gnu.org, please do not
rebase. If you want to avoid wondering whether you should rebase
each time you pull, please always use committishes from master
and/or translation branch on git.sv.gnu.org, which
in particular implies that you must push your changes to
documentation except committishes updates (possibly after having
rebased), then update the committishes and push them.
TODO: when committishes automatic conditional update have been tested and documented, append the following to the warning above: Note that using update-committishes make target generally touches committishes.
The git config command mentioned above adds the
line rebase = true to the master branch in your local
repository’s ‘.git/config’ file:
[branch "master"]
remote = origin
merge = refs/heads/master
rebase = true
|
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
| Creating and removing branches | ||
| Listing branches and remotes | ||
| Checking out branches | ||
| Merging branches |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Local branches are useful when you’re working on several different projects concurrently. To create a new branch, enter:
git branch name |
To delete a branch, enter:
git branch -d name |
Git will ask you for confirmation if it sees that data would be lost by deleting the branch. Use ‘-D’ instead of ‘-d’ to bypass this. Note that you cannot delete a branch if it is currently checked out.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
You can get the exact path or URL of all remote branches by running:
git remote -v |
To list Git branches on your local repositories, run
git branch # list local branches only git branch -r # list remote branches git branch -a # list all branches |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To know the currently checked out branch, i.e. the branch whose source files are present in your working tree, read the first line of the output of
git status |
The currently checked out branch is also marked with an asterisk
in the output of git branch.
You can check out another branch other_branch, i.e.
check out other_branch to the working tree, by
running
git checkout other_branch |
Note that it is possible to check out another branch while having
uncommitted changes, but it is not recommended unless you know
what you are doing; it is recommended to run git status
to check this kind of issue before checking out another branch.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
To merge branch foo into branch bar,
i.e. to “add” all changes made in branch foo to
branch bar, run
git checkout bar git merge foo |
If any conflict happens, see Resolving conflicts.
There are common usage cases for merging: as a translator, you will
often want the Translations meister to merge master into
translation; on the other hand, the Translations meister wants
to merge translation into master whenever he has
checked that translation builds successfully.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
| Understanding commits | ||
| How to make a commit | ||
| Commit messages |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Technically, a commit is a single point in the history of a branch, but most developers use the term to mean a commit object, which stores information about a particular revision. A single commit can record changes to multiple source files, and typically represents one logical set of related changes (such as a bug-fix). You can list the ten most recent commits in your current branch with this command:
git log -10 --oneline |
If you’re using an older version of Git and get an ‘unrecognized argument’ error, use this instead:
git log -10 --pretty=oneline --abbrev-commit |
More interactive lists of the commits on the remote master
branch are available at
http://git.sv.gnu.org/gitweb/?p=lilypond.git;a=shortlog and
http://git.sv.gnu.org/cgit/lilypond.git/log/.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Once you have modified some source files in your working directory, you can make a commit with the following procedure:
git status |
to make sure you’re on the right branch, and to see which files have been modified, added or removed, etc. You may need to tell Git about any files you’ve added by running one of these:
git add file # add untracked file individually git add . # add all untracked files in current directory |
After git add, run git status again
to make sure you got everything. You may also need to modify
‘GNUmakefile’.
git diff HEAD |
The HEAD argument refers to the most recent commit on the
currently checked-out branch.
git commit -a |
The ‘-a’ is short for ‘--all’ which includes modified and deleted files, but only those newly created files that have previously been added.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
When you run the git commit -a command, Git
automatically opens the default text editor so you can enter a
commit message. If you find yourself in a foreign editing
environment, you’re probably in vi or vim. If
you want to switch to an editor you’re more familiar with, quit by
typing :q! and pressing <Enter>. See
Configuring Git for instructions on changing the default
editor.
In any case, Git will open a text file for your commit message that looks like this:
# Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: working.itexi # |
Your commit message should begin with a one-line summary describing the change (no more than 50 characters long), and if necessary a blank line followed by several lines giving the details:
Doc: add Baerenreiter and Henle solo cello suites Added comparison of solo cello suite engravings to new essay with high-res images, fixed cropping on Finale example. |
Commit messages often start with a short prefix describing the general location of the changes.
Visit the links listed in Understanding commits for examples.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
| How to make a patch | ||
| Emailing patches |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
If you want to share your changes with other contributors and developers, you need to generate patches from your commits. We prefer it if you follow the instructions in Uploading a patch for review. However, we present an alternate method here.
You should always run git pull -r (translators
should leave off the ‘-r’) before doing this to ensure that
your patches are as current as possible.
Once you have made one or more commits in your local repository, and pulled the most recent commits from the remote branch, you can generate patches from your local commits with the command:
git format-patch origin |
The origin argument refers to the remote tracking branch at
git.sv.gnu.org. This command generates a separate patch
for each commit that’s in the current branch but not in the remote
branch. Patches are placed in the current working directory and
will have names that look something like this:
0001-Doc-Fix-typos.patch 0002-Web-Remove-dead-links.patch ⋮ |
Send an email (must be less than 64 KB) to lilypond-devel@gnu.org briefly explaining your work, with the patch files attached. Translators should send patches to translations@lilynet.net. After your patches are reviewed, the developers may push one or more of them to the main repository or discuss them with you.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The default x-diff MIME type associated with patch files
(i.e., files whose name ends in .patch) means that the
encoding of line endings may be changed from UNIX to DOS format
when they are sent as attachments. Attempting to apply such an
inadvertently altered patch will cause git to fail with a message
about ‘whitespace errors’.
The solution to such problems is surprisingly simple—just change
the default file extension of patches generated by git to end in
.txt, for example:
git config format.suffix '.patch.txt' |
This should cause email programs to apply the correct base64 encoding to attached patches.
If you receive a patch with DOS instead of UNIX line-endings, it
can be converted back using the dos2unix utility.
Lots of useful information on email complications with patches is provided on the Wine wiki at http://wiki.winehq.org/GitWine.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Any non-trivial change should be reviewed as a merge request:
https://gitlab.com/lilypond/lilypond/-/merge_requests |
Ensure your changes are committed in a separate branch, which should
differ from the reference branch to be used (usually
origin/master) by just the changes to be uploaded. Checkout the
branch with the changes:
git checkout some-branch-with-changes |
If the reference branch is to be origin/master, ensure that the
branch containing the changes is up-to-date with it. Use
git rebase or git pull -r to rebase the branch to
the head of origin/master. For example:
git pull -r origin master |
To upload a patch for review, the changes must be pushed. If you
have commit access, this may use a dev/ branch. Otherwise,
or at your convenience, you may use a private fork.
Afterwards create a merge request to start the review cycle. There are multiple options for this as outlined in GitLab’s documentation at https://docs.gitlab.com/ee/user/project/merge_requests/. This will also ask you for a message that will accompany your patch.
If you are not a member of the team and create the merge request from a fork, consider enabling the box to “Allow commits from members who can merge to the target branch”. This makes it possible for somebody with permissions to rebase your changes and merge them for you. Please refer to Merging to master for more details.
As revisions are made in response to comments, successive patch sets for the same issue can be uploaded by pushing to the same branch. GitLab automatically keeps track of all pushed commits and allows to compare revisions with each other.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Your patch will be available for reviews for the next few hours or
days. Three times a week, patches with no known problems are
gathered into a “patch countdown” and their status changed to
Patch::countdown. The countdown is a 48-hour waiting period
in which any final reviews or complaints should be made.
During the countdown, your patch may be set to
Patch::needs_work, indicating that you should fix something
(or at least discuss why the patch needs no modification). If no
problems are found, the patch will be set to patch-push.
Once a patch has Patch::push, it should be sent to your
mentor for uploading. If you have git push ability, look at
Merging to master.
Patch::new label to it.
make, make test, and make doc. Afterwards, the Patch
Meister manually runs make check to verify regression tests. If
both steps pass, the merge request is labelled Patch::review. On
failure, the status is updated to Patch::needs_work.
https://gitlab.com/lilypond/lilypond/-/merge_requests?label_name[]=Patch%3A%3Areview |
Patch::needs_work and makes a comment
regarding the reason, referring to the comment if needed.
Patch::countdown. When saving the tracker item,
clear the “send email” box to prevent sending notification for
each patch.
PATCH: Countdown to 20130113 |
The text of the email sets the deadline for this countdown batch. At present, batches are done on Tuesday, Thursday and Sunday evenings.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] |
This document was generated by gub on July 13, 2020 using texi2html 1.82.