Merge branch 'rg/doc-workflow'
* rg/doc-workflow: Add branch management for releases to gitworkflows
This commit is contained in:
commit
ef6a243e95
@ -209,6 +209,121 @@ chance to see if their in-progress work will be compatible. `git.git`
|
||||
has such an official throw-away integration branch called 'pu'.
|
||||
|
||||
|
||||
Branch management for a release
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Assuming you are using the merge approach discussed above, when you
|
||||
are releasing your project you will need to do some additional branch
|
||||
management work.
|
||||
|
||||
A feature release is created from the 'master' branch, since 'master'
|
||||
tracks the commits that should go into the next feature release.
|
||||
|
||||
The 'master' branch is supposed to be a superset of 'maint'. If this
|
||||
condition does not hold, then 'maint' contains some commits that
|
||||
are not included on 'master'. The fixes represented by those commits
|
||||
will therefore not be included in your feature release.
|
||||
|
||||
To verify that 'master' is indeed a superset of 'maint', use git log:
|
||||
|
||||
.Verify 'master' is a superset of 'maint'
|
||||
[caption="Recipe: "]
|
||||
=====================================
|
||||
git log master..maint
|
||||
=====================================
|
||||
|
||||
This command should not list any commits. Otherwise, check out
|
||||
'master' and merge 'maint' into it.
|
||||
|
||||
Now you can proceed with the creation of the feature release. Apply a
|
||||
tag to the tip of 'master' indicating the release version:
|
||||
|
||||
.Release tagging
|
||||
[caption="Recipe: "]
|
||||
=====================================
|
||||
`git tag -s -m "GIT X.Y.Z" vX.Y.Z master`
|
||||
=====================================
|
||||
|
||||
You need to push the new tag to a public git server (see
|
||||
"DISTRIBUTED WORKFLOWS" below). This makes the tag available to
|
||||
others tracking your project. The push could also trigger a
|
||||
post-update hook to perform release-related items such as building
|
||||
release tarballs and preformatted documentation pages.
|
||||
|
||||
Similarly, for a maintenance release, 'maint' is tracking the commits
|
||||
to be released. Therefore, in the steps above simply tag and push
|
||||
'maint' rather than 'master'.
|
||||
|
||||
|
||||
Maintenance branch management after a feature release
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
After a feature release, you need to manage your maintenance branches.
|
||||
|
||||
First, if you wish to continue to release maintenance fixes for the
|
||||
feature release made before the recent one, then you must create
|
||||
another branch to track commits for that previous release.
|
||||
|
||||
To do this, the current maintenance branch is copied to another branch
|
||||
named with the previous release version number (e.g. maint-X.Y.(Z-1)
|
||||
where X.Y.Z is the current release).
|
||||
|
||||
.Copy maint
|
||||
[caption="Recipe: "]
|
||||
=====================================
|
||||
`git branch maint-X.Y.(Z-1) maint`
|
||||
=====================================
|
||||
|
||||
The 'maint' branch should now be fast-forwarded to the newly released
|
||||
code so that maintenance fixes can be tracked for the current release:
|
||||
|
||||
.Update maint to new release
|
||||
[caption="Recipe: "]
|
||||
=====================================
|
||||
* `git checkout maint`
|
||||
* `git merge --ff-only master`
|
||||
=====================================
|
||||
|
||||
If the merge fails because it is not a fast-forward, then it is
|
||||
possible some fixes on 'maint' were missed in the feature release.
|
||||
This will not happen if the content of the branches was verified as
|
||||
described in the previous section.
|
||||
|
||||
|
||||
Branch management for next and pu after a feature release
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
After a feature release, the integration branch 'next' may optionally be
|
||||
rewound and rebuilt from the tip of 'master' using the surviving
|
||||
topics on 'next':
|
||||
|
||||
.Rewind and rebuild next
|
||||
[caption="Recipe: "]
|
||||
=====================================
|
||||
* `git checkout next`
|
||||
* `git reset --hard master`
|
||||
* `git merge ai/topic_in_next1`
|
||||
* `git merge ai/topic_in_next2`
|
||||
* ...
|
||||
=====================================
|
||||
|
||||
The advantage of doing this is that the history of 'next' will be
|
||||
clean. For example, some topics merged into 'next' may have initially
|
||||
looked promising, but were later found to be undesirable or premature.
|
||||
In such a case, the topic is reverted out of 'next' but the fact
|
||||
remains in the history that it was once merged and reverted. By
|
||||
recreating 'next', you give another incarnation of such topics a clean
|
||||
slate to retry, and a feature release is a good point in history to do
|
||||
so.
|
||||
|
||||
If you do this, then you should make a public announcement indicating
|
||||
that 'next' was rewound and rebuilt.
|
||||
|
||||
The same rewind and rebuild process may be followed for 'pu'. A public
|
||||
announcement is not necessary since 'pu' is a throw-away branch, as
|
||||
described above.
|
||||
|
||||
|
||||
DISTRIBUTED WORKFLOWS
|
||||
---------------------
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user