]> git.ipfire.org Git - thirdparty/git.git/blame - Documentation/tutorial.txt
Documentation: describe '-f' option to git-fetch.
[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 ...
0501c240
JH
901 Auto-merging hello
902 CONFLICT (content): Merge conflict in hello
44760f1d 903 Automatic merge failed/prevented; fix up by hand
f2416c27 904----------------
ed616049
LT
905
906which is way too verbose, but it basically tells you that it failed the
907really trivial merge ("Simple merge") and did an "Automatic merge"
914328ac 908instead, but that too failed due to conflicts in `hello`.
ed616049 909
914328ac 910Not to worry. It left the (trivial) conflict in `hello` in the same form you
ed616049 911should already be well used to if you've ever used CVS, so let's just
914328ac
JH
912open `hello` in our editor (whatever that may be), and fix it up somehow.
913I'd suggest just making it so that `hello` contains all four lines:
ed616049 914
8db9307c
JH
915------------
916Hello World
917It's a new day for git
918Play, play, play
919Work, work, work
920------------
ed616049
LT
921
922and once you're happy with your manual merge, just do a
923
8db9307c 924------------
f2416c27 925$ git commit hello
8db9307c 926------------
ed616049
LT
927
928which will very loudly warn you that you're now committing a merge
929(which is correct, so never mind), and you can write a small merge
914328ac 930message about your adventures in git-merge-land.
ed616049 931
e1ccf53a 932After you're done, start up `gitk \--all` to see graphically what the
914328ac 933history looks like. Notice that `mybranch` still exists, and you can
2a29da7c 934switch to it, and continue to work with it if you want to. The
914328ac
JH
935`mybranch` branch will not contain the merge, but next time you merge it
936from the `master` branch, git will know how you merged it, so you'll not
ed616049
LT
937have to do _that_ merge again.
938
8db9307c 939Another useful tool, especially if you do not always work in X-Window
914328ac 940environment, is `git show-branch`.
2a29da7c
JH
941
942------------------------------------------------
943$ git show-branch master mybranch
0501c240 944* [master] Merge work in mybranch
2a29da7c
JH
945 ! [mybranch] Some work.
946--
0501c240 947+ [master] Merge work in mybranch
2a29da7c
JH
948++ [mybranch] Some work.
949------------------------------------------------
950
951The first two lines indicate that it is showing the two branches
952and the first line of the commit log message from their
914328ac
JH
953top-of-the-tree commits, you are currently on `master` branch
954(notice the asterisk `*` character), and the first column for
2a29da7c 955the later output lines is used to show commits contained in the
914328ac 956`master` branch, and the second column for the `mybranch`
2a29da7c 957branch. Three commits are shown along with their log messages.
914328ac
JH
958All of them have plus `+` characters in the first column, which
959means they are now part of the `master` branch. Only the "Some
960work" commit has the plus `+` character in the second column,
961because `mybranch` has not been merged to incorporate these
6f60300b
JH
962commits from the master branch. The string inside brackets
963before the commit log message is a short name you can use to
964name the commit. In the above example, 'master' and 'mybranch'
965are branch heads. 'master~1' is the first parent of 'master'
966branch head. Please see 'git-rev-parse' documentation if you
967see more complex cases.
2a29da7c
JH
968
969Now, let's pretend you are the one who did all the work in
914328ac
JH
970`mybranch`, and the fruit of your hard work has finally been merged
971to the `master` branch. Let's go back to `mybranch`, and run
2a29da7c
JH
972resolve to get the "upstream changes" back to your branch.
973
2ae6c706 974------------
f2416c27
JL
975$ git checkout mybranch
976$ git merge "Merge upstream changes." HEAD master
2ae6c706 977------------
2a29da7c
JH
978
979This outputs something like this (the actual commit object names
980would be different)
981
f2416c27
JL
982----------------
983Updating from ae3a2da... to a80b4aa....
984 example | 1 +
985 hello | 1 +
986 2 files changed, 2 insertions(+), 0 deletions(-)
987----------------
2a29da7c
JH
988
989Because your branch did not contain anything more than what are
914328ac 990already merged into the `master` branch, the resolve operation did
2a29da7c 991not actually do a merge. Instead, it just updated the top of
914328ac
JH
992the tree of your branch to that of the `master` branch. This is
993often called 'fast forward' merge.
ed616049 994
e1ccf53a 995You can run `gitk \--all` again to see how the commit ancestry
914328ac 996looks like, or run `show-branch`, which tells you this.
2a29da7c
JH
997
998------------------------------------------------
999$ git show-branch master mybranch
0501c240
JH
1000! [master] Merge work in mybranch
1001 * [mybranch] Merge work in mybranch
2a29da7c 1002--
0501c240 1003++ [master] Merge work in mybranch
2a29da7c
JH
1004------------------------------------------------
1005
1006
1007Merging external work
1008---------------------
ed616049
LT
1009
1010It's usually much more common that you merge with somebody else than
1011merging with your own branches, so it's worth pointing out that git
1012makes that very easy too, and in fact, it's not that different from
067744bd 1013doing a `git merge`. In fact, a remote merge ends up being nothing
ed616049 1014more than "fetch the work from a remote repository into a temporary tag"
067744bd 1015followed by a `git merge`.
ed616049 1016
914328ac
JH
1017Fetching from a remote repository is done by, unsurprisingly,
1018`git fetch`:
ed616049 1019
f2416c27
JL
1020----------------
1021$ git fetch <remote-repository>
1022----------------
ed616049 1023
914328ac
JH
1024One of the following transports can be used to name the
1025repository to download from:
ed616049 1026
914328ac
JH
1027Rsync::
1028 `rsync://remote.machine/path/to/repo.git/`
1029+
1030Rsync transport is usable for both uploading and downloading,
1031but is completely unaware of what git does, and can produce
1032unexpected results when you download from the public repository
1033while the repository owner is uploading into it via `rsync`
1034transport. Most notably, it could update the files under
1035`refs/` which holds the object name of the topmost commits
1036before uploading the files in `objects/` -- the downloader would
1037obtain head commit object name while that object itself is still
1038not available in the repository. For this reason, it is
1039considered deprecated.
1040
1041SSH::
1042 `remote.machine:/path/to/repo.git/` or
1043+
1044`ssh://remote.machine/path/to/repo.git/`
1045+
1046This transport can be used for both uploading and downloading,
1047and requires you to have a log-in privilege over `ssh` to the
1048remote machine. It finds out the set of objects the other side
1049lacks by exchanging the head commits both ends have and
1050transfers (close to) minimum set of objects. It is by far the
1051most efficient way to exchange git objects between repositories.
1052
1053Local directory::
1054 `/path/to/repo.git/`
1055+
1056This transport is the same as SSH transport but uses `sh` to run
1057both ends on the local machine instead of running other end on
1058the remote machine via `ssh`.
ed616049 1059
72e9340c 1060git Native::
914328ac
JH
1061 `git://remote.machine/path/to/repo.git/`
1062+
1063This transport was designed for anonymous downloading. Like SSH
1064transport, it finds out the set of objects the downstream side
1065lacks and transfers (close to) minimum set of objects.
ed616049 1066
f2416c27 1067HTTP(S)::
914328ac
JH
1068 `http://remote.machine/path/to/repo.git/`
1069+
1070HTTP and HTTPS transport are used only for downloading. They
1071first obtain the topmost commit object name from the remote site
1072by looking at `repo.git/info/refs` file, tries to obtain the
1073commit object by downloading from `repo.git/objects/xx/xxx\...`
1074using the object name of that commit object. Then it reads the
1075commit object to find out its parent commits and the associate
1076tree object; it repeats this process until it gets all the
1077necessary objects. Because of this behaviour, they are
1078sometimes also called 'commit walkers'.
1079+
1080The 'commit walkers' are sometimes also called 'dumb
72e9340c
CM
1081transports', because they do not require any git aware smart
1082server like git Native transport does. Any stock HTTP server
914328ac
JH
1083would suffice.
1084+
215a7ad1 1085There are (confusingly enough) `git-ssh-fetch` and `git-ssh-upload`
914328ac 1086programs, which are 'commit walkers'; they outlived their
72e9340c 1087usefulness when git Native and SSH transports were introduced,
914328ac 1088and not used by `git pull` or `git push` scripts.
ed616049 1089
914328ac
JH
1090Once you fetch from the remote repository, you `resolve` that
1091with your current branch.
ade75a59 1092
914328ac
JH
1093However -- it's such a common thing to `fetch` and then
1094immediately `resolve`, that it's called `git pull`, and you can
1095simply do
ed616049 1096
f2416c27
JL
1097----------------
1098$ git pull <remote-repository>
1099----------------
914328ac
JH
1100
1101and optionally give a branch-name for the remote end as a second
1102argument.
ed616049 1103
8db9307c
JH
1104[NOTE]
1105You could do without using any branches at all, by
1106keeping as many local repositories as you would like to have
914328ac 1107branches, and merging between them with `git pull`, just like
8db9307c 1108you merge between branches. The advantage of this approach is
914328ac 1109that it lets you keep set of files for each `branch` checked
8db9307c
JH
1110out and you may find it easier to switch back and forth if you
1111juggle multiple lines of development simultaneously. Of
1112course, you will pay the price of more disk usage to hold
1113multiple working trees, but disk space is cheap these days.
1114
1115[NOTE]
1116You could even pull from your own repository by
710c97db
JH
1117giving '.' as <remote-repository> parameter to `git pull`. This
1118is useful when you want to merge a local branch (or more, if you
1119are making an Octopus) into the current branch.
ed616049 1120
0c04094b 1121It is likely that you will be pulling from the same remote
2a29da7c 1122repository from time to time. As a short hand, you can store
c9517341 1123the remote repository URL in a file under .git/remotes/
0c04094b
JH
1124directory, like this:
1125
c9517341 1126------------------------------------------------
f2416c27
JL
1127$ mkdir -p .git/remotes/
1128$ cat >.git/remotes/linus <<\EOF
c9517341
JH
1129URL: http://www.kernel.org/pub/scm/git/git.git/
1130EOF
1131------------------------------------------------
0c04094b 1132
914328ac 1133and use the filename to `git pull` instead of the full URL.
c9517341 1134The URL specified in such file can even be a prefix
0c04094b
JH
1135of a full URL, like this:
1136
c9517341 1137------------------------------------------------
f2416c27 1138$ cat >.git/remotes/jgarzik <<\EOF
c9517341
JH
1139URL: http://www.kernel.org/pub/scm/linux/git/jgarzik/
1140EOF
1141------------------------------------------------
1142
0c04094b
JH
1143
1144Examples.
1145
914328ac
JH
1146. `git pull linus`
1147. `git pull linus tag v0.99.1`
1148. `git pull jgarzik/netdev-2.6.git/ e100`
0c04094b
JH
1149
1150the above are equivalent to:
1151
914328ac
JH
1152. `git pull http://www.kernel.org/pub/scm/git/git.git/ HEAD`
1153. `git pull http://www.kernel.org/pub/scm/git/git.git/ tag v0.99.1`
1154. `git pull http://www.kernel.org/pub/.../jgarzik/netdev-2.6.git e100`
0c04094b 1155
e7c1ca42 1156
44760f1d
JH
1157How does the merge work?
1158------------------------
1159
1160We said this tutorial shows what plumbing does to help you cope
1161with the porcelain that isn't flushing, but we so far did not
1162talk about how the merge really works. If you are following
1163this tutorial the first time, I'd suggest to skip to "Publishing
1164your work" section and come back here later.
1165
1166OK, still with me? To give us an example to look at, let's go
1167back to the earlier repository with "hello" and "example" file,
1168and bring ourselves back to the pre-merge state:
1169
1170------------
1171$ git show-branch --more=3 master mybranch
1172! [master] Merge work in mybranch
1173 * [mybranch] Merge work in mybranch
1174--
1175++ [master] Merge work in mybranch
1176++ [master^2] Some work.
1177++ [master^] Some fun.
1178------------
1179
1180Remember, before running `git merge`, our `master` head was at
1181"Some fun." commit, while our `mybranch` head was at "Some
1182work." commit.
1183
1184------------
1185$ git checkout mybranch
1186$ git reset --hard master^2
1187$ git checkout master
1188$ git reset --hard master^
1189------------
1190
1191After rewinding, the commit structure should look like this:
1192
1193------------
1194$ git show-branch
1195* [master] Some fun.
1196 ! [mybranch] Some work.
1197--
1198 + [mybranch] Some work.
1199+ [master] Some fun.
1200++ [mybranch^] New day.
1201------------
1202
1203Now we are ready to experiment with the merge by hand.
1204
1205`git merge` command, when merging two branches, uses 3-way merge
1206algorithm. First, it finds the common ancestor between them.
1207The command it uses is `git-merge-base`:
1208
1209------------
1210$ mb=$(git-merge-base HEAD mybranch)
1211------------
1212
1213The command writes the commit object name of the common ancestor
1214to the standard output, so we captured its output to a variable,
1215because we will be using it in the next step. BTW, the common
1216ancestor commit is the "New day." commit in this case. You can
1217tell it by:
1218
1219------------
1220$ git-name-rev $mb
1221my-first-tag
1222------------
1223
1224After finding out a common ancestor commit, the second step is
1225this:
1226
1227------------
1228$ git-read-tree -m -u $mb HEAD mybranch
1229------------
1230
1231This is the same `git-read-tree` command we have already seen,
1232but it takes three trees, unlike previous examples. This reads
1233the contents of each tree into different 'stage' in the index
1234file (the first tree goes to stage 1, the second stage 2,
1235etc.). After reading three trees into three stages, the paths
1236that are the same in all three stages are 'collapsed' into stage
12370. Also paths that are the same in two of three stages are
1238collapsed into stage 0, taking the SHA1 from either stage 2 or
1239stage 3, whichever is different from stage 1 (i.e. only one side
1240changed from the common ancestor).
1241
1242After 'collapsing' operation, paths that are different in three
1243trees are left in non-zero stages. At this point, you can
1244inspect the index file with this command:
1245
1246------------
1247$ git-ls-files --stage
1248100644 7f8b141b65fdcee47321e399a2598a235a032422 0 example
1249100644 263414f423d0e4d70dae8fe53fa34614ff3e2860 1 hello
1250100644 06fa6a24256dc7e560efa5687fa84b51f0263c3a 2 hello
1251100644 cc44c73eb783565da5831b4d820c962954019b69 3 hello
1252------------
1253
1254In our example of only two files, we did not have unchanged
1255files so only 'example' resulted in collapsing, but in real-life
1256large projects, only small number of files change in one commit,
1257and this 'collapsing' tends to trivially merge most of the paths
067744bd
JH
1258fairly quickly, leaving only a handful the real changes in non-zero
1259stages.
44760f1d
JH
1260
1261To look at only non-zero stages, use `\--unmerged` flag:
1262
1263------------
1264$ git-ls-files --unmerged
1265100644 263414f423d0e4d70dae8fe53fa34614ff3e2860 1 hello
1266100644 06fa6a24256dc7e560efa5687fa84b51f0263c3a 2 hello
1267100644 cc44c73eb783565da5831b4d820c962954019b69 3 hello
1268------------
1269
1270The next step of merging is to merge these three versions of the
1271file, using 3-way merge. This is done by giving
1272`git-merge-one-file` command as one of the arguments to
1273`git-merge-index` command:
1274
1275------------
1276$ git-merge-index git-merge-one-file hello
1277Auto-merging hello.
1278merge: warning: conflicts during merge
1279ERROR: Merge conflict in hello.
1280fatal: merge program failed
1281------------
1282
1283`git-merge-one-file` script is called with parameters to
1284describe those three versions, and is responsible to leave the
1285merge results in the working tree and register it in the index
1286file. It is a fairly straightforward shell script, and
1287eventually calls `merge` program from RCS suite to perform the
1288file-level 3-way merge. In this case, `merge` detects
1289conflicts, and the merge result with conflict marks is left in
1290the working tree, while the index file is updated with the
1291version from the current branch (this is to make `git diff`
1292useful after this step). This can be seen if you run `ls-files
1293--stage` again at this point:
1294
1295------------
1296$ git-ls-files --stage
1297100644 7f8b141b65fdcee47321e399a2598a235a032422 0 example
1298100644 06fa6a24256dc7e560efa5687fa84b51f0263c3a 0 hello
1299------------
1300
1301As you can see, there is no unmerged paths in the index file.
1302This is the state of the index file and the working file after
1303`git merge` returns control back to you, leaving the conflicting
1304merge for you to resolve.
1305
1306
2a29da7c
JH
1307Publishing your work
1308--------------------
e7c1ca42 1309
3eb5128a 1310So we can use somebody else's work from a remote repository; but
914328ac 1311how can *you* prepare a repository to let other people pull from
3eb5128a 1312it?
e7c1ca42 1313
2a29da7c 1314Your do your real work in your working tree that has your
914328ac
JH
1315primary repository hanging under it as its `.git` subdirectory.
1316You *could* make that repository accessible remotely and ask
3eb5128a 1317people to pull from it, but in practice that is not the way
2a29da7c 1318things are usually done. A recommended way is to have a public
3eb5128a 1319repository, make it reachable by other people, and when the
2a29da7c
JH
1320changes you made in your primary working tree are in good shape,
1321update the public repository from it. This is often called
914328ac 1322'pushing'.
e7c1ca42 1323
8db9307c 1324[NOTE]
914328ac
JH
1325This public repository could further be mirrored, and that is
1326how git repositories at `kernel.org` are managed.
e7c1ca42 1327
3eb5128a
JH
1328Publishing the changes from your local (private) repository to
1329your remote (public) repository requires a write privilege on
2a29da7c 1330the remote machine. You need to have an SSH account there to
914328ac 1331run a single command, `git-receive-pack`.
e7c1ca42 1332
3eb5128a 1333First, you need to create an empty repository on the remote
2a29da7c 1334machine that will house your public repository. This empty
3eb5128a 1335repository will be populated and be kept up-to-date by pushing
2a29da7c 1336into it later. Obviously, this repository creation needs to be
e7c1ca42
JH
1337done only once.
1338
8db9307c 1339[NOTE]
914328ac
JH
1340`git push` uses a pair of programs,
1341`git-send-pack` on your local machine, and `git-receive-pack`
8db9307c
JH
1342on the remote machine. The communication between the two over
1343the network internally uses an SSH connection.
3eb5128a 1344
72e9340c 1345Your private repository's git directory is usually `.git`, but
3eb5128a 1346your public repository is often named after the project name,
914328ac
JH
1347i.e. `<project>.git`. Let's create such a public repository for
1348project `my-git`. After logging into the remote machine, create
3eb5128a 1349an empty directory:
e7c1ca42 1350
2ae6c706 1351------------
f2416c27 1352$ mkdir my-git.git
2ae6c706 1353------------
e7c1ca42 1354
72e9340c 1355Then, make that directory into a git repository by running
914328ac
JH
1356`git init-db`, but this time, since its name is not the usual
1357`.git`, we do things slightly differently:
e7c1ca42 1358
2ae6c706 1359------------
f2416c27 1360$ GIT_DIR=my-git.git git-init-db
2ae6c706 1361------------
e7c1ca42
JH
1362
1363Make sure this directory is available for others you want your
2a29da7c 1364changes to be pulled by via the transport of your choice. Also
914328ac
JH
1365you need to make sure that you have the `git-receive-pack`
1366program on the `$PATH`.
3eb5128a 1367
8db9307c 1368[NOTE]
914328ac
JH
1369Many installations of sshd do not invoke your shell as the login
1370shell when you directly run programs; what this means is that if
1371your login shell is `bash`, only `.bashrc` is read and not
1372`.bash_profile`. As a workaround, make sure `.bashrc` sets up
1373`$PATH` so that you can run `git-receive-pack` program.
3eb5128a 1374
953e5842
JH
1375[NOTE]
1376If you plan to publish this repository to be accessed over http,
1377you should do `chmod +x my-git.git/hooks/post-update` at this
1378point. This makes sure that every time you push into this
1379repository, `git-update-server-info` is run.
1380
3eb5128a 1381Your "public repository" is now ready to accept your changes.
2a29da7c 1382Come back to the machine you have your private repository. From
e7c1ca42
JH
1383there, run this command:
1384
2ae6c706 1385------------
f2416c27 1386$ git push <public-host>:/path/to/my-git.git master
2ae6c706 1387------------
e7c1ca42
JH
1388
1389This synchronizes your public repository to match the named
914328ac 1390branch head (i.e. `master` in this case) and objects reachable
3eb5128a 1391from them in your current repository.
e7c1ca42
JH
1392
1393As a real example, this is how I update my public git
2a29da7c 1394repository. Kernel.org mirror network takes care of the
3eb5128a 1395propagation to other publicly visible machines:
e7c1ca42 1396
2ae6c706 1397------------
f2416c27 1398$ git push master.kernel.org:/pub/scm/git/git.git/
2ae6c706 1399------------
e7c1ca42
JH
1400
1401
2a29da7c
JH
1402Packing your repository
1403-----------------------
3eb5128a 1404
914328ac 1405Earlier, we saw that one file under `.git/objects/??/` directory
2a29da7c 1406is stored for each git object you create. This representation
914328ac 1407is efficient to create atomically and safely, but
2a29da7c 1408not so convenient to transport over the network. Since git objects are
3eb5128a 1409immutable once they are created, there is a way to optimize the
2a29da7c 1410storage by "packing them together". The command
3eb5128a 1411
2ae6c706 1412------------
f2416c27 1413$ git repack
2ae6c706 1414------------
3eb5128a 1415
2a29da7c 1416will do it for you. If you followed the tutorial examples, you
914328ac
JH
1417would have accumulated about 17 objects in `.git/objects/??/`
1418directories by now. `git repack` tells you how many objects it
1419packed, and stores the packed file in `.git/objects/pack`
3eb5128a
JH
1420directory.
1421
8db9307c 1422[NOTE]
914328ac
JH
1423You will see two files, `pack-\*.pack` and `pack-\*.idx`,
1424in `.git/objects/pack` directory. They are closely related to
8db9307c
JH
1425each other, and if you ever copy them by hand to a different
1426repository for whatever reason, you should make sure you copy
1427them together. The former holds all the data from the objects
1428in the pack, and the latter holds the index for random
1429access.
3eb5128a 1430
914328ac 1431If you are paranoid, running `git-verify-pack` command would
3eb5128a
JH
1432detect if you have a corrupt pack, but do not worry too much.
1433Our programs are always perfect ;-).
1434
1435Once you have packed objects, you do not need to leave the
1436unpacked objects that are contained in the pack file anymore.
1437
2ae6c706 1438------------
f2416c27 1439$ git prune-packed
2ae6c706 1440------------
3eb5128a
JH
1441
1442would remove them for you.
1443
914328ac
JH
1444You can try running `find .git/objects -type f` before and after
1445you run `git prune-packed` if you are curious. Also `git
1446count-objects` would tell you how many unpacked objects are in
1447your repository and how much space they are consuming.
3eb5128a 1448
8db9307c 1449[NOTE]
914328ac
JH
1450`git pull` is slightly cumbersome for HTTP transport, as a
1451packed repository may contain relatively few objects in a
8db9307c
JH
1452relatively large pack. If you expect many HTTP pulls from your
1453public repository you might want to repack & prune often, or
1454never.
3eb5128a 1455
914328ac 1456If you run `git repack` again at this point, it will say
2a29da7c 1457"Nothing to pack". Once you continue your development and
914328ac 1458accumulate the changes, running `git repack` again will create a
3eb5128a 1459new pack, that contains objects created since you packed your
2a29da7c 1460repository the last time. We recommend that you pack your project
3eb5128a 1461soon after the initial import (unless you are starting your
914328ac 1462project from scratch), and then run `git repack` every once in a
3eb5128a
JH
1463while, depending on how active your project is.
1464
914328ac 1465When a repository is synchronized via `git push` and `git pull`
ade75a59 1466objects packed in the source repository are usually stored
3eb5128a 1467unpacked in the destination, unless rsync transport is used.
914328ac
JH
1468While this allows you to use different packing strategies on
1469both ends, it also means you may need to repack both
1470repositories every once in a while.
3eb5128a
JH
1471
1472
2a29da7c
JH
1473Working with Others
1474-------------------
3eb5128a 1475
a232a132
JH
1476Although git is a truly distributed system, it is often
1477convenient to organize your project with an informal hierarchy
2a29da7c 1478of developers. Linux kernel development is run this way. There
a232a132 1479is a nice illustration (page 17, "Merges to Mainline") in Randy
914328ac 1480Dunlap's presentation (`http://tinyurl.com/a2jdg`).
a232a132 1481
914328ac 1482It should be stressed that this hierarchy is purely *informal*.
a232a132 1483There is nothing fundamental in git that enforces the "chain of
2a29da7c 1484patch flow" this hierarchy implies. You do not have to pull
a232a132
JH
1485from only one remote repository.
1486
a232a132 1487A recommended workflow for a "project lead" goes like this:
3eb5128a 1488
8db9307c
JH
14891. Prepare your primary repository on your local machine. Your
1490 work is done there.
3eb5128a 1491
8db9307c 14922. Prepare a public repository accessible to others.
914328ac
JH
1493+
1494If other people are pulling from your repository over dumb
1495transport protocols, you need to keep this repository 'dumb
1496transport friendly'. After `git init-db`,
1497`$GIT_DIR/hooks/post-update` copied from the standard templates
1498would contain a call to `git-update-server-info` but the
1499`post-update` hook itself is disabled by default -- enable it
1500with `chmod +x post-update`.
3eb5128a 1501
8db9307c
JH
15023. Push into the public repository from your primary
1503 repository.
3eb5128a 1504
914328ac 15054. `git repack` the public repository. This establishes a big
8db9307c 1506 pack that contains the initial set of objects as the
914328ac 1507 baseline, and possibly `git prune` if the transport
8db9307c
JH
1508 used for pulling from your repository supports packed
1509 repositories.
3eb5128a 1510
8db9307c
JH
15115. Keep working in your primary repository. Your changes
1512 include modifications of your own, patches you receive via
1513 e-mails, and merges resulting from pulling the "public"
1514 repositories of your "subsystem maintainers".
1515+
1516You can repack this private repository whenever you feel like.
3eb5128a 1517
8db9307c
JH
15186. Push your changes to the public repository, and announce it
1519 to the public.
3eb5128a 1520
8db9307c
JH
15217. Every once in a while, "git repack" the public repository.
1522 Go back to step 5. and continue working.
3eb5128a 1523
a232a132 1524
ade75a59
JS
1525A recommended work cycle for a "subsystem maintainer" who works
1526on that project and has an own "public repository" goes like this:
3eb5128a 1527
914328ac 15281. Prepare your work repository, by `git clone` the public
8db9307c 1529 repository of the "project lead". The URL used for the
914328ac 1530 initial cloning is stored in `.git/remotes/origin`.
3eb5128a 1531
914328ac
JH
15322. Prepare a public repository accessible to others, just like
1533 the "project lead" person does.
3eb5128a 1534
8db9307c 15353. Copy over the packed files from "project lead" public
aa7f412a
JH
1536 repository to your public repository, unless the "project
1537 lead" repository lives on the same machine as yours. In the
1538 latter case, you can use `objects/info/alternates` file to
1539 point at the repository you are borrowing from.
3eb5128a 1540
8db9307c 15414. Push into the public repository from your primary
914328ac
JH
1542 repository. Run `git repack`, and possibly `git prune` if the
1543 transport used for pulling from your repository supports
1544 packed repositories.
3eb5128a 1545
8db9307c
JH
15465. Keep working in your primary repository. Your changes
1547 include modifications of your own, patches you receive via
1548 e-mails, and merges resulting from pulling the "public"
1549 repositories of your "project lead" and possibly your
1550 "sub-subsystem maintainers".
1551+
1552You can repack this private repository whenever you feel
1553like.
3eb5128a 1554
8db9307c
JH
15556. Push your changes to your public repository, and ask your
1556 "project lead" and possibly your "sub-subsystem
1557 maintainers" to pull from it.
a232a132 1558
914328ac 15597. Every once in a while, `git repack` the public repository.
8db9307c 1560 Go back to step 5. and continue working.
3eb5128a 1561
a232a132 1562
3eb5128a 1563A recommended work cycle for an "individual developer" who does
2a29da7c 1564not have a "public" repository is somewhat different. It goes
3eb5128a
JH
1565like this:
1566
914328ac 15671. Prepare your work repository, by `git clone` the public
8db9307c
JH
1568 repository of the "project lead" (or a "subsystem
1569 maintainer", if you work on a subsystem). The URL used for
914328ac 1570 the initial cloning is stored in `.git/remotes/origin`.
3eb5128a 1571
914328ac 15722. Do your work in your repository on 'master' branch.
3eb5128a 1573
914328ac 15743. Run `git fetch origin` from the public repository of your
8db9307c 1575 upstream every once in a while. This does only the first
914328ac
JH
1576 half of `git pull` but does not merge. The head of the
1577 public repository is stored in `.git/refs/heads/origin`.
3eb5128a 1578
914328ac
JH
15794. Use `git cherry origin` to see which ones of your patches
1580 were accepted, and/or use `git rebase origin` to port your
8db9307c 1581 unmerged changes forward to the updated upstream.
3eb5128a 1582
914328ac 15835. Use `git format-patch origin` to prepare patches for e-mail
8db9307c 1584 submission to your upstream and send it out. Go back to
914328ac 1585 step 2. and continue.
3eb5128a
JH
1586
1587
2a29da7c
JH
1588Working with Others, Shared Repository Style
1589--------------------------------------------
1590
1591If you are coming from CVS background, the style of cooperation
1592suggested in the previous section may be new to you. You do not
1593have to worry. git supports "shared public repository" style of
c9517341
JH
1594cooperation you are probably more familiar with as well.
1595
1596For this, set up a public repository on a machine that is
1597reachable via SSH by people with "commit privileges". Put the
1598committers in the same user group and make the repository
1599writable by that group.
1600
914328ac 1601You, as an individual committer, then:
c9517341 1602
914328ac 1603- First clone the shared repository to a local repository:
c9517341
JH
1604------------------------------------------------
1605$ git clone repo.shared.xz:/pub/scm/project.git/ my-project
1606$ cd my-project
1607$ hack away
1608------------------------------------------------
1609
914328ac
JH
1610- Merge the work others might have done while you were hacking
1611 away:
c9517341
JH
1612------------------------------------------------
1613$ git pull origin
1614$ test the merge result
1615------------------------------------------------
914328ac
JH
1616[NOTE]
1617================================
1618The first `git clone` would have placed the following in
1619`my-project/.git/remotes/origin` file, and that's why this and
1620the next step work.
1621------------
1622URL: repo.shared.xz:/pub/scm/project.git/ my-project
1623Pull: master:origin
1624------------
1625================================
c9517341 1626
914328ac
JH
1627- push your work as the new head of the shared
1628 repository.
c9517341
JH
1629------------------------------------------------
1630$ git push origin master
1631------------------------------------------------
c9517341 1632If somebody else pushed into the same shared repository while
914328ac
JH
1633you were working locally, `git push` in the last step would
1634complain, telling you that the remote `master` head does not
c9517341
JH
1635fast forward. You need to pull and merge those other changes
1636back before you push your work when it happens.
2a29da7c
JH
1637
1638
6f60300b
JH
1639Bundling your work together
1640---------------------------
1641
1642It is likely that you will be working on more than one thing at
1643a time. It is easy to use those more-or-less independent tasks
1644using branches with git.
1645
1646We have already seen how branches work in a previous example,
1647with "fun and work" example using two branches. The idea is the
1648same if there are more than two branches. Let's say you started
1649out from "master" head, and have some new code in the "master"
1650branch, and two independent fixes in the "commit-fix" and
1651"diff-fix" branches:
1652
1653------------
1654$ git show-branch
1655! [commit-fix] Fix commit message normalization.
1656 ! [diff-fix] Fix rename detection.
1657 * [master] Release candidate #1
1658---
1659 + [diff-fix] Fix rename detection.
1660 + [diff-fix~1] Better common substring algorithm.
1661+ [commit-fix] Fix commit message normalization.
1662 + [master] Release candidate #1
1663+++ [diff-fix~2] Pretty-print messages.
1664------------
1665
1666Both fixes are tested well, and at this point, you want to merge
1667in both of them. You could merge in 'diff-fix' first and then
1668'commit-fix' next, like this:
1669
1670------------
067744bd
JH
1671$ git merge 'Merge fix in diff-fix' master diff-fix
1672$ git merge 'Merge fix in commit-fix' master commit-fix
6f60300b
JH
1673------------
1674
1675Which would result in:
1676
1677------------
1678$ git show-branch
1679! [commit-fix] Fix commit message normalization.
1680 ! [diff-fix] Fix rename detection.
1681 * [master] Merge fix in commit-fix
1682---
1683 + [master] Merge fix in commit-fix
1684+ + [commit-fix] Fix commit message normalization.
1685 + [master~1] Merge fix in diff-fix
1686 ++ [diff-fix] Fix rename detection.
1687 ++ [diff-fix~1] Better common substring algorithm.
1688 + [master~2] Release candidate #1
1689+++ [master~3] Pretty-print messages.
1690------------
1691
1692However, there is no particular reason to merge in one branch
1693first and the other next, when what you have are a set of truly
1694independent changes (if the order mattered, then they are not
1695independent by definition). You could instead merge those two
1696branches into the current branch at once. First let's undo what
1697we just did and start over. We would want to get the master
1698branch before these two merges by resetting it to 'master~2':
1699
1700------------
1701$ git reset --hard master~2
1702------------
1703
1704You can make sure 'git show-branch' matches the state before
067744bd
JH
1705those two 'git merge' you just did. Then, instead of running
1706two 'git merge' commands in a row, you would pull these two
6f60300b
JH
1707branch heads (this is known as 'making an Octopus'):
1708
1709------------
1710$ git pull . commit-fix diff-fix
1711$ git show-branch
1712! [commit-fix] Fix commit message normalization.
1713 ! [diff-fix] Fix rename detection.
1714 * [master] Octopus merge of branches 'diff-fix' and 'commit-fix'
1715---
1716 + [master] Octopus merge of branches 'diff-fix' and 'commit-fix'
1717+ + [commit-fix] Fix commit message normalization.
1718 ++ [diff-fix] Fix rename detection.
1719 ++ [diff-fix~1] Better common substring algorithm.
1720 + [master~1] Release candidate #1
1721+++ [master~2] Pretty-print messages.
1722------------
1723
1724Note that you should not do Octopus because you can. An octopus
1725is a valid thing to do and often makes it easier to view the
1726commit history if you are pulling more than two independent
1727changes at the same time. However, if you have merge conflicts
1728with any of the branches you are merging in and need to hand
1729resolve, that is an indication that the development happened in
1730those branches were not independent after all, and you should
1731merge two at a time, documenting how you resolved the conflicts,
1732and the reason why you preferred changes made in one side over
1733the other. Otherwise it would make the project history harder
1734to follow, not easier.
1735
3eb5128a 1736[ to be continued.. cvsimports ]