X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=inline;f=Documentation%2Fcontributor%2Fsource-code.itexi;h=719c85e041ba80021059c338d3c0b1047f76cc13;hb=25fe86c1db4017a46c3169912ceae8a6663b057e;hp=ea8fc8775c59007ed7831b1b3c07260edc1e9887;hpb=67f64c0bdf4cd469de73b135df5ba61cbfea15f7;p=lilypond.git diff --git a/Documentation/contributor/source-code.itexi b/Documentation/contributor/source-code.itexi index ea8fc8775c..719c85e041 100644 --- a/Documentation/contributor/source-code.itexi +++ b/Documentation/contributor/source-code.itexi @@ -5,7 +5,7 @@ @chapter Working with source code @warning{New contributors should read @ref{Quick start}, and in -particular @ref{Using lily-git}, instead of this chapter.} +particular @ref{lily-git}, instead of this chapter.} Advanced contributors will find this material quite useful, particularly if they are working on major new features. @@ -29,7 +29,7 @@ contributors. If you are comfortable with the command-line, then skip ahead to @ref{Starting with Git}. @warning{These instructions are only for people who are @emph{not} -using @ref{Lilydev}.} +using @ref{LilyDev}.} @c there's some duplication in this section with stuff covered in @c Quick Start, but moving it into a macro inside included/ would @@ -93,10 +93,10 @@ files. @end enumerate @warning{Throughout the rest of this manual, most command-line -input should be entered from @file{~/lilypond-git/}. This is +input should be entered from @file{$LILYPOND_GIT}. This is referred to as the @emph{top source directory}.} -Further instructions are in @ref{Daily use of lily-git.tcl}. +Further instructions are in @ref{How to use lily-git}. @node Starting with Git @@ -111,6 +111,8 @@ multiple projects concurrently. @menu * Setting up:: +* Git for the impatient:: +* Other repositories:: * Downloading remote branches:: @end menu @@ -158,7 +160,7 @@ The above command will put the it in @file{~/lilypond-git}, where @subsubheading Technical details -This creates (within the @file{~/lilypond-git/} directory) a +This creates (within the @file{$LILYPOND_GIT} directory) a subdirectory called @file{.git/}, which Git uses to keep track of changes to the repository, among other things. Normally you don't need to access it, but it's good to know it's there. @@ -169,7 +171,7 @@ need to access it, but it's good to know it's there. @warning{Throughout the rest of this manual, all command-line input should be entered from the top directory of the Git -repository being discussed (eg. @file{~/lilypond-git/}). This is +repository being discussed (eg. @file{$LILYPOND_GIT}). This is referred to as the @emph{top source directory}.} Before working with the copy of the main LilyPond repository, you @@ -206,6 +208,19 @@ change the default editor to @command{nano}, enter: git config --global core.editor @var{nano} @end example +Finally, and in some ways most importantly, let's make sure that +we know what branch we're on. If you're not using LilyDev, add +this to your @file{~/.bashrc}: + +@verbatim +export PS1="\u@\h \w\$(__git_ps1)$ " +@end verbatim + +You may need to install the additional @code{bash-completion} +package, but it is definitely worth it. After installation +you must log out, and then log back in again to enable it. + + @subsubheading Technical details Git stores the information entered with @@ -245,9 +260,402 @@ setting any now. Specific recommendations will be mentioned later in this manual. +@node Git for the impatient +@subsection Git for the impatient + +@advanced{The intent of this subsection is to get you working on lilypond as +soon as possible. If you want to learn about git, go read +@ref{Other Git documentation}. +@* +Also, these instructions are designed to eliminate the most common +problems we have found in using git. If you already know git and +have a different way of working, great! Feel free to ignore the +advice in this subsection.} + + +Ok, so you've been using @command{lily-git.tcl} for a while, but +it's time to take the next step. Since our review process delays +patches by 60-120 hours, and you want to be able to work on other +stuff while your previous work is getting reviewed, you're going +to use @strong{branches}. + +You can think of a branch as being a separate copy of the source +code. But don't worry about it. + +@subsubheading Start work: make a new branch + +Let's pretend you want to add a section to the Contributor's Guide +about using branches. + +Start by updating the repository, then making a new branch. Call +the branch anything you want as long as the name starts with +@code{dev/}. Branch names that don't begin with @code{dev/} are +reserved for special things in lilypond. + +@example +git checkout master +git pull -r origin master +git branch dev/cg +@end example + +@subsubheading Switch to that branch + +Nothing has happened to the files yet. Let's change into the new +branch. You can think of this as @qq{loading a file}, although in +this case it's really @qq{loading a directory and subdirectories +full of files}. + +@example +git checkout dev/cg +@end example + +Your prompt now shows you that you're on the other branch: + +@example +gperciva@@LilyDev:~/lilypond-git (dev/cg)$ +@end example + +To be able to manage multiple lilypond issues at once, you'll need to switch +branches. You should have each lilypond issue on a separate branch. +Switching branches is easy: + +@example +git checkout master +git checkout origin/staging +git checkout origin/release/unstable +git checkout dev/cg +@end example + +Branches that begin with @code{origin/} are part of the remote repository, +rather than your local repository, so when you check them out you get a +temporary local branch. You should never make changes directly on a +branch beginning with @code{origin/}. You get changes into the remote +repository by making them in local branches, and then pushing them to +@code{origin/staging} as described below. + +@subsubheading Make your changes + +Edit files, then commit them. + +@example +git commit -a +@end example + + +Remember how I said that switching to a branch was like +@qq{loading a directory}? Well, you've just @qq{saved a +directory}, so that you can @qq{load} it later. + +@advanced{If you have used @command{cvs} or @command{svn}, you may +be very confused: those programs use @qq{commit} to mean +@qq{upload my changes to the shared source repository}. +Unfortunately, just to be different, @w{@command{git commit}} +means @qq{save my changes to the files}.} + +When you create a new file, you need to add it to git, then commit it: + +@example +git add input/regression/avoid-crash-on-condition.ly +git commit -a +@end example + + +Edit more files. Commit them again. Edit yet more files, commit +them again. Go eat dinner. Switch to @code{master} so you can +play with the latest changes from other developers. Switch back +to your branch and edit some more. Commit those changes. + +At this stage, don't worry about how many commits you have. + + +@subsubheading Save commits to external files + +Branches are nerve-wracking until you get used to them. You can +save your hard work as individual @file{.patch} files. Be sure to +commit your changes first. + +@example +git commit -a +git format-patch master +@end example + +I personally have between 4 and 20 of those files saved in a +special folder at any point in time. Git experts might laugh as +that behavior, but I feel a @emph{lot} better knowing that I've +got those backups. + + +@subsubheading Prepare your branch for review + +After committing, you can update your branch with the latest master: + +@example +git commit -a +git checkout master +git pull -r origin master +git checkout dev/cg +git rebase master +@end example + + +Due to the speed of lilypond development, sometimes +@code{master} has changed so much that your branch can no +longer be applied to it. In that happens, you will have a merge +conflict. Stop for a moment to either cry or have a stiff drink, +then proceed to @ref{Merge conflicts}. + + +@subsubheading Upload your branch + +Finally, you're finished your changes. Time to upload for review. +Make sure that you're on your branch, then upload: + +@example +git checkout dev/cg +git-cl upload master +@end example + + +@subsubheading Wait for reviews + +While you're waiting for a countdown and reviews, go back to +master, make a @code{dev/doc-beams} branch, and start adding doc +suggestions from issue 12345 from the tracker. Or make a +@code{dev/page-breaks} and fix bug in page breaking. Or whatever. +Don't worry, your @code{dev/cg} is safe. + + +@subsubheading Combining commits (optional unless you have broken commits) + +Does the history of your branch look good? + +@example +gitk +@end example + +If you have a lot of commits on your branch, you might want to +combine some of them. Alternately, you may like your commits, but +want to edit the commit messages. + +@example +git rebase -i master +@end example + +Follow instructions on the screen. + +@warning{This step gives you the power to completely lose your +work. Make a backup of your commits by saving them to +@file{.patch} files before playing with this. If you do lose +your work, don't despair. You can get it back by using @code{git reflog}. +The use of @code{git reflog} is not covered here.} + +@warning{If any of the commits on your branch represent partial work that will +not pass @var{make && make doc}, you @strong{must} squash these +commits into a working commit. Otherwise, your push will break staging +and will not be able to be merged to master. In general, you will +be safer to have one commit per push.} + + +@subsubheading Push to staging + +When you've got the coveted @code{Patch-push} status, time to +prepare your upload: + +@example +git fetch +git rebase origin/staging dev/cg~0 +gitk HEAD +@end example + +@warning{Do not skip the @command{gitk} step; a quick 5-second +check of the visual history can save a great deal of frustration +later on. You should see a set of your commits that are ahead of +@code{origin/staging}, with no label for the top commit -- only a +SHA1 id.} + +@warning{If @code{origin/staging} and @code{origin/master} are the +same commit, your branch (@code{dev/cg} in the example) will also +be at the top of the @code{gitk} tree. This is normal.} + +If everything looks good, push it: + +@example +git push origin HEAD:staging +@end example + +Then change back to your working branch: + +@example +git checkout dev/cg +@end example + +@warning{It is a best practice to avoid rebasing any of your branches +to @code{origin/staging}. If @code{origin/staging} is broken, it +will be deleted and rebuilt. If you have rebased one of your branches +to @code{origin/staging}, the broken commits can end up in your branch. +The commands given above do the rebase on a temporary branch, and avoid +changing your working branch.} + + +@subsubheading Delete your branch (safe) + +After a few hours, if there's nothing wrong with your branch, it +should be automatically moved to @code{origin/master}. Update, +then try removing your branch: + +@example +git checkout master +git pull -r origin master +git branch -d dev/cg +@end example + +The last command will fail if the contents of @code{dev/cg} are +not present in @code{origin/master}. + + +@subsubheading Delete your branch (UNSAFE) + +@c don't give explicit commands here -- this is too dangerous to copy and paste +Sometimes everything goes wrong. If you want to remove a branch even though +it will cause your work to be lost (that is, if the contents of @code{dev/cg} +are @strong{not} present in master), follow the instructions in @qq{Delete +your branch (safe)}, but replace the @code{-d} on the final line with +a @code{-D}. + + +@node Other repositories +@subsection Other repositories + +We have a few other code repositories. + +@menu +* lilypond-extra:: +* Grand Unified Builder (GUB):: +* LilyPad:: +* yet more repositories:: +@end menu + +@node lilypond-extra +@unnumberedsubsubsec lilypond-extra + +There is a separate repository for general administrative scripts, +as well as pictures and media files for the website. People +interested in working on the website should download this +repository, and set their @code{$LILYPOND_WEB_MEDIA_GIT} +environment variable to point to that repository. + +@example +@uref{https://github.com/gperciva/lilypond-extra} +@end example + +To configure an environment variable in bash (the default for most +GNU/Linux distributions), + +@example +export LILYPOND_WEB_MEDIA_GIT=$HOME/dir/of/lilypond-extra/ +@end example + +Be aware that @code{lilypond-extra} is the definitive source for some binary +files - in particular PDF versions of papers concerning LilyPond. To add +further PDFs of this sort, all that is necessary is to add the PDF to +@code{lilypond-extra} and then add a reference to it in the documentation. The +file will then be copied to the website when @code{make website} is run. + +However, pictures that are also used in the documentation build are mastered in +the main git repository. If any of these is changed, it should be updated in +git, and then the updates copied to @code{lilypond-extra}. + +@node Grand Unified Builder (GUB) +@unnumberedsubsubsec Grand Unified Builder (GUB) + +Another item of interest might be the Grand Unified Builder, our +cross-platform building tool. Since it is used by other projects as +well, it is not stored in our gub repository. For more info, see +@uref{http://lilypond.org/gub}. + +There are two locations for this repository: the version being used to +build lilypond, which is at + +@example +@uref{http://github.com/gperciva/gub} +@end example + +and the original version by Jan Nieuwenhuizen, kept at + +@example +@uref{http://github.com/janneke/gub} +@end example + + +@node LilyPad +@unnumberedsubsubsec LilyPad + +Our binary releases on MacOS X and Windows contain a lightweight +text editor. + +To make any modifications the Windows editor, you will need to do the +following: + +@enumerate +@item +Clone the git repository from @code{https://github.com/gperciva/lilypad} + +@item +Make changes to the source, and check it compiles. In a Windows environment +@code{MinGW} provides both a @code{Git} installation and a @code{gcc} +compiler. This can be obtained from @code{http://www.mingw.org/} + +@item +Update the version which is contained in the @file{rsrc.rc}. Check +this compiles, too. + +@item +Commit the changes with an informative commit message. + +@item +Push the changes to github. You will need to use syntax similiar to this: + +@example +git push https://UserName@@github.com/gperciva/lilypad.git +@end example + +You will need to have push access to the git repository for this to be +successful. + +@item +Make a tarball of the source code to be used by GUB by pulling the updated +repository from GitHub. Ensure that the tarball has the correct Version +number. + +@item +Copy the tarball to @code{http://lilypond.org/download/gub-sources/lilypad/}. +You will need to have SSH access to @code{lilypond.org}. If you do not, contact +the Release Manager via the lilypond-devel mailing list. + +@item +Update GUB to make it use the new tarball by editing +@file{gub/specs/lilypad.py} and changing the @code{source =} line to point to +the new source. + +@item +Push this updated @file{lilypad.py} version to the GUB repository on GitHub. + +@item +Test the changes with a new GUB compile. + +@end enumerate + +@node yet more repositories +@unnumberedsubsubsec yet more repositories + +There are a few other repositories floating around, which will +hopefully be documented in the near future. + + @node Downloading remote branches @subsection Downloading remote branches +@warning{contains obsolete + misleading info} @menu * Organization of remote branches:: @@ -273,13 +681,13 @@ development releases), the documentation (and its translations), and the website. Generally, the @code{master} branch is expected to compile successfully. -The @code{lilypond/translation} branch is a side branch that +The @code{translation} branch is a side branch that allows translators to work without needing to worry about compilation problems. Periodically, the Translation Meister (after verifying that it doesn't break compilation), will -@emph{merge} this branch back into @code{master} to incorporate +@emph{merge} this branch into @code{staging} to incorporate recent translations. Similarly, the @code{master} branch is -usually merged into the @code{lilypond/translation} branch after +usually merged into the @code{translation} branch after significant changes to the English documentation. See @ref{Translating the documentation} for details. @@ -312,6 +720,8 @@ only be used as a last resort. @node Downloading individual branches @unnumberedsubsubsec Downloading individual branches +@warning{obsolete, should be deleted!} + Once you have initialized an empty Git repository on your system (see @ref{Initializing a repository}), you can download a remote @@ -325,11 +735,11 @@ git remote add -ft master -m master \ origin git://git.sv.gnu.org/lilypond.git/ @end example -To download the @code{lilypond/translation} branch, enter: +To download the @code{translation} branch, enter: @example -git remote add -ft lilypond/translation -m \ - lilypond/translation origin git://git.sv.gnu.org/lilypond.git/ +git remote add -ft translation -m \ + translation origin git://git.sv.gnu.org/lilypond.git/ @end example The @command{git@tie{}remote@tie{}add} process could take up to @@ -367,7 +777,7 @@ git checkout -b @var{branch} origin/@var{branch} @noindent where @code{@var{branch}} is the name of your tracking branch, -either @code{master} or @code{lilypond/translation}. +either @code{master} or @code{translation}. Git will issue some warnings; this is normal: @@ -379,7 +789,7 @@ Already on 'master' @end example By now the source files should be accessible---you should be able -to edit any files in the @file{lilypond-git/} directory using a +to edit any files in the @file{$LILYPOND_GIT} directory using a text editor of your choice. But don't start just yet! Before editing any source files, learn how to keep your changes organized and prevent problems later---read @ref{Basic Git procedures}. @@ -424,13 +834,10 @@ branch. @item @code{stable/XYZ}: The branches are kept for archival reasons. -@end itemize +@item @code{archive/XYZ}: +The branches are kept for archival reasons. -Another item of interest might be the Grand Unified Builder, our -cross-platform building tool. Since it is used by projects as -well, it is not stored in our gub repository. For more info, see -@uref{http://lilypond.org/gub}. The git location is -@uref{http://github.com/janneke/gub}. +@end itemize @node Basic Git procedures @@ -554,7 +961,7 @@ changed committishes in the head of translated files using commits you have not yet pushed to @code{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 lilypond/translation branch on @code{git.sv.gnu.org}, which +and/or translation branch on @code{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.} @@ -674,12 +1081,11 @@ git merge @var{foo} If any conflict happens, see @ref{Resolving conflicts}. -There are common usage cases for merging: as a translator, you -will often want to merge @code{master} into -@code{lilypond/translation}; on the other hand, the Translations -meister wants to merge @code{lilypond/translation} into -@code{master} whenever he has checked that -@code{lilypond/translation} builds successfully. +There are common usage cases for merging: as a translator, you will +often want the Translations meister to merge @code{master} into +@code{translation}; on the other hand, the Translations meister wants +to merge @code{translation} into @code{staging} whenever he has +checked that @code{translation} builds successfully. @node Commits and patches @@ -893,72 +1299,9 @@ code review website: @uref{http://codereview.appspot.com/} @end example -@subsubheading @command{git-cl} install - -LilyDev users should skip over these @q{install} instructions. - -@enumerate - -@item -Install @command{git-cl} by entering: - -@example -git clone https://github.com/gperciva/git-cl.git -@end example - -If that command fails for some reason, try this instead: - -@example -git clone git://github.com/gperciva/git-cl.git -@end example - -@item -Add the @file{git-cl/} directory to your PATH, -or create a symbolic link to the @command{git-cl} -and @command{upload.py} scripts in one of your PATH -directories (such as @file{$HOME/bin}). - -In Ubuntu (and Lilydev), you can add directories to PATH -by adding this line to a hidden file @file{.bashrc}, -located in your home directory: - -@example -PATH=~/type-here-directory-containing-git-cl:"$@{PATH@}" -@end example - -@end enumerate - -@subsubheading @command{git-cl} configuration - -LilyDev users should perform these @q{configuration} instructions. - -@enumerate -@item -You must have a google account; please create one if you do not -have one already. - -Note that a google account does not need to be a gmail account; you can -use any email address for your google account when you sign up. - -@item -Move into the top source directory and then configure @command{git -cl} with the following commands. If you do not understand any -question, just answer with a newline (CR). - -@example -cd $HOME/lilypond-git/ -git cl config -@end example - -The @qq{CC list} question should be answered with: - -@example -lilypond-devel@@gnu.org -@end example - -@end enumerate - -@subsubheading Uploading patch set +You can upload a patch for review by using our custom @code{git-cl} +@q{helper-script}. This section assumes you have already installed, +updated, and configured @code{git-cl}. See @ref{git-cl}. @warning{Unless you are familiar with branches, only work on one set of changes at once.} @@ -967,15 +1310,16 @@ There are two methods, depending on your git setup. @itemize @item -@strong{Master branch}: (easy option, and used in @command{lily-git.tcl}) +@strong{Master branch}: (easy option) If you added your patch to @code{master}, then: @example git pull -r -git cl upload origin/master +git-cl upload origin/master @end example +@c Mention staging here? If you have git push ability, make sure that you @emph{remove} your patch (with @command{git rebase} or @command{git reset}) before pushing other stuff. @@ -990,32 +1334,46 @@ option. @item @strong{Separate branch}: (complicated option) -Ensure your changes are committed in a separate branch, which -should differ from the reference branch to be used by just the -changes to be uploaded. If the reference branch is to be -origin/master, ensure this is up-to-date. If necessary, use git -rebase to rebase the branch containing the changes to the head of -origin/master. Finally, check out branch with the changes and -enter the command: +Ensure your changes are committed in a separate branch, which should +differ from the reference branch to be used (usually +@code{origin/master}) by just the changes to be uploaded. Checkout the +branch with the changes: + +@example +git checkout some-branch-with-changes +@end example + +If the reference branch is to be @code{origin/master}, ensure that the +branch containing the changes is up-to-date with it. Use +@command{git rebase} or @command{git pull -r} to rebase the branch to +the head of @code{origin/master}. For example: @example -git cl upload +git pull -r origin master +@end example + +Finally, start the upload by entering: + +@example +git-cl upload @end example @noindent where is the SHA1 ID of the commit to be used as a reference source for the patch. Generally, this will be the -SHA1 ID of origin/master, and in that case the command: +SHA1 ID of origin/master, and in that case you can just use the command: @example -git cl upload origin/master +git-cl upload origin/master @end example -@noindent -can be used. - @end itemize +First you will see a terminal editor where you can edit the +message that will accompany your patch. @command{git-cl} will +respect the @env{EDITOR} environment variable if defined, +otherwise it will use @command{vi} as the default editor. + After prompting for your Google email address and password, the patch set will be posted to Rietveld, and you will be given a URL for your patch. @@ -1047,20 +1405,20 @@ associate the new branch with an existing Rietveld issue, the following command can be used: @example -git cl issue issue-number +git-cl issue issue-number @end example @noindent where @code{issue-number} is the number of the existing Rietveld issue. -@subsubheading Resetting git cl +@subsubheading Resetting git-cl -If @command{git cl} becomes confused, you can @qq{reset} it by +If @command{git-cl} becomes confused, you can @qq{reset} it by running: @example -git cl issue 0 +git-cl issue 0 @end example @subsubheading Wait for a countdown @@ -1091,7 +1449,7 @@ in learning more about git.} It is possible to work with several branches on the same local Git repository; this is especially useful for translators who may have -to deal with both @code{lilypond/translation} and a stable branch, +to deal with both @code{translation} and a stable branch, e.g. @code{stable/2.12}. Some Git commands are introduced first, then a workflow with @@ -1099,6 +1457,7 @@ several Git branches of LilyPond source code is presented. @menu +* Merge conflicts:: * Advanced Git concepts:: * Resolving conflicts:: * Reverting all local changes:: @@ -1112,6 +1471,13 @@ several Git branches of LilyPond source code is presented. @end menu +@node Merge conflicts +@subsection Merge conflicts + +To be filled in later, and/or moved to a different section. I +just wanted to make sure that I had a stub ready somewhere. + + @node Advanced Git concepts @subsection Advanced Git concepts @@ -1129,7 +1495,7 @@ git pull git://git.sv.gnu.org/lilypond.git/ @var{branch}:origin/@var{branch} @noindent where @code{@var{branch}} is typically @code{master} or -@code{lilypond/translation}; if you do not know or remember, see +@code{translation}; if you do not know or remember, see @ref{Downloading remote branches} to remember which commands you issued or which source code you wanted to get. @@ -1259,7 +1625,7 @@ current branch. For example, if your current branch is @subsubheading Local clones, or having several working trees If you play with several Git branches, e.g. @code{master}, -@code{lilypond/translation}, @code{stable/2.12}), you may want to +@code{translation}, @code{stable/2.12}), you may want to have one source and build tree for each branch; this is possible with subdirectories of your local Git repository, used as local cloned subrepositories. To create a local clone for the branch @@ -1330,10 +1696,10 @@ git am @var{patch} Patches created without @code{git@tie{}format-patch} can be applied in two steps. The first step is to apply the patch to the -working tree: +working tree and the index: @example -git apply @var{patch} +git apply --index @var{patch} @end example @noindent @@ -1341,9 +1707,16 @@ The second step is to commit the changes and give credit to the author of the patch. This can be done with the following command: @example -git commit -a --author="@var{John Smith} <@var{john@@example.com}>" +git commit --author="@var{John Smith} <@var{john@@example.com}>" @end example +Please note that using the @code{--index} option for patching is quite +important here and @emph{cannot} reliably be replaced by using the +@code{-a} option when committing: that would only commit files from the +working tree that are already registered with git, so every file that +the patch actually @emph{adds}, like a regtest for a fixed bug, would +get lost. For the same reason, you should not use the git-independent +@samp{patch} program for applying patches. @node Sending and receiving patches via email @subsection Sending and receiving patches via email @@ -1561,7 +1934,7 @@ If @command{git@tie{}pull@tie{}--verbose} succeeds, the output will include a @q{From} line that shows @q{ssh} as the protocol: @example -From ssh://@var{user}@@git.sv.gnu.org/srv/git/lilypond +From ssh://git.sv.gnu.org/srv/git/lilypond @end example If the protocol shown is not @q{ssh}, check that you configured @@ -1679,6 +2052,15 @@ patch has been lost. Note that you can check the commits on @code{origin/staging} by looking at the git web interface on savannah. +It may happen occasionally that the staging branch breaks automated +testing. In this case the automatic move of staging material to +master gets halted in order to avoid broken material entering master. +This is a safety net. Please do not try breaking out from it by +adding fixes on top of staging: in that case the whole sequence will +end up in master after all, defeating the purpose of the system. The +proper fix usually involves rewriting the staging branch and is best +left to core developers after discussion on the developer list. + @subsubheading If your work is in a patch file Assuming that your patch is in a file called @@ -1723,7 +2105,7 @@ later on. You should see that @code{staging} is only ahead of @section Git on Windows @warning{We heavily recommend that development be done with our -virtual machine @ref{Lilydev}.} +virtual machine @ref{LilyDev}.} @c Some of this may duplicate stuff in other sections @c But it is probably best for windows users to have it all together @@ -2101,5 +2483,10 @@ More in-depth tutorials: @uref{http://git-scm.com/documentation} @item Book about git: @uref{http://progit.org/,Pro Git} + +@item +Github help: @uref{http://help.github.com/} +(very highly recommended by Graham) + @end itemize