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