Documentation / howto / maintain-git.txton commit Documentation: update "howto maintain git" (cc1b258)
   1From: Junio C Hamano <gitster@pobox.com>
   2Date: Wed, 21 Nov 2007 16:32:55 -0800
   3Subject: Addendum to "MaintNotes"
   4Abstract: Imagine that git development is racing along as usual, when our friendly
   5 neighborhood maintainer is struck down by a wayward bus. Out of the
   6 hordes of suckers (loyal developers), you have been tricked (chosen) to
   7 step up as the new maintainer. This howto will show you "how to" do it.
   8
   9The maintainer's git time is spent on three activities.
  10
  11 - Communication (45%)
  12
  13   Mailing list discussions on general design, fielding user
  14   questions, diagnosing bug reports; reviewing, commenting on,
  15   suggesting alternatives to, and rejecting patches.
  16
  17 - Integration (50%)
  18
  19   Applying new patches from the contributors while spotting and
  20   correcting minor mistakes, shuffling the integration and
  21   testing branches, pushing the results out, cutting the
  22   releases, and making announcements.
  23
  24 - Own development (5%)
  25
  26   Scratching my own itch and sending proposed patch series out.
  27
  28The policy on Integration is informally mentioned in "A Note
  29from the maintainer" message, which is periodically posted to
  30this mailing list after each feature release is made.
  31
  32The policy.
  33
  34 - Feature releases are numbered as vX.Y.Z and are meant to
  35   contain bugfixes and enhancements in any area, including
  36   functionality, performance and usability, without regression.
  37
  38 - One release cycle for a feature release is expected to last for
  39   eight to ten weeks.
  40
  41 - Maintenance releases are numbered as vX.Y.Z.W and are meant
  42   to contain only bugfixes for the corresponding vX.Y.Z feature
  43   release and earlier maintenance releases vX.Y.Z.V (V < W).
  44
  45 - 'master' branch is used to prepare for the next feature
  46   release. In other words, at some point, the tip of 'master'
  47   branch is tagged with vX.Y.Z.
  48
  49 - 'maint' branch is used to prepare for the next maintenance
  50   release.  After the feature release vX.Y.Z is made, the tip
  51   of 'maint' branch is set to that release, and bugfixes will
  52   accumulate on the branch, and at some point, the tip of the
  53   branch is tagged with vX.Y.Z.1, vX.Y.Z.2, and so on.
  54
  55 - 'next' branch is used to publish changes (both enhancements
  56   and fixes) that (1) have worthwhile goal, (2) are in a fairly
  57   good shape suitable for everyday use, (3) but have not yet
  58   demonstrated to be regression free.  New changes are tested
  59   in 'next' before merged to 'master'.
  60
  61 - 'pu' branch is used to publish other proposed changes that do
  62   not yet pass the criteria set for 'next'.
  63
  64 - The tips of 'master' and 'maint' branches will not be rewound to
  65   allow people to build their own customization on top of them.
  66   Early in a new development cycle, 'next' is rewound to the tip of
  67   'master' once, but otherwise it will not be rewound until the end
  68   of the cycle.
  69
  70 - Usually 'master' contains all of 'maint' and 'next' contains all
  71   of 'master'.  'pu' contains all the topics merged to 'next', but
  72   is rebuilt directly on 'master'.
  73
  74 - The tip of 'master' is meant to be more stable than any
  75   tagged releases, and the users are encouraged to follow it.
  76
  77 - The 'next' branch is where new action takes place, and the
  78   users are encouraged to test it so that regressions and bugs
  79   are found before new topics are merged to 'master'.
  80
  81
  82A typical git day for the maintainer implements the above policy
  83by doing the following:
  84
  85 - Scan mailing list.  Respond with review comments, suggestions
  86   etc.  Kibitz.  Collect potentially usable patches from the
  87   mailing list.  Patches about a single topic go to one mailbox (I
  88   read my mail in Gnus, and type \C-o to save/append messages in
  89   files in mbox format).
  90
  91 - Write his own patches to address issues raised on the list but
  92   nobody has stepped up solving.  Send it out just like other
  93   contributors do, and pick them up just like patches from other
  94   contributors (see above).
  95
  96 - Review the patches in the saved mailboxes.  Edit proposed log
  97   message for typofixes and clarifications, and add Acks
  98   collected from the list.  Edit patch to incorporate "Oops,
  99   that should have been like this" fixes from the discussion.
 100
 101 - Classify the collected patches and handle 'master' and
 102   'maint' updates:
 103
 104   - Obviously correct fixes that pertain to the tip of 'maint'
 105     are directly applied to 'maint'.
 106
 107   - Obviously correct fixes that pertain to the tip of 'master'
 108     are directly applied to 'master'.
 109
 110   - Other topics are not handled in this step.
 111
 112   This step is done with "git am".
 113
 114     $ git checkout master    ;# or "git checkout maint"
 115     $ git am -sc3 mailbox
 116     $ make test
 117
 118   In practice, almost no patch directly goes to 'master' or
 119   'maint'.
 120
 121 - Review the last issue of "What's cooking" message, review the
 122   topics ready for merging (topic->master and topic->maint).  Use
 123   "Meta/cook -w" script (where Meta/ contains a checkout of the
 124   'todo' branch) to aid this step.
 125
 126   And perform the merge.  Use "Meta/Reintegrate -e" script (see
 127   later) to aid this step.
 128
 129     $ Meta/cook -w last-issue-of-whats-cooking.mbox
 130
 131     $ git checkout master    ;# or "git checkout maint"
 132     $ echo ai/topic | Meta/Reintegrate -e ;# "git merge ai/topic"
 133     $ git log -p ORIG_HEAD.. ;# final review
 134     $ git diff ORIG_HEAD..   ;# final review
 135     $ make test              ;# final review
 136
 137 - Handle the remaining patches:
 138
 139   - Anything unobvious that is applicable to 'master' (in other
 140     words, does not depend on anything that is still in 'next'
 141     and not in 'master') is applied to a new topic branch that
 142     is forked from the tip of 'master'.  This includes both
 143     enhancements and unobvious fixes to 'master'.  A topic
 144     branch is named as ai/topic where "ai" is two-letter string
 145     named after author's initial and "topic" is a descriptive name
 146     of the topic (in other words, "what's the series is about").
 147
 148   - An unobvious fix meant for 'maint' is applied to a new
 149     topic branch that is forked from the tip of 'maint'.  The
 150     topic is named as ai/maint-topic.
 151
 152   - Changes that pertain to an existing topic are applied to
 153     the branch, but:
 154
 155     - obviously correct ones are applied first;
 156
 157     - questionable ones are discarded or applied to near the tip;
 158
 159   - Replacement patches to an existing topic are accepted only
 160     for commits not in 'next'.
 161
 162   The above except the "replacement" are all done with:
 163
 164     $ git checkout ai/topic ;# or "git checkout -b ai/topic master"
 165     $ git am -sc3 mailbox
 166
 167   while patch replacement is often done by:
 168
 169     $ git format-patch ai/topic~$n..ai/topic ;# export existing
 170
 171   then replace some parts with the new patch, and reapplying:
 172
 173     $ git checkout ai/topic
 174     $ git reset --hard ai/topic~$n
 175     $ git am -sc3 -s 000*.txt
 176
 177   The full test suite is always run for 'maint' and 'master'
 178   after patch application; for topic branches the tests are run
 179   as time permits.
 180
 181 - Merge maint to master as needed:
 182
 183     $ git checkout master
 184     $ git merge maint
 185     $ make test
 186
 187 - Merge master to next as needed:
 188
 189     $ git checkout next
 190     $ git merge master
 191     $ make test
 192
 193 - Review the last issue of "What's cooking" again and see if topics
 194   that are ready to be merged to 'next' are still in good shape
 195   (e.g. has there any new issue identified on the list with the
 196   series?)
 197
 198 - Prepare 'jch' branch, which is used to represent somewhere
 199   between 'master' and 'pu' and often is slightly ahead of 'next'.
 200
 201     $ Meta/Reintegrate master..pu >Meta/redo-jch.sh
 202
 203   The result is a script that lists topics to be merged in order to
 204   rebuild 'pu' as the input to Meta/Reintegrate script.  Remove
 205   later topics that should not be in 'jch' yet.  Add a line that
 206   consists of '###' before the name of the first topic in the output
 207   that should be in 'jch' but not in 'next' yet.
 208
 209 - Now we are ready to start merging topics to 'next'.  For each
 210   branch whose tip is not merged to 'next', one of three things can
 211   happen:
 212
 213   - The commits are all next-worthy; merge the topic to next;
 214   - The new parts are of mixed quality, but earlier ones are
 215     next-worthy; merge the early parts to next;
 216   - Nothing is next-worthy; do not do anything.
 217
 218   This step is aided with Meta/redo-jch.sh script created earlier.
 219   If a topic that was already in 'next' gained a patch, the script
 220   would list it as "ai/topic~1".  To include the new patch to the
 221   updated 'next', drop the "~1" part; to keep it excluded, do not
 222   touch the line.  If a topic that was not in 'next' should be
 223   merged to 'next', add it at the end of the list.  Then:
 224
 225     $ git checkout -B jch master
 226     $ Meta/redo-jch.sh -c1
 227
 228   to rebuild the 'jch' branch from scratch.  "-c1" tells the script
 229   to stop merging at the '###' line you added earlier.
 230
 231   At this point, build-test the result.  It may reveal semantic
 232   conflicts (e.g. a topic renamed a variable, another added a new
 233   reference to the variable under its old name), in which case
 234   prepare an appropriate merge-fix first (see appendix), and
 235   rebuild the 'jch' branch from scratch, starting at the tip of
 236   'master'.
 237
 238   Then do the same to 'next'
 239
 240     $ git checkout next
 241     $ sh Meta/redo-jch.sh -c1 -e
 242
 243   The "-e" option allows the merge message that comes from the
 244   history of the topic and the comments in the "What's cooking" to
 245   be edited.  The resulting tree should match 'jch' as the same set
 246   of topics are merged on 'master'; otherwise there is a mismerge.
 247   Investigate why and do not proceed until the mismerge is found
 248   and rectified.
 249
 250     $ git diff jch next
 251
 252   When all is well, clean up the redo-jch.sh script with
 253
 254     $ sh Meta/redo-jch.sh -u
 255
 256   This removes topics listed in the script that have already been
 257   merged to 'master'.  This unfortunately loses the "###" marker,
 258   so add it again to the appropriate place.
 259
 260 - Rebuild 'pu'.
 261
 262     $ Meta/Reintegrate master..pu >Meta/redo-pu.sh
 263
 264   Edit the result by adding new topics that are not still in 'pu'
 265   in the script.  Then
 266
 267     $ git checkout -B pu jch
 268     $ sh Meta/redo-pu.sh
 269
 270   When all is well, clean up the redo-pu.sh script with
 271
 272     $ sh Meta/redo-pu.sh -u
 273
 274   Double check by running
 275
 276     $ git branch --no-merged pu
 277
 278   to see there is no unexpected leftover topics.
 279
 280   At this point, build-test the result for semantic conflicts, and
 281   if there are, prepare an appropriate merge-fix first (see
 282   appendix), and rebuild the 'pu' branch from scratch, starting at
 283   the tip of 'jch'.
 284
 285 - Update "What's cooking" message to review the updates to
 286   existing topics, newly added topics and graduated topics.
 287
 288   This step is helped with Meta/cook script.
 289
 290     $ Meta/cook
 291
 292   This script inspects the history between master..pu, finds tips
 293   of topic branches, compares what it found with the current
 294   contents in Meta/whats-cooking.txt, and updates that file.
 295   Topics not listed in the file but are found in master..pu are
 296   added to the "New topics" section, topics listed in the file that
 297   are no longer found in master..pu are moved to the "Graduated to
 298   master" section, and topics whose commits changed their states
 299   (e.g. used to be only in 'pu', now merged to 'next') are updated
 300   with change markers "<<" and ">>".
 301
 302   Look for lines enclosed in "<<" and ">>"; they hold contents from
 303   old file that are replaced by this integration round.  After
 304   verifying them, remove the old part.  Review the description for
 305   each topic and update its doneness and plan as needed.  To review
 306   the updated plan, run
 307
 308     $ Meta/cook -w
 309
 310   which will pick up comments given to the topics, such as "Will
 311   merge to 'next'", etc. (see Meta/cook script to learn what kind
 312   of phrases are supported).
 313
 314 - Compile, test and install all four (five) integration branches;
 315   Meta/Dothem script may aid this step.
 316
 317 - Format documentation if the 'master' branch was updated;
 318   Meta/dodoc.sh script may aid this step.
 319
 320 - Push the integration branches out to public places; Meta/pushall
 321   script may aid this step.
 322
 323Some observations to be made.
 324
 325 * Each topic is tested individually, and also together with other
 326   topics cooking first in 'pu', then in 'jch' and then in 'next'.
 327   Until it matures, no part of it is merged to 'master'.
 328
 329 * A topic already in 'next' can get fixes while still in
 330   'next'.  Such a topic will have many merges to 'next' (in
 331   other words, "git log --first-parent next" will show many
 332   "Merge branch 'ai/topic' to next" for the same topic.
 333
 334 * An unobvious fix for 'maint' is cooked in 'next' and then
 335   merged to 'master' to make extra sure it is Ok and then
 336   merged to 'maint'.
 337
 338 * Even when 'next' becomes empty (in other words, all topics
 339   prove stable and are merged to 'master' and "git diff master
 340   next" shows empty), it has tons of merge commits that will
 341   never be in 'master'.
 342
 343 * In principle, "git log --first-parent master..next" should
 344   show nothing but merges (in practice, there are fixup commits
 345   and reverts that are not merges).
 346
 347 * Commits near the tip of a topic branch that are not in 'next'
 348   are fair game to be discarded, replaced or rewritten.
 349   Commits already merged to 'next' will not be.
 350
 351 * Being in the 'next' branch is not a guarantee for a topic to
 352   be included in the next feature release.  Being in the
 353   'master' branch typically is.
 354
 355
 356[Appendix]
 357
 358Preparing a "merge-fix"
 359
 360A merge of two topics may not textually conflict but still have
 361conflict at the semantic level. A classic example is for one topic
 362to rename an variable and all its uses, while another topic adds a
 363new use of the variable under its old name. When these two topics
 364are merged together, the reference to the variable newly added by
 365the latter topic will still use the old name in the result.
 366
 367The Meta/Reintegrate script that is used by redo-jch and redo-pu
 368scripts implements a crude but usable way to work this issue around.
 369When the script merges branch $X, it checks if "refs/merge-fix/$X"
 370exists, and if so, the effect of it is squashed into the result of
 371the mechanical merge.  In other words,
 372
 373     $ echo $X | Meta/Reintegrate
 374
 375is roughly equivalent to this sequence:
 376
 377     $ git merge --rerere-autoupdate $X
 378     $ git commit
 379     $ git cherry-pick -n refs/merge-fix/$X
 380     $ git commit --amend
 381
 382The goal of this "prepare a merge-fix" step is to come up with a
 383commit that can be squashed into a result of mechanical merge to
 384correct semantic conflicts.
 385
 386After finding that the result of merging branch "ai/topic" to an
 387integration branch had such a semantic conflict, say pu~4, check the
 388problematic merge out on a detached HEAD, edit the working tree to
 389fix the semantic conflict, and make a separate commit to record the
 390fix-up:
 391
 392     $ git checkout pu~4
 393     $ git show -s --pretty=%s ;# double check
 394     Merge branch 'ai/topic' to pu
 395     $ edit
 396     $ git commit -m 'merge-fix/ai/topic' -a
 397
 398Then make a reference "refs/merge-fix/ai/topic" to point at this
 399result:
 400
 401     $ git update-ref refs/merge-fix/ai/topic HEAD
 402
 403Then double check the result by asking Meta/Reintegrate to redo the
 404merge:
 405
 406     $ git checkout pu~5 ;# the parent of the problem merge
 407     $ echo ai/topic | Meta/Reintegrate
 408     $ git diff pu~4
 409
 410This time, because you prepared refs/merge-fix/ai/topic, the
 411resulting merge should have been tweaked to include the fix for the
 412semantic conflict.
 413
 414Note that this assumes that the order in which conflicting branches
 415are merged does not change.  If the reason why merging ai/topic
 416branch needs this merge-fix is because another branch merged earlier
 417to the integration branch changed the underlying assumption ai/topic
 418branch made (e.g. ai/topic branch added a site to refer to a
 419variable, while the other branch renamed that variable and adjusted
 420existing use sites), and if you changed redo-jch (or redo-pu) script
 421to merge ai/topic branch before the other branch, then the above
 422merge-fix should not be applied while merging ai/topic, but should
 423instead be applied while merging the other branch.  You would need
 424to move the fix to apply to the other branch, perhaps like this:
 425
 426      $ mf=refs/merge-fix
 427      $ git update-ref $mf/$the_other_branch $mf/ai/topic
 428      $ git update-ref -d $mf/ai/topic