~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to doc/centralized_workflow.txt

  • Committer: Aaron Bentley
  • Date: 2007-02-06 14:52:16 UTC
  • mfrom: (2266 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2268.
  • Revision ID: abentley@panoramicfeedback.com-20070206145216-fcpi8o3ufvuzwbp9
Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
Centralized Workflow
3
3
====================
4
4
 
 
5
.. sectnum::
 
6
 
 
7
 
5
8
Overview
6
9
========
7
10
 
8
 
This document describes some basic workflow for using Bazaar_. This doesn't
9
 
try to explain *why* every step is done, but more gives recommendations
10
 
about what is considered a good way to work with Bazaar_.
11
 
Bazaar_ is designed to be very flexible in workflows, from fully
12
 
decentralized to mostly centralized.
13
 
The practices here are meant to help ease the user into more advanced usage
14
 
of Bazaar_, and allowing them to work in a mix of centralized and
15
 
decentralized operation.
 
11
This document describes a possible workflow for using Bazaar_. That of
 
12
using Bazaar_, the distributed version control system, in a centralized
 
13
manner. Bazaar_ is designed to be very flexible and allows several
 
14
different workflows, from fully decentralized to mostly centralized.  The
 
15
workflow used here is meant to ease a new user into more advanced usage of
 
16
Bazaar_, and allows them to work in a mix of centralized and decentralized
 
17
operations.
16
18
 
17
 
In general, this document is meant for people in a work setting. Where
18
 
several people are working on the same codebase, and want to work with
19
 
eachother and keep in sync. However, this workflow is also applicable to a
20
 
single developer, who might work on several machines, and wants to keep in
21
 
sync with themselves.
 
19
In general, this document is meant for users coming from a background of
 
20
centralized version control systems such as CVS or subversion. It is
 
21
common in work settings to have a single central server hosting the
 
22
codebase, with several people working on this codebase, keeping their work
 
23
in sync.  This workflow is also applicable to a single developer working
 
24
on several different machines.
22
25
 
23
26
.. _Bazaar: http://bazaar-vcs.org
24
27
 
 
28
.. contents::
 
29
 
25
30
 
26
31
Initial Setup
27
32
=============
34
39
------------------
35
40
 
36
41
Your user identity is stored with each commit. While this doesn't have to
37
 
be accurate, unique, or anything else, it will be used in log messages an
38
 
annotations, so it is nice to have something real.::
39
 
 
40
 
  % bzr whoami "John Doe <jdoe@organization.com>"
 
42
be accurate or unique, it will be used in log messages and
 
43
annotations, so it is better to have something real.
 
44
 
 
45
::  
 
46
 
 
47
   % bzr whoami "John Doe <jdoe@organization.com>"
41
48
 
42
49
 
43
50
Setting up a local Repository
45
52
 
46
53
Bazaar_ branches generally copy the history information around with them,
47
54
which is part of how you can work in a fully decentralized manner. As an
48
 
optimization, it is possible for branches to combine their storage needs,
49
 
so that you do not need to copy around all of this history information
50
 
whenever you create a new branch.
 
55
optimization, it is possible for related branches to combine their storage
 
56
needs so that you do not need to copy around all of this history
 
57
information whenever you create a new branch.
51
58
 
52
59
The best way to do this is to create a `Shared Repository`_. In general,
53
60
branches will share their storage if they exist in a subdirectory of a
54
 
`Shared Repository`_.  So lets setup a `Shared Repository`_ in our home
 
61
`Shared Repository`_.  So let's setup a `Shared Repository`_ in our home
55
62
directory, thus all branches we create underneath will share their history
56
 
storage.::
 
63
storage.
 
64
 
 
65
::
57
66
 
58
67
  % bzr init-repo --trees ~
59
68
 
60
69
 
61
70
Setting up a remote Repository
62
 
------------------------------
63
 
 
64
 
Many times you want a location where data is stored separate from where
65
 
you do your work. This workflow is required by centralized systems (CVS/SVN).
66
 
Usually they are on separate machines, but not always. This is actually a
67
 
pretty good setup, especially in a work environment. Because it ensures
68
 
a central location where data can be backed up, and means that if something
69
 
happens to a developer's machine, no committed work has been lost.
70
 
 
71
 
So lets set up a shared location for our project. Again, we will use a
72
 
`Shared Repository`_ to optimize disk usage.::
 
71
---------------------------------
 
72
 
 
73
Many times you want a location where data is stored separately from where
 
74
you do your work. This workflow is required by centralized systems
 
75
(CVS/SVN).  Usually they are on separate machines, but not always. This is
 
76
actually a pretty good setup, especially in a work environment. Since it
 
77
ensures a central location where data can be backed up, and means that if
 
78
something happens to a developer's machine, no committed work has to be
 
79
lost.
 
80
 
 
81
So let's set up a shared location for our project on a remote machine
 
82
called ``centralhost``. Again, we will use a
 
83
`Shared Repository`_ to optimize disk usage.
 
84
 
 
85
::
73
86
 
74
87
  % bzr init-repo --no-trees sftp://centralhost/srv/bzr/
75
88
 
76
89
You can think of this step as similar to setting up a new cvsroot, or
77
 
subversion repository (only obviously it is a little bit simpler).
78
 
 
79
 
 
80
 
Starting to version an existing project
81
 
=======================================
82
 
 
83
 
Now that we have a repository, lets get going with a new project. Most of
84
 
the time, you will already have some code that you started working with,
 
90
subversion repository.
 
91
 
 
92
 
 
93
Versioning an existing project
 
94
==============================
 
95
 
 
96
Now that we have a repository, let's create a versioned project. Most of
 
97
the time, you will already have some code that you are working with,
85
98
that you now want to version using Bazaar_. If the code was originally
86
99
in source control, there are many ways to convert the project to Bazaar_
87
 
without losing any history. However, this is outside of the scope of this
88
 
document. See XXXReferenceConversionOfHistory_.
 
100
without losing any history. However, this is outside the scope of this
 
101
document. See `Tracking Upstream`_ for some possibilities (section
 
102
"Converting and keeping history").
 
103
 
 
104
.. _Tracking Upstream: http://bazaar-vcs.org/TrackingUpstream
 
105
 
 
106
.. 
 
107
   XXX: We really need a different document for discussing conversion of a
 
108
   project. Right now TrackingUpstream is the best we have, though.
89
109
 
90
110
 
91
111
Developer 1: Creating the first revision
93
113
 
94
114
So first, we want to create a branch in our remote Repository, where we
95
115
will want to host the project.  Let's assume we have a project named
96
 
"sigil" that we want to start versioning, and create an empty branch::
 
116
"sigil" that we want to start versioning.
 
117
 
 
118
::
97
119
 
98
120
  % bzr init sftp://centralhost/srv/bzr/sigil
99
121
 
100
122
This can be thought of as the "HEAD" branch in CVS terms, or as the "trunk"
101
 
in Subversion terms. We typically call this the ``dev`` branch.
 
123
in Subversion terms. We will call this the ``dev`` branch.
102
124
 
103
 
I prefer working in a subdirectory of ``$HOME`` to avoid collisions with all
104
 
the other stuff that ends up in ``$HOME``. Also, we will want a project
 
125
I prefer working in a subdirectory of my home directory to avoid collisions with all
 
126
the other files that end up there. Also, we will want a project
105
127
directory where we can hold all of the different branches we end up
106
 
working on::
 
128
working on.
 
129
 
 
130
::
107
131
 
108
132
  % cd ~
109
133
  % mkdir work
116
140
  % bzr add
117
141
  % bzr commit -m "Initial import of Sigil"
118
142
 
119
 
There are many ways to setup your working directory, but the above way
120
 
will makes it easy to handle working with feature/bugfix branches. And one
 
143
 
 
144
In the example above, we created an empty branch (the ``/sigil`` branch)
 
145
on ``centralhost``, and then checkout out this empty branch onto our
 
146
workstation to add files from our existing project.
 
147
There are many ways to setup your working directory, but the steps above
 
148
make it easy to handle working with feature/bugfix branches. And one
121
149
of the strong points of Bazaar_ is how well it works with branches.
122
150
 
123
151
At this point, because you have a 'checkout' of the remote branch, any
124
 
commits you make in ``dev/`` will automatically be saved both locally,
 
152
commits you make in ``~/work/sigil/dev/`` will automatically be saved both locally,
125
153
and on ``centralhost``.
126
154
 
127
155
 
129
157
--------------------------------------------------
130
158
 
131
159
Since the first developer did all of the work of creating the project,
132
 
all other developers can just get a checkout of that branch. They should
133
 
still follow `Setting User Email`_ and `Setting up a local Repository`_.
 
160
all other developers would just checkout that branch. **They should
 
161
still follow** `Setting User Email`_ and `Setting up a local Repository`_.
134
162
 
135
 
Then to get a copy of the current tip::
 
163
To get a copy of the current development tree::
136
164
 
137
165
  % cd ~/work/sigil
138
166
  % bzr checkout sftp://centralhost/srv/bzr/sigil dev
139
167
 
140
168
Now that two people both have a checkout of
141
169
``sftp://centralhost/srv/bzr/sigil``, there will be times when one of
142
 
them is out of date with the current version. Bazaar_ will inform the user
143
 
of this and prevent them from committing. To get up to date use ``bzr
144
 
update``, which will update the tree with the remote changes. This may
145
 
require resolving conflicts, in the case that the same files have been
146
 
modified.
 
170
the checkouts will be out of date with the current version.
 
171
At commit time, Bazaar_ will inform the user of this and prevent them from
 
172
committing. To get up to date, use ``bzr update`` to update the
 
173
tree with the remote changes. This may require resolving conflicts, if the
 
174
same files have been modified.
147
175
 
148
176
 
149
177
Developing on separate branches
150
178
===============================
151
179
 
152
180
So far everyone is working and committing their changes into the same
153
 
branch. Which means that everyone needs to update fairly regularly, and
 
181
branch. This means that everyone needs to update fairly regularly and
154
182
deal with other people's changes. Also, if one person commits something
155
 
which breaks the codebase, then everyone has to deal with it.
 
183
that breaks the codebase, then upon syncing, everyone will get the
 
184
problem.
156
185
 
157
 
Usually, it is better to do development on individual branches, and then
 
186
Usually, it is better to do development on different branches, and then
158
187
integrate those back into the main branch, once they are stable. This is
159
188
one of the biggest changes from working with CVS/SVN. They both allow you
160
189
to work on separate branches, but their merging algorithms are fairly
161
 
weak, so it is difficult to keep things synchronized. Bazaar_ merges track
 
190
weak, so it is difficult to keep things synchronized. Bazaar_ tracks
162
191
what has already been merged, and can even apply changes to files that
163
192
have been renamed.
164
193
 
167
196
------------------------------------
168
197
 
169
198
We want to keep our changes available for other people, even if they
170
 
aren't quite complete yet. So we will create a new public branch, and
171
 
track it locally.::
 
199
aren't quite complete yet. So we will create a new public branch on
 
200
``centralhost``, and track it locally.
 
201
 
 
202
::
172
203
 
173
204
  % cd ~/work/sigil
174
205
  % bzr branch sftp://centralhost/srv/bzr/sigil \
176
207
  % bzr checkout sftp://centralhost/srv/bzr/sigil/doodle-fixes doodle-fixes
177
208
  % cd doodle-fixes
178
209
 
179
 
We now have a place to make any fixes to doodles that we need. And we
180
 
won't interrupt people who are working on other parts of the code.
181
 
Because we have a checkout, any commits made in the ``doodle-fixes/`` will
182
 
also show up on ``centralhost``. [#nestedbranches_]
183
 
It is also completely possible to have 2 developers collaborate on one of
184
 
these branches, just like they would have collaborated on the ``dev``
185
 
branch.[#cbranch]_
 
210
We now have a place to make any fixes we need to ``doodle``. And we would
 
211
not interrupt people who are working on other parts of the code.  Because
 
212
we have a checkout, any commits made in the ``~/work/sigil/doodle-fixes/``
 
213
will also show up on ``centralhost``. [#nestedbranches]_ It is also
 
214
possible to have 2 developers collaborate on one of these branches, just
 
215
like they would have collaborated on the ``dev`` branch. [#cbranch]_
 
216
 
 
217
.. [#nestedbranches] It may look odd to have a branch in a subdirectory of
 
218
   another branch. This is just fine, and you can think of it as a
 
219
   heirarchial namespace. Where the nested branch is derived from the
 
220
   outer branch.
186
221
 
187
222
.. [#cbranch] When using lots of independent branches, having to retype
188
223
   the full URL all the time takes a lot of typing. We are looking into
193
228
   Configuring ``cbranch`` is outside the scope of this document, but the
194
229
   final commands look like ``bzr cbranch dev my-feature-branch``
195
230
 
196
 
.. [#nestedbranches] It may look odd to have a branch in a subdirectory of
197
 
   another branch. However, this is just fine, and you can think of it as
198
 
   a heirarchial namespace. Where the nested branch is derived from the
199
 
   outer branch.
200
 
 
201
231
.. _bzrtools: https://launchpad.net/products/bzrtools
202
232
 
203
233
 
204
234
Merging changes back
205
235
--------------------
206
236
 
207
 
When it is decided that some of the changes in ``doodle-fixes`` is ready
208
 
to be merged into the main tree, simply do::
 
237
When it is decided that some of the changes in ``doodle-fixes`` are ready
 
238
to be merged into the main branch, simply do::
209
239
 
210
240
  % cd ~/work/sigil/dev
211
241
  % bzr merge ../doodle-fixes
212
242
 
213
 
Now the changes are available in the ``dev`` branch, but they haven't been
214
 
committed yet. This is the time when you want to review the final changes,
215
 
and make sure they are what you want. ``bzr status`` and ``bzr diff`` are
216
 
good tools to use here. Also, there may be some conflicts in files, if
217
 
there were changes made to the same file. Bazaar_ will prevent you from
218
 
committing until you have resolved these conflicts. That way you don't
219
 
accidentally commit the conflict markers. ``bzr status`` will show the
220
 
conflicts along with the other changes, or you can use ``bzr conflicts``
221
 
to just list conflicts. Use ``bzr resolve file/name`` or ``bzr resolve
222
 
--all`` once conflicts have been handled.[#resolve]_
223
 
If you have a conflict that is particularly difficult to solve you may
224
 
want to use the ``bzr remerge`` command. It will let you try different
225
 
merge algorithms, as well as let you see the original source lines
226
 
(``--show-base``).
 
243
Now the changes are available in the ``dev`` branch, but they have not
 
244
been committed yet. This is the time when you want to review the final
 
245
changes, and double check the code to make sure it compiles cleanly and
 
246
passes the test suite. The commands ``bzr status`` and ``bzr diff`` are
 
247
good tools to use here. Also, this is the time to resolve any conflicts.
 
248
Bazaar_ will prevent you from committing until you have resolved these
 
249
conflicts. That way you don't accidentally commit the conflict markers.
 
250
The command ``bzr status`` will show the conflicts along with the other
 
251
changes, or you can use ``bzr conflicts`` to just list conflicts. Use
 
252
``bzr resolve file/name`` or ``bzr resolve --all`` once conflicts have
 
253
been handled. [#resolve]_ If you have a conflict that is particularly
 
254
difficult to solve you may want to use the ``bzr remerge`` command. It
 
255
will let you try different merge algorithms, as well as let you see the
 
256
original source lines (``--show-base``).
227
257
 
228
258
.. [#resolve] Some systems make you resolve conflicts as part of the merge
229
259
   process. We have found that it is usually easier to resolve conflicts
259
289
Shared Repository
260
290
-----------------
261
291
 
262
 
Bazaar_ has the concept of a `Shared Repository`_. This is similar to the
 
292
Bazaar_ has the concept of a "Shared Repository". This is similar to the
263
293
concept of other RCS's repository. Such as in Subversion, where you have a
264
294
remote repository, which is where all of the history is stored, and
265
295
locally you don't have any history information, only a checkout of the
267
297
between branches. It *may* be shared between people, but standalone
268
298
branches can also be shared between people.
269
299
 
270
 
In Bazaar_ terms, a `Shared Repository`_ is a location where multiple
 
300
In Bazaar_ terms, a "Shared Repository" is a location where multiple
271
301
branches can **share** their revision history information. Because Bazaar_
272
302
wants to support decentralized workflows, it is possible for every branch
273
303
to maintain its own revision history information. But this is often
274
 
inefficient, since often branches share history, and they might as well
 
304
inefficient, since related branches share history, and they might as well
275
305
share the storage as well.
276
306
 
277
307