Documentation / gitworkflows.txton commit graph: add commit graph design document (ae30d7b)
   1gitworkflows(7)
   2===============
   3
   4NAME
   5----
   6gitworkflows - An overview of recommended workflows with Git
   7
   8SYNOPSIS
   9--------
  10[verse]
  11git *
  12
  13
  14DESCRIPTION
  15-----------
  16
  17This document attempts to write down and motivate some of the workflow
  18elements used for `git.git` itself.  Many ideas apply in general,
  19though the full workflow is rarely required for smaller projects with
  20fewer people involved.
  21
  22We formulate a set of 'rules' for quick reference, while the prose
  23tries to motivate each of them.  Do not always take them literally;
  24you should value good reasons for your actions higher than manpages
  25such as this one.
  26
  27
  28SEPARATE CHANGES
  29----------------
  30
  31As a general rule, you should try to split your changes into small
  32logical steps, and commit each of them.  They should be consistent,
  33working independently of any later commits, pass the test suite, etc.
  34This makes the review process much easier, and the history much more
  35useful for later inspection and analysis, for example with
  36linkgit:git-blame[1] and linkgit:git-bisect[1].
  37
  38To achieve this, try to split your work into small steps from the very
  39beginning. It is always easier to squash a few commits together than
  40to split one big commit into several.  Don't be afraid of making too
  41small or imperfect steps along the way. You can always go back later
  42and edit the commits with `git rebase --interactive` before you
  43publish them.  You can use `git stash push --keep-index` to run the
  44test suite independent of other uncommitted changes; see the EXAMPLES
  45section of linkgit:git-stash[1].
  46
  47
  48MANAGING BRANCHES
  49-----------------
  50
  51There are two main tools that can be used to include changes from one
  52branch on another: linkgit:git-merge[1] and
  53linkgit:git-cherry-pick[1].
  54
  55Merges have many advantages, so we try to solve as many problems as
  56possible with merges alone.  Cherry-picking is still occasionally
  57useful; see "Merging upwards" below for an example.
  58
  59Most importantly, merging works at the branch level, while
  60cherry-picking works at the commit level.  This means that a merge can
  61carry over the changes from 1, 10, or 1000 commits with equal ease,
  62which in turn means the workflow scales much better to a large number
  63of contributors (and contributions).  Merges are also easier to
  64understand because a merge commit is a "promise" that all changes from
  65all its parents are now included.
  66
  67There is a tradeoff of course: merges require a more careful branch
  68management.  The following subsections discuss the important points.
  69
  70
  71Graduation
  72~~~~~~~~~~
  73
  74As a given feature goes from experimental to stable, it also
  75"graduates" between the corresponding branches of the software.
  76`git.git` uses the following 'integration branches':
  77
  78* 'maint' tracks the commits that should go into the next "maintenance
  79  release", i.e., update of the last released stable version;
  80
  81* 'master' tracks the commits that should go into the next release;
  82
  83* 'next' is intended as a testing branch for topics being tested for
  84  stability for master.
  85
  86There is a fourth official branch that is used slightly differently:
  87
  88* 'pu' (proposed updates) is an integration branch for things that are
  89  not quite ready for inclusion yet (see "Integration Branches"
  90  below).
  91
  92Each of the four branches is usually a direct descendant of the one
  93above it.
  94
  95Conceptually, the feature enters at an unstable branch (usually 'next'
  96or 'pu'), and "graduates" to 'master' for the next release once it is
  97considered stable enough.
  98
  99
 100Merging upwards
 101~~~~~~~~~~~~~~~
 102
 103The "downwards graduation" discussed above cannot be done by actually
 104merging downwards, however, since that would merge 'all' changes on
 105the unstable branch into the stable one.  Hence the following:
 106
 107.Merge upwards
 108[caption="Rule: "]
 109=====================================
 110Always commit your fixes to the oldest supported branch that require
 111them.  Then (periodically) merge the integration branches upwards into each
 112other.
 113=====================================
 114
 115This gives a very controlled flow of fixes.  If you notice that you
 116have applied a fix to e.g. 'master' that is also required in 'maint',
 117you will need to cherry-pick it (using linkgit:git-cherry-pick[1])
 118downwards.  This will happen a few times and is nothing to worry about
 119unless you do it very frequently.
 120
 121
 122Topic branches
 123~~~~~~~~~~~~~~
 124
 125Any nontrivial feature will require several patches to implement, and
 126may get extra bugfixes or improvements during its lifetime.
 127
 128Committing everything directly on the integration branches leads to many
 129problems: Bad commits cannot be undone, so they must be reverted one
 130by one, which creates confusing histories and further error potential
 131when you forget to revert part of a group of changes.  Working in
 132parallel mixes up the changes, creating further confusion.
 133
 134Use of "topic branches" solves these problems.  The name is pretty
 135self explanatory, with a caveat that comes from the "merge upwards"
 136rule above:
 137
 138.Topic branches
 139[caption="Rule: "]
 140=====================================
 141Make a side branch for every topic (feature, bugfix, ...). Fork it off
 142at the oldest integration branch that you will eventually want to merge it
 143into.
 144=====================================
 145
 146Many things can then be done very naturally:
 147
 148* To get the feature/bugfix into an integration branch, simply merge
 149  it.  If the topic has evolved further in the meantime, merge again.
 150  (Note that you do not necessarily have to merge it to the oldest
 151  integration branch first.  For example, you can first merge a bugfix
 152  to 'next', give it some testing time, and merge to 'maint' when you
 153  know it is stable.)
 154
 155* If you find you need new features from the branch 'other' to continue
 156  working on your topic, merge 'other' to 'topic'.  (However, do not
 157  do this "just habitually", see below.)
 158
 159* If you find you forked off the wrong branch and want to move it
 160  "back in time", use linkgit:git-rebase[1].
 161
 162Note that the last point clashes with the other two: a topic that has
 163been merged elsewhere should not be rebased.  See the section on
 164RECOVERING FROM UPSTREAM REBASE in linkgit:git-rebase[1].
 165
 166We should point out that "habitually" (regularly for no real reason)
 167merging an integration branch into your topics -- and by extension,
 168merging anything upstream into anything downstream on a regular basis
 169-- is frowned upon:
 170
 171.Merge to downstream only at well-defined points
 172[caption="Rule: "]
 173=====================================
 174Do not merge to downstream except with a good reason: upstream API
 175changes affect your branch; your branch no longer merges to upstream
 176cleanly; etc.
 177=====================================
 178
 179Otherwise, the topic that was merged to suddenly contains more than a
 180single (well-separated) change.  The many resulting small merges will
 181greatly clutter up history.  Anyone who later investigates the history
 182of a file will have to find out whether that merge affected the topic
 183in development.  An upstream might even inadvertently be merged into a
 184"more stable" branch.  And so on.
 185
 186
 187Throw-away integration
 188~~~~~~~~~~~~~~~~~~~~~~
 189
 190If you followed the last paragraph, you will now have many small topic
 191branches, and occasionally wonder how they interact.  Perhaps the
 192result of merging them does not even work?  But on the other hand, we
 193want to avoid merging them anywhere "stable" because such merges
 194cannot easily be undone.
 195
 196The solution, of course, is to make a merge that we can undo: merge
 197into a throw-away branch.
 198
 199.Throw-away integration branches
 200[caption="Rule: "]
 201=====================================
 202To test the interaction of several topics, merge them into a
 203throw-away branch.  You must never base any work on such a branch!
 204=====================================
 205
 206If you make it (very) clear that this branch is going to be deleted
 207right after the testing, you can even publish this branch, for example
 208to give the testers a chance to work with it, or other developers a
 209chance to see if their in-progress work will be compatible.  `git.git`
 210has such an official throw-away integration branch called 'pu'.
 211
 212
 213Branch management for a release
 214~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 215
 216Assuming you are using the merge approach discussed above, when you
 217are releasing your project you will need to do some additional branch
 218management work.
 219
 220A feature release is created from the 'master' branch, since 'master'
 221tracks the commits that should go into the next feature release.
 222
 223The 'master' branch is supposed to be a superset of 'maint'. If this
 224condition does not hold, then 'maint' contains some commits that
 225are not included on 'master'. The fixes represented by those commits
 226will therefore not be included in your feature release.
 227
 228To verify that 'master' is indeed a superset of 'maint', use git log:
 229
 230.Verify 'master' is a superset of 'maint'
 231[caption="Recipe: "]
 232=====================================
 233`git log master..maint`
 234=====================================
 235
 236This command should not list any commits.  Otherwise, check out
 237'master' and merge 'maint' into it.
 238
 239Now you can proceed with the creation of the feature release. Apply a
 240tag to the tip of 'master' indicating the release version:
 241
 242.Release tagging
 243[caption="Recipe: "]
 244=====================================
 245`git tag -s -m "Git X.Y.Z" vX.Y.Z master`
 246=====================================
 247
 248You need to push the new tag to a public Git server (see
 249"DISTRIBUTED WORKFLOWS" below). This makes the tag available to
 250others tracking your project. The push could also trigger a
 251post-update hook to perform release-related items such as building
 252release tarballs and preformatted documentation pages.
 253
 254Similarly, for a maintenance release, 'maint' is tracking the commits
 255to be released. Therefore, in the steps above simply tag and push
 256'maint' rather than 'master'.
 257
 258
 259Maintenance branch management after a feature release
 260~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 261
 262After a feature release, you need to manage your maintenance branches.
 263
 264First, if you wish to continue to release maintenance fixes for the
 265feature release made before the recent one, then you must create
 266another branch to track commits for that previous release.
 267
 268To do this, the current maintenance branch is copied to another branch
 269named with the previous release version number (e.g. maint-X.Y.(Z-1)
 270where X.Y.Z is the current release).
 271
 272.Copy maint
 273[caption="Recipe: "]
 274=====================================
 275`git branch maint-X.Y.(Z-1) maint`
 276=====================================
 277
 278The 'maint' branch should now be fast-forwarded to the newly released
 279code so that maintenance fixes can be tracked for the current release:
 280
 281.Update maint to new release
 282[caption="Recipe: "]
 283=====================================
 284* `git checkout maint`
 285* `git merge --ff-only master`
 286=====================================
 287
 288If the merge fails because it is not a fast-forward, then it is
 289possible some fixes on 'maint' were missed in the feature release.
 290This will not happen if the content of the branches was verified as
 291described in the previous section.
 292
 293
 294Branch management for next and pu after a feature release
 295~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 296
 297After a feature release, the integration branch 'next' may optionally be
 298rewound and rebuilt from the tip of 'master' using the surviving
 299topics on 'next':
 300
 301.Rewind and rebuild next
 302[caption="Recipe: "]
 303=====================================
 304* `git checkout next`
 305* `git reset --hard master`
 306* `git merge ai/topic_in_next1`
 307* `git merge ai/topic_in_next2`
 308* ...
 309=====================================
 310
 311The advantage of doing this is that the history of 'next' will be
 312clean. For example, some topics merged into 'next' may have initially
 313looked promising, but were later found to be undesirable or premature.
 314In such a case, the topic is reverted out of 'next' but the fact
 315remains in the history that it was once merged and reverted. By
 316recreating 'next', you give another incarnation of such topics a clean
 317slate to retry, and a feature release is a good point in history to do
 318so.
 319
 320If you do this, then you should make a public announcement indicating
 321that 'next' was rewound and rebuilt.
 322
 323The same rewind and rebuild process may be followed for 'pu'. A public
 324announcement is not necessary since 'pu' is a throw-away branch, as
 325described above.
 326
 327
 328DISTRIBUTED WORKFLOWS
 329---------------------
 330
 331After the last section, you should know how to manage topics.  In
 332general, you will not be the only person working on the project, so
 333you will have to share your work.
 334
 335Roughly speaking, there are two important workflows: merge and patch.
 336The important difference is that the merge workflow can propagate full
 337history, including merges, while patches cannot.  Both workflows can
 338be used in parallel: in `git.git`, only subsystem maintainers use
 339the merge workflow, while everyone else sends patches.
 340
 341Note that the maintainer(s) may impose restrictions, such as
 342"Signed-off-by" requirements, that all commits/patches submitted for
 343inclusion must adhere to.  Consult your project's documentation for
 344more information.
 345
 346
 347Merge workflow
 348~~~~~~~~~~~~~~
 349
 350The merge workflow works by copying branches between upstream and
 351downstream.  Upstream can merge contributions into the official
 352history; downstream base their work on the official history.
 353
 354There are three main tools that can be used for this:
 355
 356* linkgit:git-push[1] copies your branches to a remote repository,
 357  usually to one that can be read by all involved parties;
 358
 359* linkgit:git-fetch[1] that copies remote branches to your repository;
 360  and
 361
 362* linkgit:git-pull[1] that does fetch and merge in one go.
 363
 364Note the last point.  Do 'not' use 'git pull' unless you actually want
 365to merge the remote branch.
 366
 367Getting changes out is easy:
 368
 369.Push/pull: Publishing branches/topics
 370[caption="Recipe: "]
 371=====================================
 372`git push <remote> <branch>` and tell everyone where they can fetch
 373from.
 374=====================================
 375
 376You will still have to tell people by other means, such as mail.  (Git
 377provides the linkgit:git-request-pull[1] to send preformatted pull
 378requests to upstream maintainers to simplify this task.)
 379
 380If you just want to get the newest copies of the integration branches,
 381staying up to date is easy too:
 382
 383.Push/pull: Staying up to date
 384[caption="Recipe: "]
 385=====================================
 386Use `git fetch <remote>` or `git remote update` to stay up to date.
 387=====================================
 388
 389Then simply fork your topic branches from the stable remotes as
 390explained earlier.
 391
 392If you are a maintainer and would like to merge other people's topic
 393branches to the integration branches, they will typically send a
 394request to do so by mail.  Such a request looks like
 395
 396-------------------------------------
 397Please pull from
 398    <url> <branch>
 399-------------------------------------
 400
 401In that case, 'git pull' can do the fetch and merge in one go, as
 402follows.
 403
 404.Push/pull: Merging remote topics
 405[caption="Recipe: "]
 406=====================================
 407`git pull <url> <branch>`
 408=====================================
 409
 410Occasionally, the maintainer may get merge conflicts when they try to
 411pull changes from downstream.  In this case, they can ask downstream to
 412do the merge and resolve the conflicts themselves (perhaps they will
 413know better how to resolve them).  It is one of the rare cases where
 414downstream 'should' merge from upstream.
 415
 416
 417Patch workflow
 418~~~~~~~~~~~~~~
 419
 420If you are a contributor that sends changes upstream in the form of
 421emails, you should use topic branches as usual (see above).  Then use
 422linkgit:git-format-patch[1] to generate the corresponding emails
 423(highly recommended over manually formatting them because it makes the
 424maintainer's life easier).
 425
 426.format-patch/am: Publishing branches/topics
 427[caption="Recipe: "]
 428=====================================
 429* `git format-patch -M upstream..topic` to turn them into preformatted
 430  patch files
 431* `git send-email --to=<recipient> <patches>`
 432=====================================
 433
 434See the linkgit:git-format-patch[1] and linkgit:git-send-email[1]
 435manpages for further usage notes.
 436
 437If the maintainer tells you that your patch no longer applies to the
 438current upstream, you will have to rebase your topic (you cannot use a
 439merge because you cannot format-patch merges):
 440
 441.format-patch/am: Keeping topics up to date
 442[caption="Recipe: "]
 443=====================================
 444`git pull --rebase <url> <branch>`
 445=====================================
 446
 447You can then fix the conflicts during the rebase.  Presumably you have
 448not published your topic other than by mail, so rebasing it is not a
 449problem.
 450
 451If you receive such a patch series (as maintainer, or perhaps as a
 452reader of the mailing list it was sent to), save the mails to files,
 453create a new topic branch and use 'git am' to import the commits:
 454
 455.format-patch/am: Importing patches
 456[caption="Recipe: "]
 457=====================================
 458`git am < patch`
 459=====================================
 460
 461One feature worth pointing out is the three-way merge, which can help
 462if you get conflicts: `git am -3` will use index information contained
 463in patches to figure out the merge base.  See linkgit:git-am[1] for
 464other options.
 465
 466
 467SEE ALSO
 468--------
 469linkgit:gittutorial[7],
 470linkgit:git-push[1],
 471linkgit:git-pull[1],
 472linkgit:git-merge[1],
 473linkgit:git-rebase[1],
 474linkgit:git-format-patch[1],
 475linkgit:git-send-email[1],
 476linkgit:git-am[1]
 477
 478GIT
 479---
 480Part of the linkgit:git[1] suite