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