]> git.ipfire.org Git - thirdparty/git.git/blame - Documentation/tutorial.txt
Revert "Adapt tutorial to cygwin and add test case"
[thirdparty/git.git] / Documentation / tutorial.txt
CommitLineData
8c7fa247
LT
1A short git tutorial
2====================
2a29da7c 3v0.99.5, Aug 2005
8c7fa247
LT
4
5Introduction
6------------
7
8This is trying to be a short tutorial on setting up and using a git
2a29da7c 9repository, mainly because being hands-on and using explicit examples is
8c7fa247
LT
10often the best way of explaining what is going on.
11
12In normal life, most people wouldn't use the "core" git programs
13directly, but rather script around them to make them more palatable.
14Understanding the core git stuff may help some people get those scripts
15done, though, and it may also be instructive in helping people
16understand what it is that the higher-level helper scripts are actually
17doing.
18
19The core git is often called "plumbing", with the prettier user
2a29da7c 20interfaces on top of it called "porcelain". You may not want to use the
f35ca9ed
LT
21plumbing directly very often, but it can be good to know what the
22plumbing does for when the porcelain isn't flushing...
8c7fa247
LT
23
24
2a29da7c
JH
25Creating a git repository
26-------------------------
8c7fa247 27
2a29da7c 28Creating a new git repository couldn't be easier: all git repositories start
8c7fa247
LT
29out empty, and the only thing you need to do is find yourself a
30subdirectory that you want to use as a working tree - either an empty
31one for a totally new project, or an existing working tree that you want
32to import into git.
33
2a29da7c 34For our first example, we're going to start a totally new repository from
8db9307c 35scratch, with no pre-existing files, and we'll call it `git-tutorial`.
8c7fa247 36To start up, create a subdirectory for it, change into that
8db9307c 37subdirectory, and initialize the git infrastructure with `git-init-db`:
8c7fa247 38
8db9307c
JH
39------------------------------------------------
40mkdir git-tutorial
41cd git-tutorial
42git-init-db
43------------------------------------------------
8c7fa247
LT
44
45to which git will reply
46
47 defaulting to local storage area
48
837eedf4 49which is just git's way of saying that you haven't been doing anything
914328ac 50strange, and that it will have created a local `.git` directory setup for
8db9307c
JH
51your new project. You will now have a `.git` directory, and you can
52inspect that with `ls`. For your new empty project, it should show you
2a29da7c 53three entries, among other things:
8c7fa247 54
494245d6 55 - a symlink called `HEAD`, pointing to `refs/heads/master`
8db9307c
JH
56+
57Don't worry about the fact that the file that the `HEAD` link points to
914328ac 58doesn't even exist yet -- you haven't created the commit that will
8db9307c 59start your `HEAD` development branch yet.
8c7fa247 60
8db9307c 61 - a subdirectory called `objects`, which will contain all the
8c7fa247
LT
62 objects of your project. You should never have any real reason to
63 look at the objects directly, but you might want to know that these
8db9307c
JH
64 objects are what contains all the real 'data' in your repository.
65
66 - a subdirectory called `refs`, which contains references to objects.
67
68In particular, the `refs` subdirectory will contain two other
69subdirectories, named `heads` and `tags` respectively. They do
70exactly what their names imply: they contain references to any number
71of different 'heads' of development (aka 'branches'), and to any
72'tags' that you have created to name specific versions in your
73repository.
74
75One note: the special `master` head is the default branch, which is
76why the `.git/HEAD` file was created as a symlink to it even if it
77doesn't yet exist. Basically, the `HEAD` link is supposed to always
78point to the branch you are working on right now, and you always
79start out expecting to work on the `master` branch.
80
81However, this is only a convention, and you can name your branches
82anything you want, and don't have to ever even 'have' a `master`
83branch. A number of the git tools will assume that `.git/HEAD` is
84valid, though.
85
86[NOTE]
914328ac 87An 'object' is identified by its 160-bit SHA1 hash, aka 'object name',
8db9307c 88and a reference to an object is always the 40-byte hex
914328ac 89representation of that SHA1 name. The files in the `refs`
8db9307c 90subdirectory are expected to contain these hex references
914328ac 91(usually with a final `\'\n\'` at the end), and you should thus
8db9307c 92expect to see a number of 41-byte files containing these
914328ac 93references in these `refs` subdirectories when you actually start
8db9307c 94populating your tree.
8c7fa247 95
a1d4aa74
JH
96[NOTE]
97An advanced user may want to take a look at the
98link:repository-layout.html[repository layout] document
99after finishing this tutorial.
100
2a29da7c 101You have now created your first git repository. Of course, since it's
8c7fa247
LT
102empty, that's not very useful, so let's start populating it with data.
103
104
2a29da7c
JH
105Populating a git repository
106---------------------------
8c7fa247
LT
107
108We'll keep this simple and stupid, so we'll start off with populating a
109few trivial files just to get a feel for it.
110
111Start off with just creating any random files that you want to maintain
2a29da7c 112in your git repository. We'll start off with a few bad examples, just to
8c7fa247
LT
113get a feel for how this works:
114
8db9307c
JH
115------------------------------------------------
116echo "Hello World" >hello
117echo "Silly example" >example
118------------------------------------------------
8c7fa247 119
914328ac 120you have now created two files in your working tree (aka 'working directory'), but to
8c7fa247
LT
121actually check in your hard work, you will have to go through two steps:
122
914328ac 123 - fill in the 'index' file (aka 'cache') with the information about your
2a29da7c 124 working tree state.
8c7fa247
LT
125
126 - commit that index file as an object.
127
128The first step is trivial: when you want to tell git about any changes
215a7ad1 129to your working tree, you use the `git-update-index` program. That
8c7fa247
LT
130program normally just takes a list of filenames you want to update, but
131to avoid trivial mistakes, it refuses to add new entries to the cache
132(or remove existing ones) unless you explicitly tell it that you're
914328ac
JH
133adding a new entry with the `\--add` flag (or removing an entry with the
134`\--remove`) flag.
8c7fa247
LT
135
136So to populate the index with the two files you just created, you can do
137
8db9307c 138------------------------------------------------
215a7ad1 139git-update-index --add hello example
8db9307c 140------------------------------------------------
8c7fa247
LT
141
142and you have now told git to track those two files.
143
144In fact, as you did that, if you now look into your object directory,
837eedf4 145you'll notice that git will have added two new objects to the object
2a29da7c 146database. If you did exactly the steps above, you should now be able to do
8c7fa247
LT
147
148 ls .git/objects/??/*
149
150and see two files:
151
152 .git/objects/55/7db03de997c86a4a028e1ebd3a1ceb225be238
153 .git/objects/f2/4c74a2e500f5ee1332c86b94199f52b1d1d962
154
2a29da7c 155which correspond with the objects with names of 557db... and f24c7..
8c7fa247
LT
156respectively.
157
914328ac 158If you want to, you can use `git-cat-file` to look at those objects, but
8c7fa247
LT
159you'll have to use the object name, not the filename of the object:
160
161 git-cat-file -t 557db03de997c86a4a028e1ebd3a1ceb225be238
162
914328ac 163where the `-t` tells `git-cat-file` to tell you what the "type" of the
8c7fa247
LT
164object is. Git will tell you that you have a "blob" object (ie just a
165regular file), and you can see the contents with
166
2a29da7c 167 git-cat-file "blob" 557db03
8c7fa247 168
2a29da7c 169which will print out "Hello World". The object 557db03 is nothing
914328ac 170more than the contents of your file `hello`.
8c7fa247 171
8db9307c 172[NOTE]
914328ac
JH
173Don't confuse that object with the file `hello` itself. The
174object is literally just those specific *contents* of the file, and
175however much you later change the contents in file `hello`, the object
176we just looked at will never change. Objects are immutable.
2a29da7c 177
8db9307c
JH
178[NOTE]
179The second example demonstrates that you can
180abbreviate the object name to only the first several
181hexadecimal digits in most places.
8c7fa247
LT
182
183Anyway, as we mentioned previously, you normally never actually take a
2a29da7c
JH
184look at the objects themselves, and typing long 40-character hex
185names is not something you'd normally want to do. The above digression
215a7ad1 186was just to show that `git-update-index` did something magical, and
2a29da7c
JH
187actually saved away the contents of your files into the git object
188database.
8c7fa247 189
8db9307c 190Updating the cache did something else too: it created a `.git/index`
2a29da7c
JH
191file. This is the index that describes your current working tree, and
192something you should be very aware of. Again, you normally never worry
8c7fa247
LT
193about the index file itself, but you should be aware of the fact that
194you have not actually really "checked in" your files into git so far,
914328ac 195you've only *told* git about them.
8c7fa247 196
f35ca9ed 197However, since git knows about them, you can now start using some of the
8c7fa247
LT
198most basic git commands to manipulate the files or look at their status.
199
200In particular, let's not even check in the two files into git yet, we'll
914328ac 201start off by adding another line to `hello` first:
8c7fa247 202
8db9307c
JH
203------------------------------------------------
204echo "It's a new day for git" >>hello
205------------------------------------------------
8c7fa247 206
914328ac 207and you can now, since you told git about the previous state of `hello`, ask
8c7fa247 208git what has changed in the tree compared to your old index, using the
914328ac 209`git-diff-files` command:
8c7fa247 210
914328ac
JH
211------------
212git-diff-files
213------------
8c7fa247 214
2a29da7c 215Oops. That wasn't very readable. It just spit out its own internal
914328ac 216version of a `diff`, but that internal version really just tells you
a05ed8cb 217that it has noticed that "hello" has been modified, and that the old object
8c7fa247
LT
218contents it had have been replaced with something else.
219
220To make it readable, we can tell git-diff-files to output the
914328ac 221differences as a patch, using the `-p` flag:
8c7fa247 222
914328ac
JH
223------------
224git-diff-files -p
225------------
8c7fa247
LT
226
227which will spit out
228
914328ac
JH
229------------
230diff --git a/hello b/hello
231--- a/hello
232+++ b/hello
233@@ -1 +1,2 @@
234 Hello World
235+It's a new day for git
236----
8c7fa247 237
914328ac 238i.e. the diff of the change we caused by adding another line to `hello`.
8c7fa247 239
914328ac 240In other words, `git-diff-files` always shows us the difference between
8c7fa247
LT
241what is recorded in the index, and what is currently in the working
242tree. That's very useful.
243
914328ac
JH
244A common shorthand for `git-diff-files -p` is to just write `git
245diff`, which will do the same thing.
ed616049 246
8c7fa247 247
2a29da7c
JH
248Committing git state
249--------------------
8c7fa247
LT
250
251Now, we want to go to the next stage in git, which is to take the files
252that git knows about in the index, and commit them as a real tree. We do
914328ac
JH
253that in two phases: creating a 'tree' object, and committing that 'tree'
254object as a 'commit' object together with an explanation of what the
8c7fa247
LT
255tree was all about, along with information of how we came to that state.
256
914328ac 257Creating a tree object is trivial, and is done with `git-write-tree`.
8c7fa247
LT
258There are no options or other input: git-write-tree will take the
259current index state, and write an object that describes that whole
2a29da7c 260index. In other words, we're now tying together all the different
8c7fa247
LT
261filenames with their contents (and their permissions), and we're
262creating the equivalent of a git "directory" object:
263
8db9307c
JH
264------------------------------------------------
265git-write-tree
266------------------------------------------------
8c7fa247
LT
267
268and this will just output the name of the resulting tree, in this case
ade75a59 269(if you have done exactly as I've described) it should be
8c7fa247 270
a05ed8cb 271 8988da15d077d4829fc51d8544c097def6644dbb
8c7fa247
LT
272
273which is another incomprehensible object name. Again, if you want to,
914328ac 274you can use `git-cat-file -t 8988d\...` to see that this time the object
8c7fa247 275is not a "blob" object, but a "tree" object (you can also use
914328ac 276`git-cat-file` to actually output the raw object contents, but you'll see
8c7fa247
LT
277mainly a binary mess, so that's less interesting).
278
914328ac 279However -- normally you'd never use `git-write-tree` on its own, because
8c7fa247 280normally you always commit a tree into a commit object using the
914328ac
JH
281`git-commit-tree` command. In fact, it's easier to not actually use
282`git-write-tree` on its own at all, but to just pass its result in as an
283argument to `git-commit-tree`.
8c7fa247 284
914328ac
JH
285`git-commit-tree` normally takes several arguments -- it wants to know
286what the 'parent' of a commit was, but since this is the first commit
2a29da7c 287ever in this new repository, and it has no parents, we only need to pass in
914328ac
JH
288the object name of the tree. However, `git-commit-tree`
289also wants to get a commit message
2a29da7c 290on its standard input, and it will write out the resulting object name for the
8c7fa247
LT
291commit to its standard output.
292
494245d6 293And this is where we start using the `.git/HEAD` file. The `HEAD` file is
b67b9b20
JH
294supposed to contain the reference to the top-of-tree, and since that's
295exactly what `git-commit-tree` spits out, we can do this all with a simple
296shell pipeline:
8c7fa247 297
8db9307c 298------------------------------------------------
494245d6 299echo "Initial commit" | git-commit-tree $(git-write-tree) > .git/HEAD
8db9307c 300------------------------------------------------
8c7fa247
LT
301
302which will say:
303
a05ed8cb 304 Committing initial tree 8988da15d077d4829fc51d8544c097def6644dbb
8c7fa247
LT
305
306just to warn you about the fact that it created a totally new commit
914328ac 307that is not related to anything else. Normally you do this only *once*
8c7fa247
LT
308for a project ever, and all later commits will be parented on top of an
309earlier commit, and you'll never see this "Committing initial tree"
310message ever again.
311
2a29da7c 312Again, normally you'd never actually do this by hand. There is a
914328ac
JH
313helpful script called `git commit` that will do all of this for you. So
314you could have just written `git commit`
ed616049
LT
315instead, and it would have done the above magic scripting for you.
316
8c7fa247 317
2a29da7c
JH
318Making a change
319---------------
8c7fa247 320
215a7ad1 321Remember how we did the `git-update-index` on file `hello` and then we
914328ac 322changed `hello` afterward, and could compare the new state of `hello` with the
8c7fa247
LT
323state we saved in the index file?
324
914328ac
JH
325Further, remember how I said that `git-write-tree` writes the contents
326of the *index* file to the tree, and thus what we just committed was in
327fact the *original* contents of the file `hello`, not the new ones. We did
8c7fa247 328that on purpose, to show the difference between the index state, and the
2a29da7c 329state in the working tree, and how they don't have to match, even
8c7fa247
LT
330when we commit things.
331
914328ac 332As before, if we do `git-diff-files -p` in our git-tutorial project,
8c7fa247 333we'll still see the same difference we saw last time: the index file
2a29da7c 334hasn't changed by the act of committing anything. However, now that we
8c7fa247 335have committed something, we can also learn to use a new command:
215a7ad1 336`git-diff-index`.
8c7fa247 337
914328ac 338Unlike `git-diff-files`, which showed the difference between the index
215a7ad1 339file and the working tree, `git-diff-index` shows the differences
914328ac 340between a committed *tree* and either the index file or the working
215a7ad1 341tree. In other words, `git-diff-index` wants a tree to be diffed
a7b20909
LT
342against, and before we did the commit, we couldn't do that, because we
343didn't have anything to diff against.
8c7fa247 344
914328ac 345But now we can do
8c7fa247 346
215a7ad1 347 git-diff-index -p HEAD
8c7fa247 348
914328ac 349(where `-p` has the same meaning as it did in `git-diff-files`), and it
8c7fa247 350will show us the same difference, but for a totally different reason.
2a29da7c
JH
351Now we're comparing the working tree not against the index file,
352but against the tree we just wrote. It just so happens that those two
a7b20909
LT
353are obviously the same, so we get the same result.
354
ed616049
LT
355Again, because this is a common operation, you can also just shorthand
356it with
357
358 git diff HEAD
359
360which ends up doing the above for you.
361
215a7ad1 362In other words, `git-diff-index` normally compares a tree against the
914328ac 363working tree, but when given the `\--cached` flag, it is told to
a7b20909 364instead compare against just the index cache contents, and ignore the
2a29da7c 365current working tree state entirely. Since we just wrote the index
215a7ad1 366file to HEAD, doing `git-diff-index \--cached -p HEAD` should thus return
a7b20909
LT
367an empty set of differences, and that's exactly what it does.
368
8db9307c 369[NOTE]
914328ac 370================
215a7ad1 371`git-diff-index` really always uses the index for its
8db9307c
JH
372comparisons, and saying that it compares a tree against the working
373tree is thus not strictly accurate. In particular, the list of
914328ac
JH
374files to compare (the "meta-data") *always* comes from the index file,
375regardless of whether the `\--cached` flag is used or not. The `\--cached`
376flag really only determines whether the file *contents* to be compared
8db9307c 377come from the working tree or not.
914328ac 378
8db9307c
JH
379This is not hard to understand, as soon as you realize that git simply
380never knows (or cares) about files that it is not told about
914328ac 381explicitly. Git will never go *looking* for files to compare, it
8db9307c
JH
382expects you to tell it what the files are, and that's what the index
383is there for.
914328ac 384================
8c7fa247 385
914328ac 386However, our next step is to commit the *change* we did, and again, to
837eedf4 387understand what's going on, keep in mind the difference between "working
2a29da7c
JH
388tree contents", "index file" and "committed tree". We have changes
389in the working tree that we want to commit, and we always have to
8c7fa247
LT
390work through the index file, so the first thing we need to do is to
391update the index cache:
392
8db9307c 393------------------------------------------------
215a7ad1 394git-update-index hello
8db9307c 395------------------------------------------------
8c7fa247 396
914328ac 397(note how we didn't need the `\--add` flag this time, since git knew
8c7fa247
LT
398about the file already).
399
914328ac
JH
400Note what happens to the different `git-diff-\*` versions here. After
401we've updated `hello` in the index, `git-diff-files -p` now shows no
215a7ad1 402differences, but `git-diff-index -p HEAD` still *does* show that the
2a29da7c 403current state is different from the state we committed. In fact, now
215a7ad1 404`git-diff-index` shows the same difference whether we use the `--cached`
2a29da7c 405flag or not, since now the index is coherent with the working tree.
8c7fa247 406
914328ac 407Now, since we've updated `hello` in the index, we can commit the new
2a29da7c 408version. We could do it by writing the tree by hand again, and
914328ac
JH
409committing the tree (this time we'd have to use the `-p HEAD` flag to
410tell commit that the HEAD was the *parent* of the new commit, and that
ed616049
LT
411this wasn't an initial commit any more), but you've done that once
412already, so let's just use the helpful script this time:
8c7fa247 413
8db9307c
JH
414------------------------------------------------
415git commit
416------------------------------------------------
8c7fa247 417
ed616049 418which starts an editor for you to write the commit message and tells you
2a29da7c 419a bit about what you have done.
ed616049 420
8c7fa247
LT
421Write whatever message you want, and all the lines that start with '#'
422will be pruned out, and the rest will be used as the commit message for
423the change. If you decide you don't want to commit anything after all at
424this point (you can continue to edit things and update the cache), you
914328ac 425can just leave an empty message. Otherwise `git commit` will commit
8c7fa247
LT
426the change for you.
427
8c7fa247 428You've now made your first real git commit. And if you're interested in
914328ac 429looking at what `git commit` really does, feel free to investigate:
8c7fa247 430it's a few very simple shell scripts to generate the helpful (?) commit
914328ac 431message headers, and a few one-liners that actually do the
215a7ad1 432commit itself (`git-commit`).
8c7fa247
LT
433
434
d154dcc8
JL
435Inspecting Changes
436------------------
8c7fa247
LT
437
438While creating changes is useful, it's even more useful if you can tell
2a29da7c 439later what changed. The most useful command for this is another of the
914328ac 440`diff` family, namely `git-diff-tree`.
8c7fa247 441
914328ac 442`git-diff-tree` can be given two arbitrary trees, and it will tell you the
8c7fa247
LT
443differences between them. Perhaps even more commonly, though, you can
444give it just a single commit object, and it will figure out the parent
445of that commit itself, and show the difference directly. Thus, to get
446the same diff that we've already seen several times, we can now do
447
448 git-diff-tree -p HEAD
449
914328ac
JH
450(again, `-p` means to show the difference as a human-readable patch),
451and it will show what the last commit (in `HEAD`) actually changed.
8c7fa247 452
914328ac 453More interestingly, you can also give `git-diff-tree` the `-v` flag, which
8c7fa247
LT
454tells it to also show the commit message and author and date of the
455commit, and you can tell it to show a whole series of diffs.
456Alternatively, you can tell it to be "silent", and not show the diffs at
457all, but just show the actual commit message.
458
914328ac
JH
459In fact, together with the `git-rev-list` program (which generates a
460list of revisions), `git-diff-tree` ends up being a veritable fount of
461changes. A trivial (but very useful) script called `git-whatchanged` is
8c7fa247 462included with git which does exactly this, and shows a log of recent
2a29da7c 463activities.
8c7fa247 464
81bb573e 465To see the whole history of our pitiful little git-tutorial project, you
8c7fa247
LT
466can do
467
81bb573e
LT
468 git log
469
470which shows just the log messages, or if we want to see the log together
cc29f732 471with the associated patches use the more complex (and much more
81bb573e
LT
472powerful)
473
837eedf4 474 git-whatchanged -p --root
8c7fa247 475
81bb573e
LT
476and you will see exactly what has changed in the repository over its
477short history.
478
8db9307c 479[NOTE]
914328ac
JH
480The `\--root` flag is a flag to `git-diff-tree` to tell it to
481show the initial aka 'root' commit too. Normally you'd probably not
8db9307c
JH
482want to see the initial import diff, but since the tutorial project
483was started from scratch and is so small, we use it to make the result
484a bit more interesting.
8c7fa247 485
837eedf4 486With that, you should now be having some inkling of what git does, and
8c7fa247
LT
487can explore on your own.
488
8db9307c
JH
489[NOTE]
490Most likely, you are not directly using the core
491git Plumbing commands, but using Porcelain like Cogito on top
492of it. Cogito works a bit differently and you usually do not
215a7ad1 493have to run `git-update-index` yourself for changed files (you
8db9307c 494do tell underlying git about additions and removals via
914328ac
JH
495`cg-add` and `cg-rm` commands). Just before you make a commit
496with `cg-commit`, Cogito figures out which files you modified,
215a7ad1 497and runs `git-update-index` on them for you.
3eb5128a
JH
498
499
2a29da7c
JH
500Tagging a version
501-----------------
3eb5128a 502
2a29da7c 503In git, there are two kinds of tags, a "light" one, and an "annotated tag".
3eb5128a
JH
504
505A "light" tag is technically nothing more than a branch, except we put
914328ac 506it in the `.git/refs/tags/` subdirectory instead of calling it a `head`.
3eb5128a
JH
507So the simplest form of tag involves nothing more than
508
8db9307c
JH
509------------------------------------------------
510git tag my-first-tag
511------------------------------------------------
3eb5128a 512
914328ac 513which just writes the current `HEAD` into the `.git/refs/tags/my-first-tag`
a7333f9e 514file, after which point you can then use this symbolic name for that
2a29da7c 515particular state. You can, for example, do
3eb5128a
JH
516
517 git diff my-first-tag
518
519to diff your current state against that tag (which at this point will
520obviously be an empty diff, but if you continue to develop and commit
ade75a59 521stuff, you can use your tag as an "anchor-point" to see what has changed
3eb5128a
JH
522since you tagged it.
523
2a29da7c 524An "annotated tag" is actually a real git object, and contains not only a
3eb5128a 525pointer to the state you want to tag, but also a small tag name and
914328ac
JH
526message, along with optionally a PGP signature that says that yes,
527you really did
528that tag. You create these annotated tags with either the `-a` or
529`-s` flag to `git tag`:
3eb5128a 530
a7333f9e 531 git tag -s <tagname>
3eb5128a 532
914328ac 533which will sign the current `HEAD` (but you can also give it another
3eb5128a 534argument that specifies the thing to tag, ie you could have tagged the
914328ac 535current `mybranch` point by using `git tag <tagname> mybranch`).
3eb5128a
JH
536
537You normally only do signed tags for major releases or things
538like that, while the light-weight tags are useful for any marking you
914328ac 539want to do -- any time you decide that you want to remember a certain
3eb5128a
JH
540point, just create a private tag for it, and you have a nice symbolic
541name for the state at that point.
542
543
2a29da7c
JH
544Copying repositories
545--------------------
f35ca9ed 546
2a29da7c 547Git repositories are normally totally self-sufficient, and it's worth noting
f35ca9ed 548that unlike CVS, for example, there is no separate notion of
914328ac
JH
549"repository" and "working tree". A git repository normally *is* the
550working tree, with the local git information hidden in the `.git`
2a29da7c 551subdirectory. There is nothing else. What you see is what you got.
f35ca9ed 552
8db9307c
JH
553[NOTE]
554You can tell git to split the git internal information from
555the directory that it tracks, but we'll ignore that for now: it's not
556how normal projects work, and it's really only meant for special uses.
557So the mental model of "the git information is always tied directly to
558the working tree that it describes" may not be technically 100%
559accurate, but it's a good model for all normal use.
f35ca9ed
LT
560
561This has two implications:
562
2a29da7c 563 - if you grow bored with the tutorial repository you created (or you've
f35ca9ed
LT
564 made a mistake and want to start all over), you can just do simple
565
566 rm -rf git-tutorial
8db9307c
JH
567+
568and it will be gone. There's no external repository, and there's no
569history outside the project you created.
f35ca9ed 570
2a29da7c 571 - if you want to move or duplicate a git repository, you can do so. There
914328ac 572 is `git clone` command, but if all you want to do is just to
2a29da7c 573 create a copy of your repository (with all the full history that
e7c1ca42 574 went along with it), you can do so with a regular
914328ac 575 `cp -a git-tutorial new-git-tutorial`.
8db9307c
JH
576+
577Note that when you've moved or copied a git repository, your git index
578file (which caches various information, notably some of the "stat"
579information for the files involved) will likely need to be refreshed.
914328ac 580So after you do a `cp -a` to create a new copy, you'll want to do
f35ca9ed 581
215a7ad1 582 git-update-index --refresh
8db9307c
JH
583+
584in the new repository to make sure that the index file is up-to-date.
f35ca9ed 585
2a29da7c 586Note that the second point is true even across machines. You can
914328ac
JH
587duplicate a remote git repository with *any* regular copy mechanism, be it
588`scp`, `rsync` or `wget`.
f35ca9ed
LT
589
590When copying a remote repository, you'll want to at a minimum update the
2a29da7c 591index cache when you do this, and especially with other peoples'
f35ca9ed 592repositories you often want to make sure that the index cache is in some
914328ac 593known state (you don't know *what* they've done and not yet checked in),
215a7ad1 594so usually you'll precede the `git-update-index` with a
f35ca9ed 595
ce30a4b6 596 git-read-tree --reset HEAD
215a7ad1 597 git-update-index --refresh
f35ca9ed 598
914328ac 599which will force a total index re-build from the tree pointed to by `HEAD`.
215a7ad1 600It resets the index contents to `HEAD`, and then the `git-update-index`
2a29da7c
JH
601makes sure to match up all index entries with the checked-out files.
602If the original repository had uncommitted changes in its
215a7ad1 603working tree, `git-update-index --refresh` notices them and
2a29da7c 604tells you they need to be updated.
f35ca9ed 605
ce30a4b6
LT
606The above can also be written as simply
607
608 git reset
609
610and in fact a lot of the common git command combinations can be scripted
c87d41eb
JL
611with the `git xyz` interfaces. You can learn things by just looking
612at what the various git scripts do. For example, `git reset` is the
613above two lines implemented in `git-reset`, but some things like
614`git status` and `git commit` are slightly more complex scripts around
615the basic git commands.
ce30a4b6 616
2a29da7c 617Many (most?) public remote repositories will not contain any of
914328ac 618the checked out files or even an index file, and will *only* contain the
2a29da7c 619actual core git files. Such a repository usually doesn't even have the
8db9307c 620`.git` subdirectory, but has all the git files directly in the
ce30a4b6 621repository.
f35ca9ed
LT
622
623To create your own local live copy of such a "raw" git repository, you'd
cc29f732 624first create your own subdirectory for the project, and then copy the
914328ac 625raw repository contents into the `.git` directory. For example, to
f35ca9ed
LT
626create your own copy of the git repository, you'd do the following
627
628 mkdir my-git
629 cd my-git
a05ed8cb 630 rsync -rL rsync://rsync.kernel.org/pub/scm/git/git.git/ .git
f35ca9ed
LT
631
632followed by
633
634 git-read-tree HEAD
635
636to populate the index. However, now you have populated the index, and
637you have all the git internal files, but you will notice that you don't
2a29da7c 638actually have any of the working tree files to work on. To get
f35ca9ed
LT
639those, you'd check them out with
640
215a7ad1 641 git-checkout-index -u -a
f35ca9ed 642
914328ac 643where the `-u` flag means that you want the checkout to keep the index
cc29f732 644up-to-date (so that you don't have to refresh it afterward), and the
914328ac
JH
645`-a` flag means "check out all files" (if you have a stale copy or an
646older version of a checked out tree you may also need to add the `-f`
215a7ad1 647flag first, to tell git-checkout-index to *force* overwriting of any old
f35ca9ed
LT
648files).
649
ed616049
LT
650Again, this can all be simplified with
651
e7c1ca42 652 git clone rsync://rsync.kernel.org/pub/scm/git/git.git/ my-git
ed616049
LT
653 cd my-git
654 git checkout
655
656which will end up doing all of the above for you.
657
cc29f732 658You have now successfully copied somebody else's (mine) remote
f35ca9ed
LT
659repository, and checked it out.
660
ed616049 661
2a29da7c
JH
662Creating a new branch
663---------------------
ed616049
LT
664
665Branches in git are really nothing more than pointers into the git
914328ac
JH
666object database from within the `.git/refs/` subdirectory, and as we
667already discussed, the `HEAD` branch is nothing but a symlink to one of
ed616049
LT
668these object pointers.
669
670You can at any time create a new branch by just picking an arbitrary
671point in the project history, and just writing the SHA1 name of that
914328ac 672object into a file under `.git/refs/heads/`. You can use any filename you
ed616049 673want (and indeed, subdirectories), but the convention is that the
914328ac 674"normal" branch is called `master`. That's just a convention, though,
ed616049
LT
675and nothing enforces it.
676
2a29da7c 677To show that as an example, let's go back to the git-tutorial repository we
a7333f9e
LT
678used earlier, and create a branch in it. You do that by simply just
679saying that you want to check out a new branch:
ed616049 680
8db9307c
JH
681------------
682git checkout -b mybranch
683------------
ed616049 684
914328ac 685will create a new branch based at the current `HEAD` position, and switch
a7333f9e 686to it.
ed616049 687
8db9307c
JH
688[NOTE]
689================================================
690If you make the decision to start your new branch at some
914328ac
JH
691other point in the history than the current `HEAD`, you can do so by
692just telling `git checkout` what the base of the checkout would be.
8db9307c 693In other words, if you have an earlier tag or branch, you'd just do
ed616049 694
494245d6 695 git checkout -b mybranch earlier-commit
ed616049 696
914328ac 697and it would create the new branch `mybranch` at the earlier commit,
8db9307c
JH
698and check out the state at that time.
699================================================
ed616049 700
914328ac 701You can always just jump back to your original `master` branch by doing
ed616049 702
494245d6 703 git checkout master
ed616049 704
a7333f9e
LT
705(or any other branch-name, for that matter) and if you forget which
706branch you happen to be on, a simple
ed616049 707
494245d6 708 ls -l .git/HEAD
ed616049 709
494245d6
JH
710will tell you where it's pointing. To get the list of branches
711you have, you can say
ed616049 712
494245d6 713 git branch
2a29da7c 714
8db9307c 715which is nothing more than a simple script around `ls .git/refs/heads`.
928f74de 716There will be asterisk in front of the branch you are currently on.
2a29da7c
JH
717
718Sometimes you may wish to create a new branch _without_ actually
a7333f9e
LT
719checking it out and switching to it. If so, just use the command
720
494245d6 721 git branch <branchname> [startingpoint]
a7333f9e
LT
722
723which will simply _create_ the branch, but will not do anything further.
914328ac
JH
724You can then later -- once you decide that you want to actually develop
725on that branch -- switch to that branch with a regular `git checkout`
a7333f9e
LT
726with the branchname as the argument.
727
ed616049 728
2a29da7c
JH
729Merging two branches
730--------------------
ed616049
LT
731
732One of the ideas of having a branch is that you do some (possibly
733experimental) work in it, and eventually merge it back to the main
914328ac
JH
734branch. So assuming you created the above `mybranch` that started out
735being the same as the original `master` branch, let's make sure we're in
ed616049
LT
736that branch, and do some work there.
737
914328ac 738------------------------------------------------
8db9307c
JH
739git checkout mybranch
740echo "Work, work, work" >>hello
741git commit -m 'Some work.' hello
914328ac 742------------------------------------------------
ed616049 743
914328ac 744Here, we just added another line to `hello`, and we used a shorthand for
96768e31 745doing both `git-update-index hello` and `git commit` by just giving the
914328ac 746filename directly to `git commit`. The `-m` flag is to give the
2a29da7c 747commit log message from the command line.
ed616049
LT
748
749Now, to make it a bit more interesting, let's assume that somebody else
750does some work in the original branch, and simulate that by going back
751to the master branch, and editing the same file differently there:
752
8db9307c
JH
753------------
754git checkout master
755------------
ed616049 756
914328ac
JH
757Here, take a moment to look at the contents of `hello`, and notice how they
758don't contain the work we just did in `mybranch` -- because that work
759hasn't happened in the `master` branch at all. Then do
ed616049 760
8db9307c
JH
761------------
762echo "Play, play, play" >>hello
763echo "Lots of fun" >>example
764git commit -m 'Some fun.' hello example
765------------
ed616049
LT
766
767since the master branch is obviously in a much better mood.
768
769Now, you've got two branches, and you decide that you want to merge the
770work done. Before we do that, let's introduce a cool graphical tool that
771helps you view what's going on:
772
773 gitk --all
774
914328ac
JH
775will show you graphically both of your branches (that's what the `\--all`
776means: normally it will just show you your current `HEAD`) and their
2a29da7c 777histories. You can also see exactly how they came to be from a common
ed616049
LT
778source.
779
914328ac
JH
780Anyway, let's exit `gitk` (`^Q` or the File menu), and decide that we want
781to merge the work we did on the `mybranch` branch into the `master`
782branch (which is currently our `HEAD` too). To do that, there's a nice
783script called `git resolve`, which wants to know which branches you want
ed616049
LT
784to resolve and what the merge is all about:
785
8db9307c
JH
786------------
787git resolve HEAD mybranch "Merge work in mybranch"
788------------
ed616049
LT
789
790where the third argument is going to be used as the commit message if
791the merge can be resolved automatically.
792
793Now, in this case we've intentionally created a situation where the
794merge will need to be fixed up by hand, though, so git will do as much
914328ac
JH
795of it as it can automatically (which in this case is just merge the `example`
796file, which had no differences in the `mybranch` branch), and say:
ed616049
LT
797
798 Simple merge failed, trying Automatic merge
a05ed8cb 799 Auto-merging hello.
ed616049 800 merge: warning: conflicts during merge
a05ed8cb 801 ERROR: Merge conflict in hello.
ed616049
LT
802 fatal: merge program failed
803 Automatic merge failed, fix up by hand
804
805which is way too verbose, but it basically tells you that it failed the
806really trivial merge ("Simple merge") and did an "Automatic merge"
914328ac 807instead, but that too failed due to conflicts in `hello`.
ed616049 808
914328ac 809Not to worry. It left the (trivial) conflict in `hello` in the same form you
ed616049 810should already be well used to if you've ever used CVS, so let's just
914328ac
JH
811open `hello` in our editor (whatever that may be), and fix it up somehow.
812I'd suggest just making it so that `hello` contains all four lines:
ed616049 813
8db9307c
JH
814------------
815Hello World
816It's a new day for git
817Play, play, play
818Work, work, work
819------------
ed616049
LT
820
821and once you're happy with your manual merge, just do a
822
8db9307c
JH
823------------
824git commit hello
825------------
ed616049
LT
826
827which will very loudly warn you that you're now committing a merge
828(which is correct, so never mind), and you can write a small merge
914328ac 829message about your adventures in git-merge-land.
ed616049 830
e1ccf53a 831After you're done, start up `gitk \--all` to see graphically what the
914328ac 832history looks like. Notice that `mybranch` still exists, and you can
2a29da7c 833switch to it, and continue to work with it if you want to. The
914328ac
JH
834`mybranch` branch will not contain the merge, but next time you merge it
835from the `master` branch, git will know how you merged it, so you'll not
ed616049
LT
836have to do _that_ merge again.
837
8db9307c 838Another useful tool, especially if you do not always work in X-Window
914328ac 839environment, is `git show-branch`.
2a29da7c
JH
840
841------------------------------------------------
842$ git show-branch master mybranch
843* [master] Merged "mybranch" changes.
844 ! [mybranch] Some work.
845--
846+ [master] Merged "mybranch" changes.
494245d6 847+ [master~1] Some fun.
2a29da7c
JH
848++ [mybranch] Some work.
849------------------------------------------------
850
851The first two lines indicate that it is showing the two branches
852and the first line of the commit log message from their
914328ac
JH
853top-of-the-tree commits, you are currently on `master` branch
854(notice the asterisk `*` character), and the first column for
2a29da7c 855the later output lines is used to show commits contained in the
914328ac 856`master` branch, and the second column for the `mybranch`
2a29da7c 857branch. Three commits are shown along with their log messages.
914328ac
JH
858All of them have plus `+` characters in the first column, which
859means they are now part of the `master` branch. Only the "Some
860work" commit has the plus `+` character in the second column,
861because `mybranch` has not been merged to incorporate these
6f60300b
JH
862commits from the master branch. The string inside brackets
863before the commit log message is a short name you can use to
864name the commit. In the above example, 'master' and 'mybranch'
865are branch heads. 'master~1' is the first parent of 'master'
866branch head. Please see 'git-rev-parse' documentation if you
867see more complex cases.
2a29da7c
JH
868
869Now, let's pretend you are the one who did all the work in
914328ac
JH
870`mybranch`, and the fruit of your hard work has finally been merged
871to the `master` branch. Let's go back to `mybranch`, and run
2a29da7c
JH
872resolve to get the "upstream changes" back to your branch.
873
494245d6
JH
874 git checkout mybranch
875 git resolve HEAD master "Merge upstream changes."
2a29da7c
JH
876
877This outputs something like this (the actual commit object names
878would be different)
879
880 Updating from ae3a2da... to a80b4aa....
881 example | 1 +
882 hello | 1 +
883 2 files changed, 2 insertions(+), 0 deletions(-)
884
885Because your branch did not contain anything more than what are
914328ac 886already merged into the `master` branch, the resolve operation did
2a29da7c 887not actually do a merge. Instead, it just updated the top of
914328ac
JH
888the tree of your branch to that of the `master` branch. This is
889often called 'fast forward' merge.
ed616049 890
e1ccf53a 891You can run `gitk \--all` again to see how the commit ancestry
914328ac 892looks like, or run `show-branch`, which tells you this.
2a29da7c
JH
893
894------------------------------------------------
895$ git show-branch master mybranch
896! [master] Merged "mybranch" changes.
897 * [mybranch] Merged "mybranch" changes.
898--
899++ [master] Merged "mybranch" changes.
900------------------------------------------------
901
902
903Merging external work
904---------------------
ed616049
LT
905
906It's usually much more common that you merge with somebody else than
907merging with your own branches, so it's worth pointing out that git
908makes that very easy too, and in fact, it's not that different from
914328ac 909doing a `git resolve`. In fact, a remote merge ends up being nothing
ed616049 910more than "fetch the work from a remote repository into a temporary tag"
914328ac 911followed by a `git resolve`.
ed616049 912
914328ac
JH
913Fetching from a remote repository is done by, unsurprisingly,
914`git fetch`:
ed616049 915
914328ac 916 git fetch <remote-repository>
ed616049 917
914328ac
JH
918One of the following transports can be used to name the
919repository to download from:
ed616049 920
914328ac
JH
921Rsync::
922 `rsync://remote.machine/path/to/repo.git/`
923+
924Rsync transport is usable for both uploading and downloading,
925but is completely unaware of what git does, and can produce
926unexpected results when you download from the public repository
927while the repository owner is uploading into it via `rsync`
928transport. Most notably, it could update the files under
929`refs/` which holds the object name of the topmost commits
930before uploading the files in `objects/` -- the downloader would
931obtain head commit object name while that object itself is still
932not available in the repository. For this reason, it is
933considered deprecated.
934
935SSH::
936 `remote.machine:/path/to/repo.git/` or
937+
938`ssh://remote.machine/path/to/repo.git/`
939+
940This transport can be used for both uploading and downloading,
941and requires you to have a log-in privilege over `ssh` to the
942remote machine. It finds out the set of objects the other side
943lacks by exchanging the head commits both ends have and
944transfers (close to) minimum set of objects. It is by far the
945most efficient way to exchange git objects between repositories.
946
947Local directory::
948 `/path/to/repo.git/`
949+
950This transport is the same as SSH transport but uses `sh` to run
951both ends on the local machine instead of running other end on
952the remote machine via `ssh`.
ed616049 953
914328ac
JH
954GIT Native::
955 `git://remote.machine/path/to/repo.git/`
956+
957This transport was designed for anonymous downloading. Like SSH
958transport, it finds out the set of objects the downstream side
959lacks and transfers (close to) minimum set of objects.
ed616049 960
914328ac
JH
961HTTP(s)::
962 `http://remote.machine/path/to/repo.git/`
963+
964HTTP and HTTPS transport are used only for downloading. They
965first obtain the topmost commit object name from the remote site
966by looking at `repo.git/info/refs` file, tries to obtain the
967commit object by downloading from `repo.git/objects/xx/xxx\...`
968using the object name of that commit object. Then it reads the
969commit object to find out its parent commits and the associate
970tree object; it repeats this process until it gets all the
971necessary objects. Because of this behaviour, they are
972sometimes also called 'commit walkers'.
973+
974The 'commit walkers' are sometimes also called 'dumb
975transports', because they do not require any GIT aware smart
976server like GIT Native transport does. Any stock HTTP server
977would suffice.
978+
215a7ad1 979There are (confusingly enough) `git-ssh-fetch` and `git-ssh-upload`
914328ac
JH
980programs, which are 'commit walkers'; they outlived their
981usefulness when GIT Native and SSH transports were introduced,
982and not used by `git pull` or `git push` scripts.
ed616049 983
914328ac
JH
984Once you fetch from the remote repository, you `resolve` that
985with your current branch.
ade75a59 986
914328ac
JH
987However -- it's such a common thing to `fetch` and then
988immediately `resolve`, that it's called `git pull`, and you can
989simply do
ed616049 990
914328ac
JH
991 git pull <remote-repository>
992
993and optionally give a branch-name for the remote end as a second
994argument.
ed616049 995
8db9307c
JH
996[NOTE]
997You could do without using any branches at all, by
998keeping as many local repositories as you would like to have
914328ac 999branches, and merging between them with `git pull`, just like
8db9307c 1000you merge between branches. The advantage of this approach is
914328ac 1001that it lets you keep set of files for each `branch` checked
8db9307c
JH
1002out and you may find it easier to switch back and forth if you
1003juggle multiple lines of development simultaneously. Of
1004course, you will pay the price of more disk usage to hold
1005multiple working trees, but disk space is cheap these days.
1006
1007[NOTE]
1008You could even pull from your own repository by
914328ac 1009giving '.' as <remote-repository> parameter to `git pull`.
ed616049 1010
0c04094b 1011It is likely that you will be pulling from the same remote
2a29da7c 1012repository from time to time. As a short hand, you can store
c9517341 1013the remote repository URL in a file under .git/remotes/
0c04094b
JH
1014directory, like this:
1015
c9517341
JH
1016------------------------------------------------
1017mkdir -p .git/remotes/
1018cat >.git/remotes/linus <<\EOF
1019URL: http://www.kernel.org/pub/scm/git/git.git/
1020EOF
1021------------------------------------------------
0c04094b 1022
914328ac 1023and use the filename to `git pull` instead of the full URL.
c9517341 1024The URL specified in such file can even be a prefix
0c04094b
JH
1025of a full URL, like this:
1026
c9517341
JH
1027------------------------------------------------
1028cat >.git/remotes/jgarzik <<\EOF
1029URL: http://www.kernel.org/pub/scm/linux/git/jgarzik/
1030EOF
1031------------------------------------------------
1032
0c04094b
JH
1033
1034Examples.
1035
914328ac
JH
1036. `git pull linus`
1037. `git pull linus tag v0.99.1`
1038. `git pull jgarzik/netdev-2.6.git/ e100`
0c04094b
JH
1039
1040the above are equivalent to:
1041
914328ac
JH
1042. `git pull http://www.kernel.org/pub/scm/git/git.git/ HEAD`
1043. `git pull http://www.kernel.org/pub/scm/git/git.git/ tag v0.99.1`
1044. `git pull http://www.kernel.org/pub/.../jgarzik/netdev-2.6.git e100`
0c04094b 1045
e7c1ca42 1046
2a29da7c
JH
1047Publishing your work
1048--------------------
e7c1ca42 1049
3eb5128a 1050So we can use somebody else's work from a remote repository; but
914328ac 1051how can *you* prepare a repository to let other people pull from
3eb5128a 1052it?
e7c1ca42 1053
2a29da7c 1054Your do your real work in your working tree that has your
914328ac
JH
1055primary repository hanging under it as its `.git` subdirectory.
1056You *could* make that repository accessible remotely and ask
3eb5128a 1057people to pull from it, but in practice that is not the way
2a29da7c 1058things are usually done. A recommended way is to have a public
3eb5128a 1059repository, make it reachable by other people, and when the
2a29da7c
JH
1060changes you made in your primary working tree are in good shape,
1061update the public repository from it. This is often called
914328ac 1062'pushing'.
e7c1ca42 1063
8db9307c 1064[NOTE]
914328ac
JH
1065This public repository could further be mirrored, and that is
1066how git repositories at `kernel.org` are managed.
e7c1ca42 1067
3eb5128a
JH
1068Publishing the changes from your local (private) repository to
1069your remote (public) repository requires a write privilege on
2a29da7c 1070the remote machine. You need to have an SSH account there to
914328ac 1071run a single command, `git-receive-pack`.
e7c1ca42 1072
3eb5128a 1073First, you need to create an empty repository on the remote
2a29da7c 1074machine that will house your public repository. This empty
3eb5128a 1075repository will be populated and be kept up-to-date by pushing
2a29da7c 1076into it later. Obviously, this repository creation needs to be
e7c1ca42
JH
1077done only once.
1078
8db9307c 1079[NOTE]
914328ac
JH
1080`git push` uses a pair of programs,
1081`git-send-pack` on your local machine, and `git-receive-pack`
8db9307c
JH
1082on the remote machine. The communication between the two over
1083the network internally uses an SSH connection.
3eb5128a 1084
914328ac 1085Your private repository's GIT directory is usually `.git`, but
3eb5128a 1086your public repository is often named after the project name,
914328ac
JH
1087i.e. `<project>.git`. Let's create such a public repository for
1088project `my-git`. After logging into the remote machine, create
3eb5128a 1089an empty directory:
e7c1ca42 1090
494245d6 1091 mkdir my-git.git
e7c1ca42 1092
3eb5128a 1093Then, make that directory into a GIT repository by running
914328ac
JH
1094`git init-db`, but this time, since its name is not the usual
1095`.git`, we do things slightly differently:
e7c1ca42 1096
494245d6 1097 GIT_DIR=my-git.git git-init-db
e7c1ca42
JH
1098
1099Make sure this directory is available for others you want your
2a29da7c 1100changes to be pulled by via the transport of your choice. Also
914328ac
JH
1101you need to make sure that you have the `git-receive-pack`
1102program on the `$PATH`.
3eb5128a 1103
8db9307c 1104[NOTE]
914328ac
JH
1105Many installations of sshd do not invoke your shell as the login
1106shell when you directly run programs; what this means is that if
1107your login shell is `bash`, only `.bashrc` is read and not
1108`.bash_profile`. As a workaround, make sure `.bashrc` sets up
1109`$PATH` so that you can run `git-receive-pack` program.
3eb5128a 1110
953e5842
JH
1111[NOTE]
1112If you plan to publish this repository to be accessed over http,
1113you should do `chmod +x my-git.git/hooks/post-update` at this
1114point. This makes sure that every time you push into this
1115repository, `git-update-server-info` is run.
1116
3eb5128a 1117Your "public repository" is now ready to accept your changes.
2a29da7c 1118Come back to the machine you have your private repository. From
e7c1ca42
JH
1119there, run this command:
1120
494245d6 1121 git push <public-host>:/path/to/my-git.git master
e7c1ca42
JH
1122
1123This synchronizes your public repository to match the named
914328ac 1124branch head (i.e. `master` in this case) and objects reachable
3eb5128a 1125from them in your current repository.
e7c1ca42
JH
1126
1127As a real example, this is how I update my public git
2a29da7c 1128repository. Kernel.org mirror network takes care of the
3eb5128a 1129propagation to other publicly visible machines:
e7c1ca42 1130
494245d6 1131 git push master.kernel.org:/pub/scm/git/git.git/
e7c1ca42
JH
1132
1133
2a29da7c
JH
1134Packing your repository
1135-----------------------
3eb5128a 1136
914328ac 1137Earlier, we saw that one file under `.git/objects/??/` directory
2a29da7c 1138is stored for each git object you create. This representation
914328ac 1139is efficient to create atomically and safely, but
2a29da7c 1140not so convenient to transport over the network. Since git objects are
3eb5128a 1141immutable once they are created, there is a way to optimize the
2a29da7c 1142storage by "packing them together". The command
3eb5128a 1143
494245d6 1144 git repack
3eb5128a 1145
2a29da7c 1146will do it for you. If you followed the tutorial examples, you
914328ac
JH
1147would have accumulated about 17 objects in `.git/objects/??/`
1148directories by now. `git repack` tells you how many objects it
1149packed, and stores the packed file in `.git/objects/pack`
3eb5128a
JH
1150directory.
1151
8db9307c 1152[NOTE]
914328ac
JH
1153You will see two files, `pack-\*.pack` and `pack-\*.idx`,
1154in `.git/objects/pack` directory. They are closely related to
8db9307c
JH
1155each other, and if you ever copy them by hand to a different
1156repository for whatever reason, you should make sure you copy
1157them together. The former holds all the data from the objects
1158in the pack, and the latter holds the index for random
1159access.
3eb5128a 1160
914328ac 1161If you are paranoid, running `git-verify-pack` command would
3eb5128a
JH
1162detect if you have a corrupt pack, but do not worry too much.
1163Our programs are always perfect ;-).
1164
1165Once you have packed objects, you do not need to leave the
1166unpacked objects that are contained in the pack file anymore.
1167
494245d6 1168 git prune-packed
3eb5128a
JH
1169
1170would remove them for you.
1171
914328ac
JH
1172You can try running `find .git/objects -type f` before and after
1173you run `git prune-packed` if you are curious. Also `git
1174count-objects` would tell you how many unpacked objects are in
1175your repository and how much space they are consuming.
3eb5128a 1176
8db9307c 1177[NOTE]
914328ac
JH
1178`git pull` is slightly cumbersome for HTTP transport, as a
1179packed repository may contain relatively few objects in a
8db9307c
JH
1180relatively large pack. If you expect many HTTP pulls from your
1181public repository you might want to repack & prune often, or
1182never.
3eb5128a 1183
914328ac 1184If you run `git repack` again at this point, it will say
2a29da7c 1185"Nothing to pack". Once you continue your development and
914328ac 1186accumulate the changes, running `git repack` again will create a
3eb5128a 1187new pack, that contains objects created since you packed your
2a29da7c 1188repository the last time. We recommend that you pack your project
3eb5128a 1189soon after the initial import (unless you are starting your
914328ac 1190project from scratch), and then run `git repack` every once in a
3eb5128a
JH
1191while, depending on how active your project is.
1192
914328ac 1193When a repository is synchronized via `git push` and `git pull`
ade75a59 1194objects packed in the source repository are usually stored
3eb5128a 1195unpacked in the destination, unless rsync transport is used.
914328ac
JH
1196While this allows you to use different packing strategies on
1197both ends, it also means you may need to repack both
1198repositories every once in a while.
3eb5128a
JH
1199
1200
2a29da7c
JH
1201Working with Others
1202-------------------
3eb5128a 1203
a232a132
JH
1204Although git is a truly distributed system, it is often
1205convenient to organize your project with an informal hierarchy
2a29da7c 1206of developers. Linux kernel development is run this way. There
a232a132 1207is a nice illustration (page 17, "Merges to Mainline") in Randy
914328ac 1208Dunlap's presentation (`http://tinyurl.com/a2jdg`).
a232a132 1209
914328ac 1210It should be stressed that this hierarchy is purely *informal*.
a232a132 1211There is nothing fundamental in git that enforces the "chain of
2a29da7c 1212patch flow" this hierarchy implies. You do not have to pull
a232a132
JH
1213from only one remote repository.
1214
a232a132 1215A recommended workflow for a "project lead" goes like this:
3eb5128a 1216
8db9307c
JH
12171. Prepare your primary repository on your local machine. Your
1218 work is done there.
3eb5128a 1219
8db9307c 12202. Prepare a public repository accessible to others.
914328ac
JH
1221+
1222If other people are pulling from your repository over dumb
1223transport protocols, you need to keep this repository 'dumb
1224transport friendly'. After `git init-db`,
1225`$GIT_DIR/hooks/post-update` copied from the standard templates
1226would contain a call to `git-update-server-info` but the
1227`post-update` hook itself is disabled by default -- enable it
1228with `chmod +x post-update`.
3eb5128a 1229
8db9307c
JH
12303. Push into the public repository from your primary
1231 repository.
3eb5128a 1232
914328ac 12334. `git repack` the public repository. This establishes a big
8db9307c 1234 pack that contains the initial set of objects as the
914328ac 1235 baseline, and possibly `git prune` if the transport
8db9307c
JH
1236 used for pulling from your repository supports packed
1237 repositories.
3eb5128a 1238
8db9307c
JH
12395. Keep working in your primary repository. Your changes
1240 include modifications of your own, patches you receive via
1241 e-mails, and merges resulting from pulling the "public"
1242 repositories of your "subsystem maintainers".
1243+
1244You can repack this private repository whenever you feel like.
3eb5128a 1245
8db9307c
JH
12466. Push your changes to the public repository, and announce it
1247 to the public.
3eb5128a 1248
8db9307c
JH
12497. Every once in a while, "git repack" the public repository.
1250 Go back to step 5. and continue working.
3eb5128a 1251
a232a132 1252
ade75a59
JS
1253A recommended work cycle for a "subsystem maintainer" who works
1254on that project and has an own "public repository" goes like this:
3eb5128a 1255
914328ac 12561. Prepare your work repository, by `git clone` the public
8db9307c 1257 repository of the "project lead". The URL used for the
914328ac 1258 initial cloning is stored in `.git/remotes/origin`.
3eb5128a 1259
914328ac
JH
12602. Prepare a public repository accessible to others, just like
1261 the "project lead" person does.
3eb5128a 1262
8db9307c 12633. Copy over the packed files from "project lead" public
914328ac 1264 repository to your public repository.
3eb5128a 1265
8db9307c 12664. Push into the public repository from your primary
914328ac
JH
1267 repository. Run `git repack`, and possibly `git prune` if the
1268 transport used for pulling from your repository supports
1269 packed repositories.
3eb5128a 1270
8db9307c
JH
12715. Keep working in your primary repository. Your changes
1272 include modifications of your own, patches you receive via
1273 e-mails, and merges resulting from pulling the "public"
1274 repositories of your "project lead" and possibly your
1275 "sub-subsystem maintainers".
1276+
1277You can repack this private repository whenever you feel
1278like.
3eb5128a 1279
8db9307c
JH
12806. Push your changes to your public repository, and ask your
1281 "project lead" and possibly your "sub-subsystem
1282 maintainers" to pull from it.
a232a132 1283
914328ac 12847. Every once in a while, `git repack` the public repository.
8db9307c 1285 Go back to step 5. and continue working.
3eb5128a 1286
a232a132 1287
3eb5128a 1288A recommended work cycle for an "individual developer" who does
2a29da7c 1289not have a "public" repository is somewhat different. It goes
3eb5128a
JH
1290like this:
1291
914328ac 12921. Prepare your work repository, by `git clone` the public
8db9307c
JH
1293 repository of the "project lead" (or a "subsystem
1294 maintainer", if you work on a subsystem). The URL used for
914328ac 1295 the initial cloning is stored in `.git/remotes/origin`.
3eb5128a 1296
914328ac 12972. Do your work in your repository on 'master' branch.
3eb5128a 1298
914328ac 12993. Run `git fetch origin` from the public repository of your
8db9307c 1300 upstream every once in a while. This does only the first
914328ac
JH
1301 half of `git pull` but does not merge. The head of the
1302 public repository is stored in `.git/refs/heads/origin`.
3eb5128a 1303
914328ac
JH
13044. Use `git cherry origin` to see which ones of your patches
1305 were accepted, and/or use `git rebase origin` to port your
8db9307c 1306 unmerged changes forward to the updated upstream.
3eb5128a 1307
914328ac 13085. Use `git format-patch origin` to prepare patches for e-mail
8db9307c 1309 submission to your upstream and send it out. Go back to
914328ac 1310 step 2. and continue.
3eb5128a
JH
1311
1312
2a29da7c
JH
1313Working with Others, Shared Repository Style
1314--------------------------------------------
1315
1316If you are coming from CVS background, the style of cooperation
1317suggested in the previous section may be new to you. You do not
1318have to worry. git supports "shared public repository" style of
c9517341
JH
1319cooperation you are probably more familiar with as well.
1320
1321For this, set up a public repository on a machine that is
1322reachable via SSH by people with "commit privileges". Put the
1323committers in the same user group and make the repository
1324writable by that group.
1325
914328ac 1326You, as an individual committer, then:
c9517341 1327
914328ac 1328- First clone the shared repository to a local repository:
c9517341
JH
1329------------------------------------------------
1330$ git clone repo.shared.xz:/pub/scm/project.git/ my-project
1331$ cd my-project
1332$ hack away
1333------------------------------------------------
1334
914328ac
JH
1335- Merge the work others might have done while you were hacking
1336 away:
c9517341
JH
1337------------------------------------------------
1338$ git pull origin
1339$ test the merge result
1340------------------------------------------------
914328ac
JH
1341[NOTE]
1342================================
1343The first `git clone` would have placed the following in
1344`my-project/.git/remotes/origin` file, and that's why this and
1345the next step work.
1346------------
1347URL: repo.shared.xz:/pub/scm/project.git/ my-project
1348Pull: master:origin
1349------------
1350================================
c9517341 1351
914328ac
JH
1352- push your work as the new head of the shared
1353 repository.
c9517341
JH
1354------------------------------------------------
1355$ git push origin master
1356------------------------------------------------
c9517341 1357If somebody else pushed into the same shared repository while
914328ac
JH
1358you were working locally, `git push` in the last step would
1359complain, telling you that the remote `master` head does not
c9517341
JH
1360fast forward. You need to pull and merge those other changes
1361back before you push your work when it happens.
2a29da7c
JH
1362
1363
6f60300b
JH
1364Bundling your work together
1365---------------------------
1366
1367It is likely that you will be working on more than one thing at
1368a time. It is easy to use those more-or-less independent tasks
1369using branches with git.
1370
1371We have already seen how branches work in a previous example,
1372with "fun and work" example using two branches. The idea is the
1373same if there are more than two branches. Let's say you started
1374out from "master" head, and have some new code in the "master"
1375branch, and two independent fixes in the "commit-fix" and
1376"diff-fix" branches:
1377
1378------------
1379$ git show-branch
1380! [commit-fix] Fix commit message normalization.
1381 ! [diff-fix] Fix rename detection.
1382 * [master] Release candidate #1
1383---
1384 + [diff-fix] Fix rename detection.
1385 + [diff-fix~1] Better common substring algorithm.
1386+ [commit-fix] Fix commit message normalization.
1387 + [master] Release candidate #1
1388+++ [diff-fix~2] Pretty-print messages.
1389------------
1390
1391Both fixes are tested well, and at this point, you want to merge
1392in both of them. You could merge in 'diff-fix' first and then
1393'commit-fix' next, like this:
1394
1395------------
1396$ git resolve master diff-fix 'Merge fix in diff-fix'
1397$ git resolve master commit-fix 'Merge fix in commit-fix'
1398------------
1399
1400Which would result in:
1401
1402------------
1403$ git show-branch
1404! [commit-fix] Fix commit message normalization.
1405 ! [diff-fix] Fix rename detection.
1406 * [master] Merge fix in commit-fix
1407---
1408 + [master] Merge fix in commit-fix
1409+ + [commit-fix] Fix commit message normalization.
1410 + [master~1] Merge fix in diff-fix
1411 ++ [diff-fix] Fix rename detection.
1412 ++ [diff-fix~1] Better common substring algorithm.
1413 + [master~2] Release candidate #1
1414+++ [master~3] Pretty-print messages.
1415------------
1416
1417However, there is no particular reason to merge in one branch
1418first and the other next, when what you have are a set of truly
1419independent changes (if the order mattered, then they are not
1420independent by definition). You could instead merge those two
1421branches into the current branch at once. First let's undo what
1422we just did and start over. We would want to get the master
1423branch before these two merges by resetting it to 'master~2':
1424
1425------------
1426$ git reset --hard master~2
1427------------
1428
1429You can make sure 'git show-branch' matches the state before
1430those two 'git resolve' you just did. Then, instead of running
1431two 'git resolve' commands in a row, you would pull these two
1432branch heads (this is known as 'making an Octopus'):
1433
1434------------
1435$ git pull . commit-fix diff-fix
1436$ git show-branch
1437! [commit-fix] Fix commit message normalization.
1438 ! [diff-fix] Fix rename detection.
1439 * [master] Octopus merge of branches 'diff-fix' and 'commit-fix'
1440---
1441 + [master] Octopus merge of branches 'diff-fix' and 'commit-fix'
1442+ + [commit-fix] Fix commit message normalization.
1443 ++ [diff-fix] Fix rename detection.
1444 ++ [diff-fix~1] Better common substring algorithm.
1445 + [master~1] Release candidate #1
1446+++ [master~2] Pretty-print messages.
1447------------
1448
1449Note that you should not do Octopus because you can. An octopus
1450is a valid thing to do and often makes it easier to view the
1451commit history if you are pulling more than two independent
1452changes at the same time. However, if you have merge conflicts
1453with any of the branches you are merging in and need to hand
1454resolve, that is an indication that the development happened in
1455those branches were not independent after all, and you should
1456merge two at a time, documenting how you resolved the conflicts,
1457and the reason why you preferred changes made in one side over
1458the other. Otherwise it would make the project history harder
1459to follow, not easier.
1460
3eb5128a 1461[ to be continued.. cvsimports ]