Autogenerated HTML docs for v1.5.3.3-114-g2a85
authorJunio C Hamano <junio@hera.kernel.org>
Sun, 30 Sep 2007 00:51:14 +0000 (00:51 +0000)
committerJunio C Hamano <junio@hera.kernel.org>
Sun, 30 Sep 2007 00:51:14 +0000 (00:51 +0000)
19 files changed:
RelNotes-1.5.3.3.txt [new file with mode: 0644]
core-tutorial.html
core-tutorial.txt
git-bundle.html
git-bundle.txt
git-merge.html
git-merge.txt
git-remote.html
git-remote.txt
git-send-email.html
git-send-email.txt
git-submodule.html
git-submodule.txt
gitattributes.html
gitattributes.txt
gitignore.html
gitignore.txt
user-manual.html
user-manual.txt

diff --git a/RelNotes-1.5.3.3.txt b/RelNotes-1.5.3.3.txt
new file mode 100644 (file)
index 0000000..e91bd84
--- /dev/null
@@ -0,0 +1,37 @@
+GIT v1.5.3.3 Release Notes
+==========================
+
+Fixes since v1.5.3.2
+--------------------
+
+ * git-quiltimport did not like it when a patch described in the
+   series file does not exist.
+
+ * p4 importer missed executable bit in some cases.
+
+ * The default shell on some FreeBSD did not execute the
+   argument parsing code correctly and made git unusable.
+
+ * git-svn incorrectly spawned pager even when the user user
+   explicitly asked not to.
+
+ * sample post-receive hook overquoted the envelope sender
+   value.
+
+ * git-am got confused when the patch contained a change that is
+   only about type and not contents.
+
+ * git-mergetool did not show our and their version of the
+   conflicted file when started from a subdirectory of the
+   project.
+
+ * git-mergetool did not pass correct options when invoking diff3.
+
+ * git-log sometimes invoked underlying "diff" machinery
+   unnecessarily.
+
+--
+exec >/var/tmp/1
+O=v1.5.3.2-29-gb7bb760
+echo O=`git describe refs/heads/maint`
+git shortlog --no-merges $O..refs/heads/maint
index 67813694e3b9f83347a254f8d8b330c1db820e7e..6b27fbccc4a26bf191ad94e80bd8e8c47d52d748 100644 (file)
@@ -1689,7 +1689,8 @@ repositories every once in a while.</p>
 convenient to organize your project with an informal hierarchy\r
 of developers. Linux kernel development is run this way. There\r
 is a nice illustration (page 17, "Merges to Mainline") in\r
-<a href="http://tinyurl.com/a2jdg">Randy Dunlap's presentation</a>.</p>\r
+link:http://www.xenotime.net/linux/mentor/linux-mentoring-2006.pdf\r
+[Randy Dunlap's presentation].</p>\r
 <p>It should be stressed that this hierarchy is purely <strong>informal</strong>.\r
 There is nothing fundamental in git that enforces the "chain of\r
 patch flow" this hierarchy implies. You do not have to pull\r
@@ -1953,7 +1954,7 @@ to follow, not easier.</p>
 </div>\r
 <div id="footer">\r
 <div id="footer-text">\r
-Last updated 17-Sep-2007 17:32:48 UTC\r
+Last updated 30-Sep-2007 00:49:46 UTC\r
 </div>\r
 </div>\r
 </body>\r
index 4b4fd9a50639ad6e1517e426c027c5855c1b79f7..6b2590d0723ad94a45c9cae174935839df3331d8 100644 (file)
@@ -1459,7 +1459,8 @@ Although git is a truly distributed system, it is often
 convenient to organize your project with an informal hierarchy
 of developers. Linux kernel development is run this way. There
 is a nice illustration (page 17, "Merges to Mainline") in
-link:http://tinyurl.com/a2jdg[Randy Dunlap's presentation].
+link:http://www.xenotime.net/linux/mentor/linux-mentoring-2006.pdf
+[Randy Dunlap's presentation].
 
 It should be stressed that this hierarchy is purely *informal*.
 There is nothing fundamental in git that enforces the "chain of
index 488544266fa17132864715fc5005f88047592973..81b8a827f757eac4ba30bad8d985e16ca5ebd002 100644 (file)
@@ -392,13 +392,19 @@ but we can move data from A to B via some mechanism (CD, email, etc).
 We want to update R2 with developments made on branch master in R1.\r
 We set a tag in R1 (lastR2bundle) after the previous such transport,\r
 and move it afterwards to help build the bundle.</p>\r
-<p>in R1 on A:\r
-$ git-bundle create mybundle master ^lastR2bundle\r
-$ git tag -f lastR2bundle master</p>\r
+<p>in R1 on A:</p>\r
+<div class="listingblock">\r
+<div class="content">\r
+<pre><tt>$ git-bundle create mybundle master ^lastR2bundle\r
+$ git tag -f lastR2bundle master</tt></pre>\r
+</div></div>\r
 <p>(move mybundle from A to B by some mechanism)</p>\r
-<p>in R2 on B:\r
-$ git-bundle verify mybundle\r
-$ git-fetch mybundle  refspec</p>\r
+<p>in R2 on B:</p>\r
+<div class="listingblock">\r
+<div class="content">\r
+<pre><tt>$ git-bundle verify mybundle\r
+$ git-fetch mybundle  refspec</tt></pre>\r
+</div></div>\r
 <p>where refspec is refInBundle:localRef</p>\r
 <p>Also, with something like this in your config:</p>\r
 <div class="literalblock">\r
@@ -408,9 +414,12 @@ fetch = refs/heads/*:refs/remotes/origin/*</tt></pre>
 </div></div>\r
 <p>You can first sneakernet the bundle file to ~/tmp/file.bdl and\r
 then these commands:</p>\r
-<p>$ git ls-remote bundle\r
+<div class="listingblock">\r
+<div class="content">\r
+<pre><tt>$ git ls-remote bundle\r
 $ git fetch bundle\r
-$ git pull bundle</p>\r
+$ git pull bundle</tt></pre>\r
+</div></div>\r
 <p>would treat it as if it is talking with a remote side over the\r
 network.</p>\r
 </div>\r
@@ -424,7 +433,7 @@ network.</p>
 </div>\r
 <div id="footer">\r
 <div id="footer-text">\r
-Last updated 19-Jul-2007 02:09:32 UTC\r
+Last updated 30-Sep-2007 00:49:43 UTC\r
 </div>\r
 </div>\r
 </body>\r
index 5051e2bada6d2409f40a04bbd25a5201df7d836e..0cc6511bdf35f29ce946726485f71eeddddce56b 100644 (file)
@@ -103,14 +103,20 @@ We set a tag in R1 (lastR2bundle) after the previous such transport,
 and move it afterwards to help build the bundle.
 
 in R1 on A:
+
+------------
 $ git-bundle create mybundle master ^lastR2bundle
 $ git tag -f lastR2bundle master
+------------
 
 (move mybundle from A to B by some mechanism)
 
 in R2 on B:
+
+------------
 $ git-bundle verify mybundle
 $ git-fetch mybundle  refspec
+------------
 
 where refspec is refInBundle:localRef
 
@@ -124,9 +130,11 @@ Also, with something like this in your config:
 You can first sneakernet the bundle file to ~/tmp/file.bdl and
 then these commands:
 
+------------
 $ git ls-remote bundle
 $ git fetch bundle
 $ git pull bundle
+------------
 
 would treat it as if it is talking with a remote side over the
 network.
index 888d57bc63fcb9f0a5daccea352894fdc6173dc8..ea8855106b2724480285bae037aca7ecee38e90c 100644 (file)
@@ -451,7 +451,7 @@ merge.verbosity
         message if conflicts were detected. Level 1 outputs only\r
         conflicts, 2 outputs conflicts and file changes.  Level 5 and\r
         above outputs debugging information.  The default is level 2.\r
-        Can be overriden by <em>GIT_MERGE_VERBOSITY</em> environment variable.\r
+        Can be overridden by <em>GIT_MERGE_VERBOSITY</em> environment variable.\r
 </p>\r
 </dd>\r
 </dl>\r
@@ -606,7 +606,7 @@ Resolve the conflicts.  <tt>git-diff</tt> would report only the
 </div>\r
 <div id="footer">\r
 <div id="footer-text">\r
-Last updated 02-Aug-2007 07:23:09 UTC\r
+Last updated 30-Sep-2007 00:49:43 UTC\r
 </div>\r
 </div>\r
 </body>\r
index 144bc16ff26bbf1d311482e6be15fc034994ce49..eae49c4876caf6b2e6a8bd9770b3981fb8133edd 100644 (file)
@@ -56,7 +56,7 @@ merge.verbosity::
        message if conflicts were detected. Level 1 outputs only
        conflicts, 2 outputs conflicts and file changes.  Level 5 and
        above outputs debugging information.  The default is level 2.
-       Can be overriden by 'GIT_MERGE_VERBOSITY' environment variable.
+       Can be overridden by 'GIT_MERGE_VERBOSITY' environment variable.
 
 
 HOW MERGE WORKS
index 4aab497aa5720ed949d83c9f3e62398b6b21ca84..67017358dbc8d26c73ba25ea25d634cd4c3c58c5 100644 (file)
@@ -275,6 +275,7 @@ git-remote(1) Manual Page
 <div class="verseblock">\r
 <div class="content"><em>git-remote</em>\r
 <em>git-remote</em> add [-t &lt;branch&gt;] [-m &lt;branch&gt;] [-f] [--mirror] &lt;name&gt; &lt;url&gt;\r
+<em>git-remote</em> rm &lt;name&gt;\r
 <em>git-remote</em> show &lt;name&gt;\r
 <em>git-remote</em> prune &lt;name&gt;\r
 <em>git-remote</em> update [group]</div></div>\r
@@ -312,6 +313,15 @@ in the <em>refs/remotes/</em> namespace, but in <em>refs/heads/</em>.  This opti
 only makes sense in bare repositories.</p>\r
 </dd>\r
 <dt>\r
+<em>rm</em>\r
+</dt>\r
+<dd>\r
+<p>\r
+Remove the remote named &lt;name&gt;. All remote tracking branches and\r
+configuration settings for the remote are removed.\r
+</p>\r
+</dd>\r
+<dt>\r
 <em>show</em>\r
 </dt>\r
 <dd>\r
@@ -418,7 +428,7 @@ $ git merge origin</tt></pre>
 </div>\r
 <div id="footer">\r
 <div id="footer-text">\r
-Last updated 15-Sep-2007 07:45:33 UTC\r
+Last updated 30-Sep-2007 00:49:44 UTC\r
 </div>\r
 </div>\r
 </body>\r
index 94b9f177724993b800e5d0bd4e67f986bfffc188..027ba11bdb67ba540b63ec12e5a6b920cd2e5f7e 100644 (file)
@@ -11,6 +11,7 @@ SYNOPSIS
 [verse]
 'git-remote'
 'git-remote' add [-t <branch>] [-m <branch>] [-f] [--mirror] <name> <url>
+'git-remote' rm <name>
 'git-remote' show <name>
 'git-remote' prune <name>
 'git-remote' update [group]
@@ -50,6 +51,11 @@ In mirror mode, enabled with `--mirror`, the refs will not be stored
 in the 'refs/remotes/' namespace, but in 'refs/heads/'.  This option
 only makes sense in bare repositories.
 
+'rm'::
+
+Remove the remote named <name>. All remote tracking branches and
+configuration settings for the remote are removed.
+
 'show'::
 
 Gives some information about the remote <name>.
index 6fe4fe3420146f9e93296e62131511a6c905e291..45cfbcab188b4bb3cd36a4f426913f3101ce22ee 100644 (file)
@@ -406,6 +406,16 @@ enabled interface to provide the necessary information.</p>
 </p>\r
 </dd>\r
 <dt>\r
+--smtp-server-port\r
+</dt>\r
+<dd>\r
+<p>\r
+        Specifies a port different from the default port (SMTP\r
+        servers typically listen to smtp port 25 and ssmtp port\r
+        465).\r
+</p>\r
+</dd>\r
+<dt>\r
 --smtp-user, --smtp-pass\r
 </dt>\r
 <dd>\r
@@ -599,7 +609,7 @@ send_lots_of_email.pl by Greg Kroah-Hartman.</p>
 </div>\r
 <div id="footer">\r
 <div id="footer-text">\r
-Last updated 06-Sep-2007 01:33:18 UTC\r
+Last updated 30-Sep-2007 00:49:45 UTC\r
 </div>\r
 </div>\r
 </body>\r
index 1ec61affab506705499a80ec944b290896b993a0..3727776a0bf3196cd1d99ba4c2756767dca00567 100644 (file)
@@ -91,6 +91,11 @@ The --cc option must be repeated for each user you want on the cc list.
        `/usr/lib/sendmail` if such program is available, or
        `localhost` otherwise.
 
+--smtp-server-port::
+       Specifies a port different from the default port (SMTP
+       servers typically listen to smtp port 25 and ssmtp port
+       465).
+
 --smtp-user, --smtp-pass::
        Username and password for SMTP-AUTH. Defaults are the values of
        the configuration values 'sendemail.smtpuser' and
index 2474a6d50b385b3f42cfda545c941fc30cddae17..cd645cd4fce46eabac12364220e461c401285974 100644 (file)
@@ -289,6 +289,9 @@ add
         repository is cloned at the specified path, added to the\r
         changeset and registered in .gitmodules.   If no path is\r
         specified, the path is deduced from the repository specification.\r
+        If the repository url begins with ./ or ../, it is stored as\r
+        given but resolved as a relative path from the main project's\r
+        url when cloning.\r
 </p>\r
 </dd>\r
 <dt>\r
@@ -385,7 +388,7 @@ to each submodule url is "submodule.$name.url".</p>
 </div>\r
 <div id="footer">\r
 <div id="footer-text">\r
-Last updated 19-Jul-2007 02:09:56 UTC\r
+Last updated 30-Sep-2007 00:49:45 UTC\r
 </div>\r
 </div>\r
 </body>\r
index 2c48936fcd72c5276ae2fed217bd9b9564342f03..335e973a6a1d5350c1558eb68985ffe812c09212 100644 (file)
@@ -21,6 +21,9 @@ add::
        repository is cloned at the specified path, added to the
        changeset and registered in .gitmodules.   If no path is
        specified, the path is deduced from the repository specification.
+       If the repository url begins with ./ or ../, it is stored as
+       given but resolved as a relative path from the main project's
+       url when cloning.
 
 status::
        Show the status of the submodules. This will print the SHA-1 of the
index 5426ddf13ebf45ccbf44dddb4c603da091982ce9..b9f30121dc9459dd64e5463ab70dc93e612d25d6 100644 (file)
@@ -419,12 +419,6 @@ upon checkout.</p>
 sign <tt>$</tt> upon checkout.  Any byte sequence that begins with\r
 <tt>$Id:</tt> and ends with <tt>$</tt> in the worktree file is replaced\r
 with <tt>$Id$</tt> upon check-in.</p>\r
-<h4>Interaction between checkin/checkout attributes</h4>\r
-<p>In the check-in codepath, the worktree file is first converted\r
-with <tt>ident</tt> (if specified), and then with <tt>crlf</tt> (again, if\r
-specified and applicable).</p>\r
-<p>In the check-out codepath, the blob content is first converted\r
-with <tt>crlf</tt>, and then <tt>ident</tt>.</p>\r
 <h4><tt>filter</tt></h4>\r
 <p>A <tt>filter</tt> attribute can be set to a string value.  This names\r
 filter driver specified in the configuration.</p>\r
@@ -439,11 +433,10 @@ but makes the filter a no-op passthru.</p>
 <p>The content filtering is done to massage the content into a\r
 shape that is more convenient for the platform, filesystem, and\r
 the user to use.  The keyword here is "more convenient" and not\r
-"turning something unusable into usable".  In other words, it is\r
-"hanging yourself because we gave you a long rope" if your\r
-project uses filtering mechanism in such a way that it makes\r
-your project unusable unless the checkout is done with a\r
-specific filter in effect.</p>\r
+"turning something unusable into usable".  In other words, the\r
+intent is that if someone unsets the filter driver definition,\r
+or does not have the appropriate filter program, the project\r
+should still be usable.</p>\r
 <h4>Interaction between checkin/checkout attributes</h4>\r
 <p>In the check-in codepath, the worktree file is first converted\r
 with <tt>filter</tt> driver (if specified and corresponding driver\r
@@ -709,7 +702,7 @@ commit hash.</p>
 </div>\r
 <div id="footer">\r
 <div id="footer-text">\r
-Last updated 10-Sep-2007 08:10:47 UTC\r
+Last updated 30-Sep-2007 00:49:45 UTC\r
 </div>\r
 </div>\r
 </body>\r
index d0e951ee6f1c391459f822b8ecbb4c1237b209db..20cf8ff81673265629028b49c34e0393063fd6b1 100644 (file)
@@ -145,17 +145,6 @@ sign `$` upon checkout.  Any byte sequence that begins with
 with `$Id$` upon check-in.
 
 
-Interaction between checkin/checkout attributes
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-In the check-in codepath, the worktree file is first converted
-with `ident` (if specified), and then with `crlf` (again, if
-specified and applicable).
-
-In the check-out codepath, the blob content is first converted
-with `crlf`, and then `ident`.
-
-
 `filter`
 ^^^^^^^^
 
@@ -175,11 +164,10 @@ but makes the filter a no-op passthru.
 The content filtering is done to massage the content into a
 shape that is more convenient for the platform, filesystem, and
 the user to use.  The keyword here is "more convenient" and not
-"turning something unusable into usable".  In other words, it is
-"hanging yourself because we gave you a long rope" if your
-project uses filtering mechanism in such a way that it makes
-your project unusable unless the checkout is done with a
-specific filter in effect.
+"turning something unusable into usable".  In other words, the
+intent is that if someone unsets the filter driver definition,
+or does not have the appropriate filter program, the project
+should still be usable.
 
 
 Interaction between checkin/checkout attributes
index 33da1ff3b31eee2635cb105a5b15fab3362f6af7..081751682d6459f26c4fca42c3e6c3e5ae270ee4 100644 (file)
@@ -294,7 +294,7 @@ Patterns read from the command line for those commands that support
 <p>\r
 Patterns read from a <tt>.gitignore</tt> file in the same directory\r
    as the path, or in any parent directory, with patterns in the\r
-   higher level files (up to the root) being overriden by those in\r
+   higher level files (up to the root) being overridden by those in\r
    lower level files down to the directory containing the file.\r
    These patterns match relative to the location of the\r
    <tt>.gitignore</tt> file.  A project normally includes such\r
@@ -412,7 +412,7 @@ Frank Lichtenheld, and the git-list &lt;git@vger.kernel.org&gt;.</p>
 </div>\r
 <div id="footer">\r
 <div id="footer-text">\r
-Last updated 22-Jul-2007 09:33:20 UTC\r
+Last updated 30-Sep-2007 00:49:46 UTC\r
 </div>\r
 </div>\r
 </body>\r
index 9c83095693447a46f36299f417d71262890fb098..e8b8581f5280eefc470b216a80210f5f552a780a 100644 (file)
@@ -26,7 +26,7 @@ precedence, the last matching pattern decides the outcome):
 
  * Patterns read from a `.gitignore` file in the same directory
    as the path, or in any parent directory, with patterns in the
-   higher level files (up to the root) being overriden by those in
+   higher level files (up to the root) being overridden by those in
    lower level files down to the directory containing the file.
    These patterns match relative to the location of the
    `.gitignore` file.  A project normally includes such
index 74fbf5152b63bf8c032eb7c67c6292f5eff5f2ce..0cd9d452f55e157f2c1d8f3795ecd3e2e14d7cb6 100644 (file)
@@ -1,4 +1,4 @@
-<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Git User's Manual (for version 1.5.3 or newer)</title><link rel="stylesheet" href="docbook-xsl.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.69.1"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="book" lang="en"><div class="titlepage"><div><div><h1 class="title"><a name="id189136"></a>Git User's Manual (for version 1.5.3 or newer)</h1></div></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="preface"><a href="#id264725">Preface</a></span></dt><dt><span class="chapter"><a href="#repositories-and-branches">1. Repositories and Branches</a></span></dt><dd><dl><dt><span class="section"><a href="#how-to-get-a-git-repository">How to get a git repository</a></span></dt><dt><span class="section"><a href="#how-to-check-out">How to check out a different version of a project</a></span></dt><dt><span class="section"><a href="#understanding-commits">Understanding History: Commits</a></span></dt><dd><dl><dt><span class="section"><a href="#understanding-reachability">Understanding history: commits, parents, and reachability</a></span></dt><dt><span class="section"><a href="#history-diagrams">Understanding history: History diagrams</a></span></dt><dt><span class="section"><a href="#what-is-a-branch">Understanding history: What is a branch?</a></span></dt></dl></dd><dt><span class="section"><a href="#manipulating-branches">Manipulating branches</a></span></dt><dt><span class="section"><a href="#detached-head">Examining an old version without creating a new branch</a></span></dt><dt><span class="section"><a href="#examining-remote-branches">Examining branches from a remote repository</a></span></dt><dt><span class="section"><a href="#how-git-stores-references">Naming branches, tags, and other references</a></span></dt><dt><span class="section"><a href="#Updating-a-repository-with-git-fetch">Updating a repository with git fetch</a></span></dt><dt><span class="section"><a href="#fetching-branches">Fetching branches from other repositories</a></span></dt></dl></dd><dt><span class="chapter"><a href="#exploring-git-history">2. Exploring git history</a></span></dt><dd><dl><dt><span class="section"><a href="#using-bisect">How to use bisect to find a regression</a></span></dt><dt><span class="section"><a href="#naming-commits">Naming commits</a></span></dt><dt><span class="section"><a href="#creating-tags">Creating tags</a></span></dt><dt><span class="section"><a href="#browsing-revisions">Browsing revisions</a></span></dt><dt><span class="section"><a href="#generating-diffs">Generating diffs</a></span></dt><dt><span class="section"><a href="#viewing-old-file-versions">Viewing old file versions</a></span></dt><dt><span class="section"><a href="#history-examples">Examples</a></span></dt><dd><dl><dt><span class="section"><a href="#counting-commits-on-a-branch">Counting the number of commits on a branch</a></span></dt><dt><span class="section"><a href="#checking-for-equal-branches">Check whether two branches point at the same history</a></span></dt><dt><span class="section"><a href="#finding-tagged-descendants">Find first tagged version including a given fix</a></span></dt><dt><span class="section"><a href="#showing-commits-unique-to-a-branch">Showing commits unique to a given branch</a></span></dt><dt><span class="section"><a href="#making-a-release">Creating a changelog and tarball for a software release</a></span></dt><dt><span class="section"><a href="#Finding-comments-with-given-content">Finding commits referencing a file with given content</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="#Developing-with-git">3. Developing with git</a></span></dt><dd><dl><dt><span class="section"><a href="#telling-git-your-name">Telling git your name</a></span></dt><dt><span class="section"><a href="#creating-a-new-repository">Creating a new repository</a></span></dt><dt><span class="section"><a href="#how-to-make-a-commit">How to make a commit</a></span></dt><dt><span class="section"><a href="#creating-good-commit-messages">Creating good commit messages</a></span></dt><dt><span class="section"><a href="#ignoring-files">Ignoring files</a></span></dt><dt><span class="section"><a href="#how-to-merge">How to merge</a></span></dt><dt><span class="section"><a href="#resolving-a-merge">Resolving a merge</a></span></dt><dd><dl><dt><span class="section"><a href="#conflict-resolution">Getting conflict-resolution help during a merge</a></span></dt></dl></dd><dt><span class="section"><a href="#undoing-a-merge">Undoing a merge</a></span></dt><dt><span class="section"><a href="#fast-forwards">Fast-forward merges</a></span></dt><dt><span class="section"><a href="#fixing-mistakes">Fixing mistakes</a></span></dt><dd><dl><dt><span class="section"><a href="#reverting-a-commit">Fixing a mistake with a new commit</a></span></dt><dt><span class="section"><a href="#fixing-a-mistake-by-editing-history">Fixing a mistake by editing history</a></span></dt><dt><span class="section"><a href="#checkout-of-path">Checking out an old version of a file</a></span></dt><dt><span class="section"><a href="#interrupted-work">Temporarily setting aside work in progress</a></span></dt></dl></dd><dt><span class="section"><a href="#ensuring-good-performance">Ensuring good performance</a></span></dt><dt><span class="section"><a href="#ensuring-reliability">Ensuring reliability</a></span></dt><dd><dl><dt><span class="section"><a href="#checking-for-corruption">Checking the repository for corruption</a></span></dt><dt><span class="section"><a href="#recovering-lost-changes">Recovering lost changes</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="#sharing-development">4. Sharing development with others</a></span></dt><dd><dl><dt><span class="section"><a href="#getting-updates-with-git-pull">Getting updates with git pull</a></span></dt><dt><span class="section"><a href="#submitting-patches">Submitting patches to a project</a></span></dt><dt><span class="section"><a href="#importing-patches">Importing patches to a project</a></span></dt><dt><span class="section"><a href="#public-repositories">Public git repositories</a></span></dt><dd><dl><dt><span class="section"><a href="#setting-up-a-public-repository">Setting up a public repository</a></span></dt><dt><span class="section"><a href="#exporting-via-git">Exporting a git repository via the git protocol</a></span></dt><dt><span class="section"><a href="#exporting-via-http">Exporting a git repository via http</a></span></dt><dt><span class="section"><a href="#pushing-changes-to-a-public-repository">Pushing changes to a public repository</a></span></dt><dt><span class="section"><a href="#setting-up-a-shared-repository">Setting up a shared repository</a></span></dt><dt><span class="section"><a href="#setting-up-gitweb">Allowing web browsing of a repository</a></span></dt></dl></dd><dt><span class="section"><a href="#sharing-development-examples">Examples</a></span></dt><dd><dl><dt><span class="section"><a href="#maintaining-topic-branches">Maintaining topic branches for a Linux subsystem maintainer</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="#cleaning-up-history">5. Rewriting history and maintaining patch series</a></span></dt><dd><dl><dt><span class="section"><a href="#patch-series">Creating the perfect patch series</a></span></dt><dt><span class="section"><a href="#using-git-rebase">Keeping a patch series up to date using git-rebase</a></span></dt><dt><span class="section"><a href="#modifying-one-commit">Modifying a single commit</a></span></dt><dt><span class="section"><a href="#reordering-patch-series">Reordering or selecting from a patch series</a></span></dt><dt><span class="section"><a href="#patch-series-tools">Other tools</a></span></dt><dt><span class="section"><a href="#problems-with-rewriting-history">Problems with rewriting history</a></span></dt></dl></dd><dt><span class="chapter"><a href="#advanced-branch-management">6. Advanced branch management</a></span></dt><dd><dl><dt><span class="section"><a href="#fetching-individual-branches">Fetching individual branches</a></span></dt><dt><span class="section"><a href="#fetch-fast-forwards">git fetch and fast-forwards</a></span></dt><dt><span class="section"><a href="#forcing-fetch">Forcing git fetch to do non-fast-forward updates</a></span></dt><dt><span class="section"><a href="#remote-branch-configuration">Configuring remote branches</a></span></dt></dl></dd><dt><span class="chapter"><a href="#git-concepts">7. Git concepts</a></span></dt><dd><dl><dt><span class="section"><a href="#the-object-database">The Object Database</a></span></dt><dd><dl><dt><span class="section"><a href="#commit-object">Commit Object</a></span></dt><dt><span class="section"><a href="#tree-object">Tree Object</a></span></dt><dt><span class="section"><a href="#blob-object">Blob Object</a></span></dt><dt><span class="section"><a href="#trust">Trust</a></span></dt><dt><span class="section"><a href="#tag-object">Tag Object</a></span></dt><dt><span class="section"><a href="#pack-files">How git stores objects efficiently: pack files</a></span></dt><dt><span class="section"><a href="#dangling-objects">Dangling objects</a></span></dt></dl></dd><dt><span class="section"><a href="#the-index">The index</a></span></dt></dl></dd><dt><span class="chapter"><a href="#submodules">8. Submodules</a></span></dt><dd><dl><dt><span class="section"><a href="#id279663">Pitfalls with submodules</a></span></dt></dl></dd><dt><span class="chapter"><a href="#low-level-operations">9. Low-level git operations</a></span></dt><dd><dl><dt><span class="section"><a href="#object-manipulation">Object access and manipulation</a></span></dt><dt><span class="section"><a href="#the-workflow">The Workflow</a></span></dt><dd><dl><dt><span class="section"><a href="#working-directory-to-index">working directory -&gt; index</a></span></dt><dt><span class="section"><a href="#index-to-object-database">index -&gt; object database</a></span></dt><dt><span class="section"><a href="#object-database-to-index">object database -&gt; index</a></span></dt><dt><span class="section"><a href="#index-to-working-directory">index -&gt; working directory</a></span></dt><dt><span class="section"><a href="#tying-it-all-together">Tying it all together</a></span></dt></dl></dd><dt><span class="section"><a href="#examining-the-data">Examining the data</a></span></dt><dt><span class="section"><a href="#merging-multiple-trees">Merging multiple trees</a></span></dt><dt><span class="section"><a href="#merging-multiple-trees-2">Merging multiple trees, continued</a></span></dt></dl></dd><dt><span class="chapter"><a href="#hacking-git">10. Hacking git</a></span></dt><dd><dl><dt><span class="section"><a href="#object-details">Object storage format</a></span></dt><dt><span class="section"><a href="#birdview-on-the-source-code">A birds-eye view of Git's source code</a></span></dt></dl></dd><dt><span class="chapter"><a href="#glossary">11. GIT Glossary</a></span></dt><dt><span class="appendix"><a href="#git-quick-start">A. Git Quick Reference</a></span></dt><dd><dl><dt><span class="section"><a href="#quick-creating-a-new-repository">Creating a new repository</a></span></dt><dt><span class="section"><a href="#managing-branches">Managing branches</a></span></dt><dt><span class="section"><a href="#exploring-history">Exploring history</a></span></dt><dt><span class="section"><a href="#making-changes">Making changes</a></span></dt><dt><span class="section"><a href="#merging">Merging</a></span></dt><dt><span class="section"><a href="#sharing-your-changes">Sharing your changes</a></span></dt><dt><span class="section"><a href="#repository-maintenance">Repository maintenance</a></span></dt></dl></dd><dt><span class="appendix"><a href="#todo">B. Notes and todo list for this manual</a></span></dt></dl></div><div class="preface" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="id264725"></a>Preface</h2></div></div></div><p>Git is a fast distributed revision control system.</p><p>This manual is designed to be readable by someone with basic UNIX
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Git User's Manual (for version 1.5.3 or newer)</title><link rel="stylesheet" href="docbook-xsl.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.69.1"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="book" lang="en"><div class="titlepage"><div><div><h1 class="title"><a name="id189136"></a>Git User's Manual (for version 1.5.3 or newer)</h1></div></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="preface"><a href="#id264725">Preface</a></span></dt><dt><span class="chapter"><a href="#repositories-and-branches">1. Repositories and Branches</a></span></dt><dd><dl><dt><span class="section"><a href="#how-to-get-a-git-repository">How to get a git repository</a></span></dt><dt><span class="section"><a href="#how-to-check-out">How to check out a different version of a project</a></span></dt><dt><span class="section"><a href="#understanding-commits">Understanding History: Commits</a></span></dt><dd><dl><dt><span class="section"><a href="#understanding-reachability">Understanding history: commits, parents, and reachability</a></span></dt><dt><span class="section"><a href="#history-diagrams">Understanding history: History diagrams</a></span></dt><dt><span class="section"><a href="#what-is-a-branch">Understanding history: What is a branch?</a></span></dt></dl></dd><dt><span class="section"><a href="#manipulating-branches">Manipulating branches</a></span></dt><dt><span class="section"><a href="#detached-head">Examining an old version without creating a new branch</a></span></dt><dt><span class="section"><a href="#examining-remote-branches">Examining branches from a remote repository</a></span></dt><dt><span class="section"><a href="#how-git-stores-references">Naming branches, tags, and other references</a></span></dt><dt><span class="section"><a href="#Updating-a-repository-with-git-fetch">Updating a repository with git fetch</a></span></dt><dt><span class="section"><a href="#fetching-branches">Fetching branches from other repositories</a></span></dt></dl></dd><dt><span class="chapter"><a href="#exploring-git-history">2. Exploring git history</a></span></dt><dd><dl><dt><span class="section"><a href="#using-bisect">How to use bisect to find a regression</a></span></dt><dt><span class="section"><a href="#naming-commits">Naming commits</a></span></dt><dt><span class="section"><a href="#creating-tags">Creating tags</a></span></dt><dt><span class="section"><a href="#browsing-revisions">Browsing revisions</a></span></dt><dt><span class="section"><a href="#generating-diffs">Generating diffs</a></span></dt><dt><span class="section"><a href="#viewing-old-file-versions">Viewing old file versions</a></span></dt><dt><span class="section"><a href="#history-examples">Examples</a></span></dt><dd><dl><dt><span class="section"><a href="#counting-commits-on-a-branch">Counting the number of commits on a branch</a></span></dt><dt><span class="section"><a href="#checking-for-equal-branches">Check whether two branches point at the same history</a></span></dt><dt><span class="section"><a href="#finding-tagged-descendants">Find first tagged version including a given fix</a></span></dt><dt><span class="section"><a href="#showing-commits-unique-to-a-branch">Showing commits unique to a given branch</a></span></dt><dt><span class="section"><a href="#making-a-release">Creating a changelog and tarball for a software release</a></span></dt><dt><span class="section"><a href="#Finding-comments-with-given-content">Finding commits referencing a file with given content</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="#Developing-with-git">3. Developing with git</a></span></dt><dd><dl><dt><span class="section"><a href="#telling-git-your-name">Telling git your name</a></span></dt><dt><span class="section"><a href="#creating-a-new-repository">Creating a new repository</a></span></dt><dt><span class="section"><a href="#how-to-make-a-commit">How to make a commit</a></span></dt><dt><span class="section"><a href="#creating-good-commit-messages">Creating good commit messages</a></span></dt><dt><span class="section"><a href="#ignoring-files">Ignoring files</a></span></dt><dt><span class="section"><a href="#how-to-merge">How to merge</a></span></dt><dt><span class="section"><a href="#resolving-a-merge">Resolving a merge</a></span></dt><dd><dl><dt><span class="section"><a href="#conflict-resolution">Getting conflict-resolution help during a merge</a></span></dt></dl></dd><dt><span class="section"><a href="#undoing-a-merge">Undoing a merge</a></span></dt><dt><span class="section"><a href="#fast-forwards">Fast-forward merges</a></span></dt><dt><span class="section"><a href="#fixing-mistakes">Fixing mistakes</a></span></dt><dd><dl><dt><span class="section"><a href="#reverting-a-commit">Fixing a mistake with a new commit</a></span></dt><dt><span class="section"><a href="#fixing-a-mistake-by-editing-history">Fixing a mistake by editing history</a></span></dt><dt><span class="section"><a href="#checkout-of-path">Checking out an old version of a file</a></span></dt><dt><span class="section"><a href="#interrupted-work">Temporarily setting aside work in progress</a></span></dt></dl></dd><dt><span class="section"><a href="#ensuring-good-performance">Ensuring good performance</a></span></dt><dt><span class="section"><a href="#ensuring-reliability">Ensuring reliability</a></span></dt><dd><dl><dt><span class="section"><a href="#checking-for-corruption">Checking the repository for corruption</a></span></dt><dt><span class="section"><a href="#recovering-lost-changes">Recovering lost changes</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="#sharing-development">4. Sharing development with others</a></span></dt><dd><dl><dt><span class="section"><a href="#getting-updates-with-git-pull">Getting updates with git pull</a></span></dt><dt><span class="section"><a href="#submitting-patches">Submitting patches to a project</a></span></dt><dt><span class="section"><a href="#importing-patches">Importing patches to a project</a></span></dt><dt><span class="section"><a href="#public-repositories">Public git repositories</a></span></dt><dd><dl><dt><span class="section"><a href="#setting-up-a-public-repository">Setting up a public repository</a></span></dt><dt><span class="section"><a href="#exporting-via-git">Exporting a git repository via the git protocol</a></span></dt><dt><span class="section"><a href="#exporting-via-http">Exporting a git repository via http</a></span></dt><dt><span class="section"><a href="#pushing-changes-to-a-public-repository">Pushing changes to a public repository</a></span></dt><dt><span class="section"><a href="#setting-up-a-shared-repository">Setting up a shared repository</a></span></dt><dt><span class="section"><a href="#setting-up-gitweb">Allowing web browsing of a repository</a></span></dt></dl></dd><dt><span class="section"><a href="#sharing-development-examples">Examples</a></span></dt><dd><dl><dt><span class="section"><a href="#maintaining-topic-branches">Maintaining topic branches for a Linux subsystem maintainer</a></span></dt></dl></dd></dl></dd><dt><span class="chapter"><a href="#cleaning-up-history">5. Rewriting history and maintaining patch series</a></span></dt><dd><dl><dt><span class="section"><a href="#patch-series">Creating the perfect patch series</a></span></dt><dt><span class="section"><a href="#using-git-rebase">Keeping a patch series up to date using git-rebase</a></span></dt><dt><span class="section"><a href="#modifying-one-commit">Modifying a single commit</a></span></dt><dt><span class="section"><a href="#reordering-patch-series">Reordering or selecting from a patch series</a></span></dt><dt><span class="section"><a href="#patch-series-tools">Other tools</a></span></dt><dt><span class="section"><a href="#problems-with-rewriting-history">Problems with rewriting history</a></span></dt></dl></dd><dt><span class="chapter"><a href="#advanced-branch-management">6. Advanced branch management</a></span></dt><dd><dl><dt><span class="section"><a href="#fetching-individual-branches">Fetching individual branches</a></span></dt><dt><span class="section"><a href="#fetch-fast-forwards">git fetch and fast-forwards</a></span></dt><dt><span class="section"><a href="#forcing-fetch">Forcing git fetch to do non-fast-forward updates</a></span></dt><dt><span class="section"><a href="#remote-branch-configuration">Configuring remote branches</a></span></dt></dl></dd><dt><span class="chapter"><a href="#git-concepts">7. Git concepts</a></span></dt><dd><dl><dt><span class="section"><a href="#the-object-database">The Object Database</a></span></dt><dd><dl><dt><span class="section"><a href="#commit-object">Commit Object</a></span></dt><dt><span class="section"><a href="#tree-object">Tree Object</a></span></dt><dt><span class="section"><a href="#blob-object">Blob Object</a></span></dt><dt><span class="section"><a href="#trust">Trust</a></span></dt><dt><span class="section"><a href="#tag-object">Tag Object</a></span></dt><dt><span class="section"><a href="#pack-files">How git stores objects efficiently: pack files</a></span></dt><dt><span class="section"><a href="#dangling-objects">Dangling objects</a></span></dt></dl></dd><dt><span class="section"><a href="#the-index">The index</a></span></dt></dl></dd><dt><span class="chapter"><a href="#submodules">8. Submodules</a></span></dt><dd><dl><dt><span class="section"><a href="#id279699">Pitfalls with submodules</a></span></dt></dl></dd><dt><span class="chapter"><a href="#low-level-operations">9. Low-level git operations</a></span></dt><dd><dl><dt><span class="section"><a href="#object-manipulation">Object access and manipulation</a></span></dt><dt><span class="section"><a href="#the-workflow">The Workflow</a></span></dt><dd><dl><dt><span class="section"><a href="#working-directory-to-index">working directory -&gt; index</a></span></dt><dt><span class="section"><a href="#index-to-object-database">index -&gt; object database</a></span></dt><dt><span class="section"><a href="#object-database-to-index">object database -&gt; index</a></span></dt><dt><span class="section"><a href="#index-to-working-directory">index -&gt; working directory</a></span></dt><dt><span class="section"><a href="#tying-it-all-together">Tying it all together</a></span></dt></dl></dd><dt><span class="section"><a href="#examining-the-data">Examining the data</a></span></dt><dt><span class="section"><a href="#merging-multiple-trees">Merging multiple trees</a></span></dt><dt><span class="section"><a href="#merging-multiple-trees-2">Merging multiple trees, continued</a></span></dt></dl></dd><dt><span class="chapter"><a href="#hacking-git">10. Hacking git</a></span></dt><dd><dl><dt><span class="section"><a href="#object-details">Object storage format</a></span></dt><dt><span class="section"><a href="#birdview-on-the-source-code">A birds-eye view of Git's source code</a></span></dt></dl></dd><dt><span class="chapter"><a href="#glossary">11. GIT Glossary</a></span></dt><dt><span class="appendix"><a href="#git-quick-start">A. Git Quick Reference</a></span></dt><dd><dl><dt><span class="section"><a href="#quick-creating-a-new-repository">Creating a new repository</a></span></dt><dt><span class="section"><a href="#managing-branches">Managing branches</a></span></dt><dt><span class="section"><a href="#exploring-history">Exploring history</a></span></dt><dt><span class="section"><a href="#making-changes">Making changes</a></span></dt><dt><span class="section"><a href="#merging">Merging</a></span></dt><dt><span class="section"><a href="#sharing-your-changes">Sharing your changes</a></span></dt><dt><span class="section"><a href="#repository-maintenance">Repository maintenance</a></span></dt></dl></dd><dt><span class="appendix"><a href="#todo">B. Notes and todo list for this manual</a></span></dt></dl></div><div class="preface" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="id264725"></a>Preface</h2></div></div></div><p>Git is a fast distributed revision control system.</p><p>This manual is designed to be readable by someone with basic UNIX
 command-line skills, but no previous knowledge of git.</p><p><a href="#repositories-and-branches" title="Chapter 1. Repositories and Branches">Chapter 1, <i>Repositories and Branches</i></a> and <a href="#exploring-git-history" title="Chapter 2. Exploring git history">Chapter 2, <i>Exploring git history</i></a> explain how
 to fetch and study a project using git—read these chapters to learn how
 to build and test a particular version of a software project, search for
@@ -1182,8 +1182,7 @@ contents (including, recursively, the contents of all subdirectories)
 are identical.  This allows git to quickly determine the differences
 between two related tree objects, since it can ignore any entries with
 identical object names.</p><p>(Note: in the presence of submodules, trees may also have commits as
-entries.   See <a href="git-submodule.html" target="_top">git-submodule(1)</a> and <a href="gitmodules.txt.html" target="_top">gitmodules.txt(1)</a>
-for partial documentation.)</p><p>Note that the files all have mode 644 or 755: git actually only pays
+entries.  See <a href="#submodules" title="Chapter 8. Submodules">Chapter 8, <i>Submodules</i></a> for documentation.)</p><p>Note that the files all have mode 644 or 755: git actually only pays
 attention to the executable bit.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="blob-object"></a>Blob Object</h3></div></div></div><p>You can use <a href="git-show.html" target="_top">git-show(1)</a> to examine the contents of a blob; take,
 for example, the blob in the entry for "COPYING" from the tree above:</p><div class="literallayout"><p>$ git show 6ff87c4664<br>
 <br>
@@ -1333,10 +1332,35 @@ column in the <a href="git-ls-files.html" target="_top">git-ls-files(1)</a> outp
 number, and will take on values other than 0 for files with merge
 conflicts.</p></li></ol></div><p>The index is thus a sort of temporary staging area, which is filled with
 a tree which you are in the process of working on.</p><p>If you blow the index away entirely, you generally haven't lost any
-information as long as you have the name of the tree that it described.</p></div></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="submodules"></a>Chapter 8. Submodules</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="section"><a href="#id279663">Pitfalls with submodules</a></span></dt></dl></div><p>This tutorial explains how to create and publish a repository with submodules
-using the <a href="git-submodule.html" target="_top">git-submodule(1)</a> command.</p><p>Submodules maintain their own identity; the submodule support just stores the
-submodule repository location and commit ID, so other developers who clone the
-superproject can easily clone all the submodules at the same revision.</p><p>To see how submodule support works, create (for example) four example
+information as long as you have the name of the tree that it described.</p></div></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="submodules"></a>Chapter 8. Submodules</h2></div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="section"><a href="#id279699">Pitfalls with submodules</a></span></dt></dl></div><p>Large projects are often composed of smaller, self-contained modules.  For
+example, an embedded Linux distribution's source tree would include every
+piece of software in the distribution with some local modifications; a movie
+player might need to build against a specific, known-working version of a
+decompression library; several independent programs might all share the same
+build scripts.</p><p>With centralized revision control systems this is often accomplished by
+including every module in one single repository.  Developers can check out
+all modules or only the modules they need to work with.  They can even modify
+files across several modules in a single commit while moving things around
+or updating APIs and translations.</p><p>Git does not allow partial checkouts, so duplicating this approach in Git
+would force developers to keep a local copy of modules they are not
+interested in touching.  Commits in an enormous checkout would be slower
+than you'd expect as Git would have to scan every directory for changes.
+If modules have a lot of local history, clones would take forever.</p><p>On the plus side, distributed revision control systems can much better
+integrate with external sources.  In a centralized model, a single arbitrary
+snapshot of the external project is exported from its own revision control
+and then imported into the local revision control on a vendor branch.  All
+the history is hidden.  With distributed revision control you can clone the
+entire external history and much more easily follow development and re-merge
+local changes.</p><p>Git's submodule support allows a repository to contain, as a subdirectory, a
+checkout of an external project.  Submodules maintain their own identity;
+the submodule support just stores the submodule repository location and
+commit ID, so other developers who clone the containing project
+("superproject") can easily clone all the submodules at the same revision.
+Partial checkouts of the superproject are possible: you can tell Git to
+clone none, some or all of the submodules.</p><p>The <a href="git-submodule.html" target="_top">git-submodule(1)</a> command is available since Git 1.5.3.  Users
+with Git 1.5.2 can look up the submodule commits in the repository and
+manually check them out; earlier versions won't recognize the submodules at
+all.</p><p>To see how submodule support works, create (for example) four example
 repositories that can be used later as a submodule:</p><div class="literallayout"><p>$ mkdir ~/git<br>
 $ cd ~/git<br>
 $ for i in a b c d<br>
@@ -1359,8 +1383,8 @@ done</p></div><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"
 It clones the submodule under the current directory and by default checks out
   the master branch.
 </li><li>
-It adds the submodule's clone path to the <code class="literal">.gitmodules</code> file and adds this
-  file to the index, ready to be committed.
+It adds the submodule's clone path to the <a href="gitmodules.html" target="_top">gitmodules(5)</a> file and
+  adds this file to the index, ready to be committed.
 </li><li>
 It adds the submodule's current commit ID to the index, ready to be
   committed.
@@ -1402,7 +1426,7 @@ index d266b98..261dfac 160000<br>
 $ git add a<br>
 $ git commit -m "Updated submodule a."<br>
 $ git push</p></div><p>You have to run <code class="literal">git submodule update</code> after <code class="literal">git pull</code> if you want to update
-submodules, too.</p><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id279663"></a>Pitfalls with submodules</h2></div></div></div><p>Always publish the submodule change before publishing the change to the
+submodules, too.</p><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id279699"></a>Pitfalls with submodules</h2></div></div></div><p>Always publish the submodule change before publishing the change to the
 superproject that references it. If you forget to publish the submodule change,
 others won't be able to clone the repository:</p><div class="literallayout"><p>$ cd ~/git/super/a<br>
 $ echo i added another line to this file &gt;&gt; a.txt<br>
@@ -2326,4 +2350,4 @@ temporary branch creation?</p><p>Add more good examples.  Entire sections of jus
 might be a good idea; maybe make an "advanced examples" section a
 standard end-of-chapter section?</p><p>Include cross-references to the glossary, where appropriate.</p><p>Document shallow clones?  See draft 1.5.0 release notes for some
 documentation.</p><p>Add a section on working with other version control systems, including
-CVS, Subversion, and just imports of series of release tarballs.</p><p>More details on gitweb?</p><p>Write a chapter on using plumbing and writing scripts.</p><p>Alternates, clone -reference, etc.</p><p>git unpack-objects -r for recovery</p><p>submodules</p></div></div></body></html>
+CVS, Subversion, and just imports of series of release tarballs.</p><p>More details on gitweb?</p><p>Write a chapter on using plumbing and writing scripts.</p><p>Alternates, clone -reference, etc.</p><p>git unpack-objects -r for recovery</p></div></div></body></html>
index a085ca1d3919205d20923d73301f3d79ea1605af..c7fdf25e27c94e9b152592a28bf7acc64dfa0e07 100644 (file)
@@ -2856,8 +2856,7 @@ between two related tree objects, since it can ignore any entries with
 identical object names.
 
 (Note: in the presence of submodules, trees may also have commits as
-entries.   See gitlink:git-submodule[1] and gitlink:gitmodules.txt[1]
-for partial documentation.)
+entries.  See <<submodules>> for documentation.)
 
 Note that the files all have mode 644 or 755: git actually only pays
 attention to the executable bit.
@@ -3163,12 +3162,45 @@ information as long as you have the name of the tree that it described.
 Submodules
 ==========
 
-This tutorial explains how to create and publish a repository with submodules
-using the gitlink:git-submodule[1] command.
-
-Submodules maintain their own identity; the submodule support just stores the
-submodule repository location and commit ID, so other developers who clone the
-superproject can easily clone all the submodules at the same revision.
+Large projects are often composed of smaller, self-contained modules.  For
+example, an embedded Linux distribution's source tree would include every
+piece of software in the distribution with some local modifications; a movie
+player might need to build against a specific, known-working version of a
+decompression library; several independent programs might all share the same
+build scripts.
+
+With centralized revision control systems this is often accomplished by
+including every module in one single repository.  Developers can check out
+all modules or only the modules they need to work with.  They can even modify
+files across several modules in a single commit while moving things around
+or updating APIs and translations.
+
+Git does not allow partial checkouts, so duplicating this approach in Git
+would force developers to keep a local copy of modules they are not
+interested in touching.  Commits in an enormous checkout would be slower
+than you'd expect as Git would have to scan every directory for changes.
+If modules have a lot of local history, clones would take forever.
+
+On the plus side, distributed revision control systems can much better
+integrate with external sources.  In a centralized model, a single arbitrary
+snapshot of the external project is exported from its own revision control
+and then imported into the local revision control on a vendor branch.  All
+the history is hidden.  With distributed revision control you can clone the
+entire external history and much more easily follow development and re-merge
+local changes.
+
+Git's submodule support allows a repository to contain, as a subdirectory, a
+checkout of an external project.  Submodules maintain their own identity;
+the submodule support just stores the submodule repository location and
+commit ID, so other developers who clone the containing project
+("superproject") can easily clone all the submodules at the same revision.
+Partial checkouts of the superproject are possible: you can tell Git to
+clone none, some or all of the submodules.
+
+The gitlink:git-submodule[1] command is available since Git 1.5.3.  Users
+with Git 1.5.2 can look up the submodule commits in the repository and
+manually check them out; earlier versions won't recognize the submodules at
+all.
 
 To see how submodule support works, create (for example) four example
 repositories that can be used later as a submodule:
@@ -3213,8 +3245,8 @@ The `git submodule add` command does a couple of things:
 
 - It clones the submodule under the current directory and by default checks out
   the master branch.
-- It adds the submodule's clone path to the `.gitmodules` file and adds this
-  file to the index, ready to be committed.
+- It adds the submodule's clone path to the gitlink:gitmodules[5] file and
+  adds this file to the index, ready to be committed.
 - It adds the submodule's current commit ID to the index, ready to be
   committed.
 
@@ -4277,5 +4309,3 @@ Write a chapter on using plumbing and writing scripts.
 Alternates, clone -reference, etc.
 
 git unpack-objects -r for recovery
-
-submodules