<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" | |
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> | |
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> | |
<head> | |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | |
<meta name="generator" content="AsciiDoc 7.0.2" /> | |
<style type="text/css"> | |
/* Debug borders */ | |
p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 { | |
/* | |
border: 1px solid red; | |
*/ | |
} | |
body { | |
margin: 1em 5% 1em 5%; | |
} | |
a { color: blue; } | |
a:visited { color: fuchsia; } | |
em { | |
font-style: italic; | |
} | |
strong { | |
font-weight: bold; | |
} | |
tt { | |
color: navy; | |
} | |
h1, h2, h3, h4, h5, h6 { | |
color: #527bbd; | |
font-family: sans-serif; | |
margin-top: 1.2em; | |
margin-bottom: 0.5em; | |
line-height: 1.3; | |
} | |
h1 { | |
border-bottom: 2px solid silver; | |
} | |
h2 { | |
border-bottom: 2px solid silver; | |
padding-top: 0.5em; | |
} | |
div.sectionbody { | |
font-family: serif; | |
margin-left: 0; | |
} | |
hr { | |
border: 1px solid silver; | |
} | |
p { | |
margin-top: 0.5em; | |
margin-bottom: 0.5em; | |
} | |
pre { | |
padding: 0; | |
margin: 0; | |
} | |
span#author { | |
color: #527bbd; | |
font-family: sans-serif; | |
font-weight: bold; | |
font-size: 1.2em; | |
} | |
span#email { | |
} | |
span#revision { | |
font-family: sans-serif; | |
} | |
div#footer { | |
font-family: sans-serif; | |
font-size: small; | |
border-top: 2px solid silver; | |
padding-top: 0.5em; | |
margin-top: 4.0em; | |
} | |
div#footer-text { | |
float: left; | |
padding-bottom: 0.5em; | |
} | |
div#footer-badges { | |
float: right; | |
padding-bottom: 0.5em; | |
} | |
div#preamble, | |
div.tableblock, div.imageblock, div.exampleblock, div.verseblock, | |
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock, | |
div.admonitionblock { | |
margin-right: 10%; | |
margin-top: 1.5em; | |
margin-bottom: 1.5em; | |
} | |
div.admonitionblock { | |
margin-top: 2.5em; | |
margin-bottom: 2.5em; | |
} | |
div.content { /* Block element content. */ | |
padding: 0; | |
} | |
/* Block element titles. */ | |
div.title, caption.title { | |
font-family: sans-serif; | |
font-weight: bold; | |
text-align: left; | |
margin-top: 1.0em; | |
margin-bottom: 0.5em; | |
} | |
div.title + * { | |
margin-top: 0; | |
} | |
td div.title:first-child { | |
margin-top: 0.0em; | |
} | |
div.content div.title:first-child { | |
margin-top: 0.0em; | |
} | |
div.content + div.title { | |
margin-top: 0.0em; | |
} | |
div.sidebarblock > div.content { | |
background: #ffffee; | |
border: 1px solid silver; | |
padding: 0.5em; | |
} | |
div.listingblock > div.content { | |
border: 1px solid silver; | |
background: #f4f4f4; | |
padding: 0.5em; | |
} | |
div.quoteblock > div.content { | |
padding-left: 2.0em; | |
} | |
div.quoteblock .attribution { | |
text-align: right; | |
} | |
div.admonitionblock .icon { | |
vertical-align: top; | |
font-size: 1.1em; | |
font-weight: bold; | |
text-decoration: underline; | |
color: #527bbd; | |
padding-right: 0.5em; | |
} | |
div.admonitionblock td.content { | |
padding-left: 0.5em; | |
border-left: 2px solid silver; | |
} | |
div.exampleblock > div.content { | |
border-left: 2px solid silver; | |
padding: 0.5em; | |
} | |
div.verseblock div.content { | |
white-space: pre; | |
} | |
div.imageblock div.content { padding-left: 0; } | |
div.imageblock img { border: 1px solid silver; } | |
span.image img { border-style: none; } | |
dl { | |
margin-top: 0.8em; | |
margin-bottom: 0.8em; | |
} | |
dt { | |
margin-top: 0.5em; | |
margin-bottom: 0; | |
font-style: italic; | |
} | |
dd > *:first-child { | |
margin-top: 0; | |
} | |
ul, ol { | |
list-style-position: outside; | |
} | |
ol.olist2 { | |
list-style-type: lower-alpha; | |
} | |
div.tableblock > table { | |
border-color: #527bbd; | |
border-width: 3px; | |
} | |
thead { | |
font-family: sans-serif; | |
font-weight: bold; | |
} | |
tfoot { | |
font-weight: bold; | |
} | |
div.hlist { | |
margin-top: 0.8em; | |
margin-bottom: 0.8em; | |
} | |
td.hlist1 { | |
vertical-align: top; | |
font-style: italic; | |
padding-right: 0.8em; | |
} | |
td.hlist2 { | |
vertical-align: top; | |
} | |
@media print { | |
div#footer-badges { display: none; } | |
} | |
include::./stylesheets/xhtml11-manpage.css[] | |
/* Workarounds for IE6's broken and incomplete CSS2. */ | |
div.sidebar-content { | |
background: #ffffee; | |
border: 1px solid silver; | |
padding: 0.5em; | |
} | |
div.sidebar-title, div.image-title { | |
font-family: sans-serif; | |
font-weight: bold; | |
margin-top: 0.0em; | |
margin-bottom: 0.5em; | |
} | |
div.listingblock div.content { | |
border: 1px solid silver; | |
background: #f4f4f4; | |
padding: 0.5em; | |
} | |
div.quoteblock-content { | |
padding-left: 2.0em; | |
} | |
div.exampleblock-content { | |
border-left: 2px solid silver; | |
padding-left: 0.5em; | |
} | |
</style> | |
<title>git(7)</title> | |
</head> | |
<body> | |
<div id="header"> | |
<h1> | |
git(7) Manual Page | |
</h1> | |
<h2>NAME</h2> | |
<div class="sectionbody"> | |
<p>git - | |
the stupid content tracker | |
</p> | |
</div> | |
</div> | |
<h2>SYNOPSIS</h2> | |
<div class="sectionbody"> | |
<div class="verseblock"> | |
<div class="content"><em>git</em> [--version] [--exec-path[=GIT_EXEC_PATH]] [-p|--paginate] | |
[--bare] [--git-dir=GIT_DIR] [--help] COMMAND [ARGS]</div></div> | |
</div> | |
<h2>DESCRIPTION</h2> | |
<div class="sectionbody"> | |
<p>Git is a fast, scalable, distributed revision control system with an | |
unusually rich command set that provides both high-level operations | |
and full access to internals.</p> | |
<p>See this <a href="tutorial.html">tutorial</a> to get started, then see | |
<a href="everyday.html">Everyday Git</a> for a useful minimum set of commands, and | |
"man git-commandname" for documentation of each command. CVS users may | |
also want to read <a href="cvs-migration.html">CVS migration</a>. | |
<a href="user-manual.html">Git User's Manual</a> is still work in | |
progress, but when finished hopefully it will guide a new user | |
in a coherent way to git enlightenment ;-).</p> | |
<p>The COMMAND is either a name of a Git command (see below) or an alias | |
as defined in the configuration file (see <a href="git-config.html">git-config(1)</a>).</p> | |
</div> | |
<h2>OPTIONS</h2> | |
<div class="sectionbody"> | |
<dl> | |
<dt> | |
--version | |
</dt> | |
<dd> | |
<p> | |
Prints the git suite version that the <em>git</em> program came from. | |
</p> | |
</dd> | |
<dt> | |
--help | |
</dt> | |
<dd> | |
<p> | |
Prints the synopsis and a list of the most commonly used | |
commands. If a git command is named this option will bring up | |
the man-page for that command. If the option <em>--all</em> or <em>-a</em> is | |
given then all available commands are printed. | |
</p> | |
</dd> | |
<dt> | |
--exec-path | |
</dt> | |
<dd> | |
<p> | |
Path to wherever your core git programs are installed. | |
This can also be controlled by setting the GIT_EXEC_PATH | |
environment variable. If no path is given <em>git</em> will print | |
the current setting and then exit. | |
</p> | |
</dd> | |
<dt> | |
-p|--paginate | |
</dt> | |
<dd> | |
<p> | |
Pipe all output into <em>less</em> (or if set, $PAGER). | |
</p> | |
</dd> | |
<dt> | |
--git-dir=<path> | |
</dt> | |
<dd> | |
<p> | |
Set the path to the repository. This can also be controlled by | |
setting the GIT_DIR environment variable. | |
</p> | |
</dd> | |
<dt> | |
--bare | |
</dt> | |
<dd> | |
<p> | |
Same as --git-dir=<tt>pwd</tt>. | |
</p> | |
</dd> | |
</dl> | |
</div> | |
<h2>FURTHER DOCUMENTATION</h2> | |
<div class="sectionbody"> | |
<p>See the references above to get started using git. The following is | |
probably more detail than necessary for a first-time user.</p> | |
<p>The <a href="#Discussion">Discussion</a> section below and the | |
<a href="core-tutorial.html">Core tutorial</a> both provide introductions to the | |
underlying git architecture.</p> | |
<p>See also the <a href="howto-index.html">howto</a> documents for some useful | |
examples.</p> | |
</div> | |
<h2>GIT COMMANDS</h2> | |
<div class="sectionbody"> | |
<p>We divide git into high level ("porcelain") commands and low level | |
("plumbing") commands.</p> | |
</div> | |
<h2>High-level commands (porcelain)</h2> | |
<div class="sectionbody"> | |
<p>We separate the porcelain commands into the main commands and some | |
ancillary user utilities.</p> | |
<h3>Main porcelain commands</h3> | |
<dl> | |
<dt> | |
<a href="git-add.html">git-add(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Add file contents to the changeset to be committed next. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-am.html">git-am(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Apply a series of patches from a mailbox. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-archive.html">git-archive(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Creates an archive of files from a named tree. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-bisect.html">git-bisect(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Find the change that introduced a bug by binary search. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-branch.html">git-branch(1)</a> | |
</dt> | |
<dd> | |
<p> | |
List, create, or delete branches. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-checkout.html">git-checkout(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Checkout and switch to a branch. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-cherry-pick.html">git-cherry-pick(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Apply the change introduced by an existing commit. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-clean.html">git-clean(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Remove untracked files from the working tree. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-clone.html">git-clone(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Clones a repository into a new directory. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-commit.html">git-commit(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Record changes to the repository. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-describe.html">git-describe(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Show the most recent tag that is reachable from a commit. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-diff.html">git-diff(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Show changes between commits, commit and working tree, etc. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-fetch.html">git-fetch(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Download objects and refs from another repository. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-format-patch.html">git-format-patch(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Prepare patches for e-mail submission. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-gc.html">git-gc(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Cleanup unnecessary files and optimize the local repository. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-grep.html">git-grep(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Print lines matching a pattern. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-init.html">git-init(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Create an empty git repository or reinitialize an existing one. | |
</p> | |
</dd> | |
<dt> | |
<a href="gitk.html">gitk(1)</a> | |
</dt> | |
<dd> | |
<p> | |
The git repository browser. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-log.html">git-log(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Show commit logs. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-merge.html">git-merge(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Join two or more development histories together. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-mv.html">git-mv(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Move or rename a file, a directory, or a symlink. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-pull.html">git-pull(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Fetch from and merge with another repository or a local branch. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-push.html">git-push(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Update remote refs along with associated objects. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-rebase.html">git-rebase(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Forward-port local commits to the updated upstream head. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-reset.html">git-reset(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Reset current HEAD to the specified state. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-resolve.html">git-resolve(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Merge two commits. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-revert.html">git-revert(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Revert an existing commit. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-rm.html">git-rm(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Remove files from the working tree and from the index. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-shortlog.html">git-shortlog(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Summarize <em>git log</em> output. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-show.html">git-show(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Show various types of objects. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-status.html">git-status(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Show the working tree status. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-tag.html">git-tag(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Create, list, delete or verify a tag object signed with GPG. | |
</p> | |
</dd> | |
</dl> | |
<h3>Ancillary Commands</h3> | |
<p>Manipulators:</p> | |
<dl> | |
<dt> | |
<a href="git-convert-objects.html">git-convert-objects(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Converts old-style git repository. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-fast-import.html">git-fast-import(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Backend for fast Git data importers.. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-lost-found.html">git-lost-found(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Recover lost refs that luckily have not yet been pruned. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-pack-refs.html">git-pack-refs(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Pack heads and tags for efficient repository access. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-prune.html">git-prune(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Prunes all unreachable objects from the object database. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-reflog.html">git-reflog(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Manage reflog information. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-relink.html">git-relink(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Hardlink common objects in local repositories. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-repack.html">git-repack(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Pack unpacked objects in a repository. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-config.html">git-config(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Get and set repository or global options. | |
</p> | |
</dd> | |
</dl> | |
<p>Interrogators:</p> | |
<dl> | |
<dt> | |
<a href="git-annotate.html">git-annotate(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Annotate file lines with commit info. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-applymbox.html">git-applymbox(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Apply a series of patches in a mailbox. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-blame.html">git-blame(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Show what revision and author last modified each line of a file. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-cherry.html">git-cherry(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Find commits not merged upstream. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-count-objects.html">git-count-objects(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Count unpacked number of objects and their disk consumption. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-fsck.html">git-fsck(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Verifies the connectivity and validity of the objects in the database. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-get-tar-commit-id.html">git-get-tar-commit-id(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Extract commit ID from an archive created using git-tar-tree. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-instaweb.html">git-instaweb(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Instantly browse your working repository in gitweb. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-merge-tree.html">git-merge-tree(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Show three-way merge without touching index. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-rerere.html">git-rerere(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Reuse recorded resolution of conflicted merges. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-rev-parse.html">git-rev-parse(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Pick out and massage parameters. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-runstatus.html">git-runstatus(1)</a> | |
</dt> | |
<dd> | |
<p> | |
A helper for git-status and git-commit. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-show-branch.html">git-show-branch(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Show branches and their commits. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-verify-tag.html">git-verify-tag(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Check the GPG signature of tag. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-whatchanged.html">git-whatchanged(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Show logs with difference each commit introduces. | |
</p> | |
</dd> | |
</dl> | |
<h3>Interacting with Others</h3> | |
<p>These commands are to interact with foreign SCM and with other | |
people via patch over e-mail.</p> | |
<dl> | |
<dt> | |
<a href="git-archimport.html">git-archimport(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Import an Arch repository into git. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-cvsexportcommit.html">git-cvsexportcommit(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Export a single commit to a CVS checkout. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-cvsimport.html">git-cvsimport(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Salvage your data out of another SCM people love to hate. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-cvsserver.html">git-cvsserver(1)</a> | |
</dt> | |
<dd> | |
<p> | |
A CVS server emulator for git. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-imap-send.html">git-imap-send(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Dump a mailbox from stdin into an imap folder. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-quiltimport.html">git-quiltimport(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Applies a quilt patchset onto the current branch. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-request-pull.html">git-request-pull(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Generates a summary of pending changes. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-send-email.html">git-send-email(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Send a collection of patches as emails. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-svn.html">git-svn(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Bidirectional operation between a single Subversion branch and git. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-svnimport.html">git-svnimport(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Import a SVN repository into git. | |
</p> | |
</dd> | |
</dl> | |
</div> | |
<h2>Low-level commands (plumbing)</h2> | |
<div class="sectionbody"> | |
<p>Although git includes its | |
own porcelain layer, its low-level commands are sufficient to support | |
development of alternative porcelains. Developers of such porcelains | |
might start by reading about <a href="git-update-index.html">git-update-index(1)</a> and | |
<a href="git-read-tree.html">git-read-tree(1)</a>.</p> | |
<p>The interface (input, output, set of options and the semantics) | |
to these low-level commands are meant to be a lot more stable | |
than Porcelain level commands, because these commands are | |
primarily for scripted use. The interface to Porcelain commands | |
on the other hand are subject to change in order to improve the | |
end user experience.</p> | |
<p>The following description divides | |
the low-level commands into commands that manipulate objects (in | |
the repository, index, and working tree), commands that interrogate and | |
compare objects, and commands that move objects and references between | |
repositories.</p> | |
<h3>Manipulation commands</h3> | |
<dl> | |
<dt> | |
<a href="git-apply.html">git-apply(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Apply a patch on a git index file and a working tree. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-checkout-index.html">git-checkout-index(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Copy files from the index to the working tree. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-commit-tree.html">git-commit-tree(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Create a new commit object. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-hash-object.html">git-hash-object(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Compute object ID and optionally creates a blob from a file. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-index-pack.html">git-index-pack(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Build pack index file for an existing packed archive. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-merge-file.html">git-merge-file(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Run a three-way file merge. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-merge-index.html">git-merge-index(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Run a merge for files needing merging. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-mktag.html">git-mktag(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Creates a tag object. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-mktree.html">git-mktree(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Build a tree-object from ls-tree formatted text. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-pack-objects.html">git-pack-objects(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Create a packed archive of objects. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-prune-packed.html">git-prune-packed(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Remove extra objects that are already in pack files. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-read-tree.html">git-read-tree(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Reads tree information into the index. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-symbolic-ref.html">git-symbolic-ref(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Read and modify symbolic refs. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-unpack-objects.html">git-unpack-objects(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Unpack objects from a packed archive. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-update-index.html">git-update-index(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Register file contents in the working tree to the index. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-update-ref.html">git-update-ref(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Update the object name stored in a ref safely. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-write-tree.html">git-write-tree(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Create a tree object from the current index. | |
</p> | |
</dd> | |
</dl> | |
<h3>Interrogation commands</h3> | |
<dl> | |
<dt> | |
<a href="git-cat-file.html">git-cat-file(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Provide content or type/size information for repository objects. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-diff-files.html">git-diff-files(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Compares files in the working tree and the index. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-diff-index.html">git-diff-index(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Compares content and mode of blobs between the index and repository. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-diff-stages.html">git-diff-stages(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Compares two merge stages in the index. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-diff-tree.html">git-diff-tree(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Compares the content and mode of blobs found via two tree objects. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-for-each-ref.html">git-for-each-ref(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Output information on each ref. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-ls-files.html">git-ls-files(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Show information about files in the index and the working tree. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-ls-remote.html">git-ls-remote(1)</a> | |
</dt> | |
<dd> | |
<p> | |
List references in a remote repository. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-ls-tree.html">git-ls-tree(1)</a> | |
</dt> | |
<dd> | |
<p> | |
List the contents of a tree object. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-merge-base.html">git-merge-base(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Find as good common ancestors as possible for a merge. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-name-rev.html">git-name-rev(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Find symbolic names for given revs. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-pack-redundant.html">git-pack-redundant(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Find redundant pack files. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-rev-list.html">git-rev-list(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Lists commit objects in reverse chronological order. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-show-index.html">git-show-index(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Show packed archive index. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-show-ref.html">git-show-ref(1)</a> | |
</dt> | |
<dd> | |
<p> | |
List references in a local repository. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-tar-tree.html">git-tar-tree(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Create a tar archive of the files in the named tree object. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-unpack-file.html">git-unpack-file(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Creates a temporary file with a blob's contents. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-var.html">git-var(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Show a git logical variable. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-verify-pack.html">git-verify-pack(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Validate packed git archive files. | |
</p> | |
</dd> | |
</dl> | |
<p>In general, the interrogate commands do not touch the files in | |
the working tree.</p> | |
<h3>Synching repositories</h3> | |
<dl> | |
<dt> | |
<a href="git-daemon.html">git-daemon(1)</a> | |
</dt> | |
<dd> | |
<p> | |
A really simple server for git repositories. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-fetch-pack.html">git-fetch-pack(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Receive missing objects from another repository. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-local-fetch.html">git-local-fetch(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Duplicate another git repository on a local system. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-send-pack.html">git-send-pack(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Push objects over git protocol to another repository. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-ssh-fetch.html">git-ssh-fetch(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Fetch from a remote repository over ssh connection. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-ssh-upload.html">git-ssh-upload(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Push to a remote repository over ssh connection. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-update-server-info.html">git-update-server-info(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Update auxiliary info file to help dumb servers. | |
</p> | |
</dd> | |
</dl> | |
<p>The following are helper programs used by the above; end users | |
typically do not use them directly.</p> | |
<dl> | |
<dt> | |
<a href="git-http-fetch.html">git-http-fetch(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Download from a remote git repository via HTTP. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-http-push.html">git-http-push(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Push objects over HTTP/DAV to another repository. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-parse-remote.html">git-parse-remote(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Routines to help parsing remote repository access parameters. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-receive-pack.html">git-receive-pack(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Receive what is pushed into the repository. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-shell.html">git-shell(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Restricted login shell for GIT-only SSH access. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-upload-archive.html">git-upload-archive(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Send archive back to git-archive. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-upload-pack.html">git-upload-pack(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Send objects packed back to git-fetch-pack. | |
</p> | |
</dd> | |
</dl> | |
<h3>Internal helper commands</h3> | |
<p>These are internal helper commands used by other commands; end | |
users typically do not use them directly.</p> | |
<dl> | |
<dt> | |
<a href="git-applypatch.html">git-applypatch(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Apply one patch extracted from an e-mail. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-check-ref-format.html">git-check-ref-format(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Make sure ref name is well formed. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-fmt-merge-msg.html">git-fmt-merge-msg(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Produce a merge commit message. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-mailinfo.html">git-mailinfo(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Extracts patch and authorship from a single e-mail message. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-mailsplit.html">git-mailsplit(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Simple UNIX mbox splitter program. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-merge-one-file.html">git-merge-one-file(1)</a> | |
</dt> | |
<dd> | |
<p> | |
The standard helper program to use with git-merge-index. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-patch-id.html">git-patch-id(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Compute unique ID for a patch. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-peek-remote.html">git-peek-remote(1)</a> | |
</dt> | |
<dd> | |
<p> | |
List the references in a remote repository. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-sh-setup.html">git-sh-setup(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Common git shell script setup code. | |
</p> | |
</dd> | |
<dt> | |
<a href="git-stripspace.html">git-stripspace(1)</a> | |
</dt> | |
<dd> | |
<p> | |
Filter out empty lines. | |
</p> | |
</dd> | |
</dl> | |
</div> | |
<h2>Configuration Mechanism</h2> | |
<div class="sectionbody"> | |
<p>Starting from 0.99.9 (actually mid 0.99.8.GIT), <tt>.git/config</tt> file | |
is used to hold per-repository configuration options. It is a | |
simple text file modeled after <tt>.ini</tt> format familiar to some | |
people. Here is an example:</p> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><tt># | |
# A '#' or ';' character indicates a comment. | |
# | |
; core variables | |
[core] | |
; Don't trust file modes | |
filemode = false | |
; user identity | |
[user] | |
name = "Junio C Hamano" | |
email = "junkio@twinsun.com" | |
</tt></pre> | |
</div></div> | |
<p>Various commands read from the configuration file and adjust | |
their operation accordingly.</p> | |
</div> | |
<h2>Identifier Terminology</h2> | |
<div class="sectionbody"> | |
<dl> | |
<dt> | |
<object> | |
</dt> | |
<dd> | |
<p> | |
Indicates the object name for any type of object. | |
</p> | |
</dd> | |
<dt> | |
<blob> | |
</dt> | |
<dd> | |
<p> | |
Indicates a blob object name. | |
</p> | |
</dd> | |
<dt> | |
<tree> | |
</dt> | |
<dd> | |
<p> | |
Indicates a tree object name. | |
</p> | |
</dd> | |
<dt> | |
<commit> | |
</dt> | |
<dd> | |
<p> | |
Indicates a commit object name. | |
</p> | |
</dd> | |
<dt> | |
<tree-ish> | |
</dt> | |
<dd> | |
<p> | |
Indicates a tree, commit or tag object name. A | |
command that takes a <tree-ish> argument ultimately wants to | |
operate on a <tree> object but automatically dereferences | |
<commit> and <tag> objects that point at a <tree>. | |
</p> | |
</dd> | |
<dt> | |
<type> | |
</dt> | |
<dd> | |
<p> | |
Indicates that an object type is required. | |
Currently one of: <tt>blob</tt>, <tt>tree</tt>, <tt>commit</tt>, or <tt>tag</tt>. | |
</p> | |
</dd> | |
<dt> | |
<file> | |
</dt> | |
<dd> | |
<p> | |
Indicates a filename - almost always relative to the | |
root of the tree structure <tt>GIT_INDEX_FILE</tt> describes. | |
</p> | |
</dd> | |
</dl> | |
</div> | |
<h2>Symbolic Identifiers</h2> | |
<div class="sectionbody"> | |
<p>Any git command accepting any <object> can also use the following | |
symbolic notation:</p> | |
<dl> | |
<dt> | |
HEAD | |
</dt> | |
<dd> | |
<p> | |
indicates the head of the current branch (i.e. the | |
contents of <tt>$GIT_DIR/HEAD</tt>). | |
</p> | |
</dd> | |
<dt> | |
<tag> | |
</dt> | |
<dd> | |
<p> | |
a valid tag <em>name</em> | |
(i.e. the contents of <tt>$GIT_DIR/refs/tags/<tag></tt>). | |
</p> | |
</dd> | |
<dt> | |
<head> | |
</dt> | |
<dd> | |
<p> | |
a valid head <em>name</em> | |
(i.e. the contents of <tt>$GIT_DIR/refs/heads/<head></tt>). | |
</p> | |
</dd> | |
</dl> | |
<p>For a more complete list of ways to spell object names, see | |
"SPECIFYING REVISIONS" section in <a href="git-rev-parse.html">git-rev-parse(1)</a>.</p> | |
</div> | |
<h2>File/Directory Structure</h2> | |
<div class="sectionbody"> | |
<p>Please see <a href="repository-layout.html">repository layout</a> document.</p> | |
<p>Read <a href="hooks.html">hooks</a> for more details about each hook.</p> | |
<p>Higher level SCMs may provide and manage additional information in the | |
<tt>$GIT_DIR</tt>.</p> | |
</div> | |
<h2>Terminology</h2> | |
<div class="sectionbody"> | |
<p>Please see <a href="glossary.html">glossary</a> document.</p> | |
</div> | |
<h2>Environment Variables</h2> | |
<div class="sectionbody"> | |
<p>Various git commands use the following environment variables:</p> | |
<h3>The git Repository</h3> | |
<p>These environment variables apply to <em>all</em> core git commands. Nb: it | |
is worth noting that they may be used/overridden by SCMS sitting above | |
git so take care if using Cogito etc.</p> | |
<dl> | |
<dt> | |
<em>GIT_INDEX_FILE</em> | |
</dt> | |
<dd> | |
<p> | |
This environment allows the specification of an alternate | |
index file. If not specified, the default of <tt>$GIT_DIR/index</tt> | |
is used. | |
</p> | |
</dd> | |
<dt> | |
<em>GIT_OBJECT_DIRECTORY</em> | |
</dt> | |
<dd> | |
<p> | |
If the object storage directory is specified via this | |
environment variable then the sha1 directories are created | |
underneath - otherwise the default <tt>$GIT_DIR/objects</tt> | |
directory is used. | |
</p> | |
</dd> | |
<dt> | |
<em>GIT_ALTERNATE_OBJECT_DIRECTORIES</em> | |
</dt> | |
<dd> | |
<p> | |
Due to the immutable nature of git objects, old objects can be | |
archived into shared, read-only directories. This variable | |
specifies a ":" separated list of git object directories which | |
can be used to search for git objects. New objects will not be | |
written to these directories. | |
</p> | |
</dd> | |
<dt> | |
<em>GIT_DIR</em> | |
</dt> | |
<dd> | |
<p> | |
If the <em>GIT_DIR</em> environment variable is set then it | |
specifies a path to use instead of the default <tt>.git</tt> | |
for the base of the repository. | |
</p> | |
</dd> | |
</dl> | |
<h3>git Commits</h3> | |
<dl> | |
<dt> | |
<em>GIT_AUTHOR_NAME</em> | |
</dt> | |
<dt> | |
<em>GIT_AUTHOR_EMAIL</em> | |
</dt> | |
<dt> | |
<em>GIT_AUTHOR_DATE</em> | |
</dt> | |
<dt> | |
<em>GIT_COMMITTER_NAME</em> | |
</dt> | |
<dt> | |
<em>GIT_COMMITTER_EMAIL</em> | |
</dt> | |
<dd> | |
<p> | |
see <a href="git-commit-tree.html">git-commit-tree(1)</a> | |
</p> | |
</dd> | |
</dl> | |
<h3>git Diffs</h3> | |
<dl> | |
<dt> | |
<em>GIT_DIFF_OPTS</em> | |
</dt> | |
<dd> | |
<p> | |
Only valid setting is "--unified=??" or "-u??" to set the | |
number of context lines shown when a unified diff is created. | |
This takes precedence over any "-U" or "--unified" option | |
value passed on the git diff command line. | |
</p> | |
</dd> | |
<dt> | |
<em>GIT_EXTERNAL_DIFF</em> | |
</dt> | |
<dd> | |
<p> | |
When the environment variable <em>GIT_EXTERNAL_DIFF</em> is set, the | |
program named by it is called, instead of the diff invocation | |
described above. For a path that is added, removed, or modified, | |
<em>GIT_EXTERNAL_DIFF</em> is called with 7 parameters: | |
</p> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>path old-file old-hex old-mode new-file new-hex new-mode</tt></pre> | |
</div></div> | |
<p>where:</p> | |
<div class="hlist"><table> | |
<tr> | |
<td class="hlist1"> | |
<old|new>-file | |
</td> | |
<td class="hlist2"> | |
are files GIT_EXTERNAL_DIFF can use to read the | |
contents of <old|new>, | |
</td> | |
</tr> | |
<tr> | |
<td class="hlist1"> | |
<old|new>-hex | |
</td> | |
<td class="hlist2"> | |
are the 40-hexdigit SHA1 hashes, | |
</td> | |
</tr> | |
<tr> | |
<td class="hlist1"> | |
<old|new>-mode | |
</td> | |
<td class="hlist2"> | |
are the octal representation of the file modes. | |
</td> | |
</tr> | |
</table></div> | |
<p>The file parameters can point at the user's working file | |
(e.g. <tt>new-file</tt> in "git-diff-files"), <tt>/dev/null</tt> (e.g. <tt>old-file</tt> | |
when a new file is added), or a temporary file (e.g. <tt>old-file</tt> in the | |
index). <em>GIT_EXTERNAL_DIFF</em> should not worry about unlinking the | |
temporary file --- it is removed when <em>GIT_EXTERNAL_DIFF</em> exits.</p> | |
<p>For a path that is unmerged, <em>GIT_EXTERNAL_DIFF</em> is called with 1 | |
parameter, <path>.</p> | |
</dd> | |
</dl> | |
<h3>other</h3> | |
<dl> | |
<dt> | |
<em>GIT_PAGER</em> | |
</dt> | |
<dd> | |
<p> | |
This environment variable overrides <tt>$PAGER</tt>. | |
</p> | |
</dd> | |
<dt> | |
<em>GIT_TRACE</em> | |
</dt> | |
<dd> | |
<p> | |
If this variable is set to "1", "2" or "true" (comparison | |
is case insensitive), git will print <tt>trace:</tt> messages on | |
stderr telling about alias expansion, built-in command | |
execution and external command execution. | |
If this variable is set to an integer value greater than 1 | |
and lower than 10 (strictly) then git will interpret this | |
value as an open file descriptor and will try to write the | |
trace messages into this file descriptor. | |
Alternatively, if this variable is set to an absolute path | |
(starting with a <em>/</em> character), git will interpret this | |
as a file path and will try to write the trace messages | |
into it. | |
</p> | |
</dd> | |
</dl> | |
</div> | |
<h2>Discussion<a id="Discussion"></a></h2> | |
<div class="sectionbody"> | |
<p>"git" can mean anything, depending on your mood.</p> | |
<ul> | |
<li> | |
<p> | |
random three-letter combination that is pronounceable, and not | |
actually used by any common UNIX command. The fact that it is a | |
mispronunciation of "get" may or may not be relevant. | |
</p> | |
</li> | |
<li> | |
<p> | |
stupid. contemptible and despicable. simple. Take your pick from the | |
dictionary of slang. | |
</p> | |
</li> | |
<li> | |
<p> | |
"global information tracker": you're in a good mood, and it actually | |
works for you. Angels sing, and a light suddenly fills the room. | |
</p> | |
</li> | |
<li> | |
<p> | |
"goddamn idiotic truckload of sh*t": when it breaks | |
</p> | |
</li> | |
</ul> | |
<p>This is a (not so) stupid but extremely fast directory content manager. | |
It doesn't do a whole lot at its core, but what it <em>does</em> do is track | |
directory contents efficiently.</p> | |
<p>There are two object abstractions: the "object database", and the | |
"current directory cache" aka "index".</p> | |
<h3>The Object Database</h3> | |
<p>The object database is literally just a content-addressable collection | |
of objects. All objects are named by their content, which is | |
approximated by the SHA1 hash of the object itself. Objects may refer | |
to other objects (by referencing their SHA1 hash), and so you can | |
build up a hierarchy of objects.</p> | |
<p>All objects have a statically determined "type" aka "tag", which is | |
determined at object creation time, and which identifies the format of | |
the object (i.e. how it is used, and how it can refer to other | |
objects). There are currently four different object types: "blob", | |
"tree", "commit" and "tag".</p> | |
<p>A "blob" object cannot refer to any other object, and is, like the type | |
implies, a pure storage object containing some user data. It is used to | |
actually store the file data, i.e. a blob object is associated with some | |
particular version of some file.</p> | |
<p>A "tree" object is an object that ties one or more "blob" objects into a | |
directory structure. In addition, a tree object can refer to other tree | |
objects, thus creating a directory hierarchy.</p> | |
<p>A "commit" object ties such directory hierarchies together into | |
a DAG of revisions - each "commit" is associated with exactly one tree | |
(the directory hierarchy at the time of the commit). In addition, a | |
"commit" refers to one or more "parent" commit objects that describe the | |
history of how we arrived at that directory hierarchy.</p> | |
<p>As a special case, a commit object with no parents is called the "root" | |
object, and is the point of an initial project commit. Each project | |
must have at least one root, and while you can tie several different | |
root objects together into one project by creating a commit object which | |
has two or more separate roots as its ultimate parents, that's probably | |
just going to confuse people. So aim for the notion of "one root object | |
per project", even if git itself does not enforce that.</p> | |
<p>A "tag" object symbolically identifies and can be used to sign other | |
objects. It contains the identifier and type of another object, a | |
symbolic name (of course!) and, optionally, a signature.</p> | |
<p>Regardless of object type, all objects share the following | |
characteristics: they are all deflated with zlib, and have a header | |
that not only specifies their type, but also provides size information | |
about the data in the object. It's worth noting that the SHA1 hash | |
that is used to name the object is the hash of the original data | |
plus this header, so <tt>sha1sum</tt> <em>file</em> does not match the object name | |
for <em>file</em>. | |
(Historical note: in the dawn of the age of git the hash | |
was the sha1 of the <em>compressed</em> object.)</p> | |
<p>As a result, the general consistency of an object can always be tested | |
independently of the contents or the type of the object: all objects can | |
be validated by verifying that (a) their hashes match the content of the | |
file and (b) the object successfully inflates to a stream of bytes that | |
forms a sequence of <ascii type without space> + <space> + <ascii decimal | |
size> + <byte\0> + <binary object data>.</p> | |
<p>The structured objects can further have their structure and | |
connectivity to other objects verified. This is generally done with | |
the <tt>git-fsck</tt> program, which generates a full dependency graph | |
of all objects, and verifies their internal consistency (in addition | |
to just verifying their superficial consistency through the hash).</p> | |
<p>The object types in some more detail:</p> | |
<h3>Blob Object</h3> | |
<p>A "blob" object is nothing but a binary blob of data, and doesn't | |
refer to anything else. There is no signature or any other | |
verification of the data, so while the object is consistent (it <em>is</em> | |
indexed by its sha1 hash, so the data itself is certainly correct), it | |
has absolutely no other attributes. No name associations, no | |
permissions. It is purely a blob of data (i.e. normally "file | |
contents").</p> | |
<p>In particular, since the blob is entirely defined by its data, if two | |
files in a directory tree (or in multiple different versions of the | |
repository) have the same contents, they will share the same blob | |
object. The object is totally independent of its location in the | |
directory tree, and renaming a file does not change the object that | |
file is associated with in any way.</p> | |
<p>A blob is typically created when <a href="git-update-index.html">git-update-index(1)</a> | |
is run, and its data can be accessed by <a href="git-cat-file.html">git-cat-file(1)</a>.</p> | |
<h3>Tree Object</h3> | |
<p>The next hierarchical object type is the "tree" object. A tree object | |
is a list of mode/name/blob data, sorted by name. Alternatively, the | |
mode data may specify a directory mode, in which case instead of | |
naming a blob, that name is associated with another TREE object.</p> | |
<p>Like the "blob" object, a tree object is uniquely determined by the | |
set contents, and so two separate but identical trees will always | |
share the exact same object. This is true at all levels, i.e. it's | |
true for a "leaf" tree (which does not refer to any other trees, only | |
blobs) as well as for a whole subdirectory.</p> | |
<p>For that reason a "tree" object is just a pure data abstraction: it | |
has no history, no signatures, no verification of validity, except | |
that since the contents are again protected by the hash itself, we can | |
trust that the tree is immutable and its contents never change.</p> | |
<p>So you can trust the contents of a tree to be valid, the same way you | |
can trust the contents of a blob, but you don't know where those | |
contents <em>came</em> from.</p> | |
<p>Side note on trees: since a "tree" object is a sorted list of | |
"filename+content", you can create a diff between two trees without | |
actually having to unpack two trees. Just ignore all common parts, | |
and your diff will look right. In other words, you can effectively | |
(and efficiently) tell the difference between any two random trees by | |
O(n) where "n" is the size of the difference, rather than the size of | |
the tree.</p> | |
<p>Side note 2 on trees: since the name of a "blob" depends entirely and | |
exclusively on its contents (i.e. there are no names or permissions | |
involved), you can see trivial renames or permission changes by | |
noticing that the blob stayed the same. However, renames with data | |
changes need a smarter "diff" implementation.</p> | |
<p>A tree is created with <a href="git-write-tree.html">git-write-tree(1)</a> and | |
its data can be accessed by <a href="git-ls-tree.html">git-ls-tree(1)</a>. | |
Two trees can be compared with <a href="git-diff-tree.html">git-diff-tree(1)</a>.</p> | |
<h3>Commit Object</h3> | |
<p>The "commit" object is an object that introduces the notion of | |
history into the picture. In contrast to the other objects, it | |
doesn't just describe the physical state of a tree, it describes how | |
we got there, and why.</p> | |
<p>A "commit" is defined by the tree-object that it results in, the | |
parent commits (zero, one or more) that led up to that point, and a | |
comment on what happened. Again, a commit is not trusted per se: | |
the contents are well-defined and "safe" due to the cryptographically | |
strong signatures at all levels, but there is no reason to believe | |
that the tree is "good" or that the merge information makes sense. | |
The parents do not have to actually have any relationship with the | |
result, for example.</p> | |
<p>Note on commits: unlike real SCM's, commits do not contain | |
rename information or file mode change information. All of that is | |
implicit in the trees involved (the result tree, and the result trees | |
of the parents), and describing that makes no sense in this idiotic | |
file manager.</p> | |
<p>A commit is created with <a href="git-commit-tree.html">git-commit-tree(1)</a> and | |
its data can be accessed by <a href="git-cat-file.html">git-cat-file(1)</a>.</p> | |
<h3>Trust</h3> | |
<p>An aside on the notion of "trust". Trust is really outside the scope | |
of "git", but it's worth noting a few things. First off, since | |
everything is hashed with SHA1, you <em>can</em> trust that an object is | |
intact and has not been messed with by external sources. So the name | |
of an object uniquely identifies a known state - just not a state that | |
you may want to trust.</p> | |
<p>Furthermore, since the SHA1 signature of a commit refers to the | |
SHA1 signatures of the tree it is associated with and the signatures | |
of the parent, a single named commit specifies uniquely a whole set | |
of history, with full contents. You can't later fake any step of the | |
way once you have the name of a commit.</p> | |
<p>So to introduce some real trust in the system, the only thing you need | |
to do is to digitally sign just <em>one</em> special note, which includes the | |
name of a top-level commit. Your digital signature shows others | |
that you trust that commit, and the immutability of the history of | |
commits tells others that they can trust the whole history.</p> | |
<p>In other words, you can easily validate a whole archive by just | |
sending out a single email that tells the people the name (SHA1 hash) | |
of the top commit, and digitally sign that email using something | |
like GPG/PGP.</p> | |
<p>To assist in this, git also provides the tag object…</p> | |
<h3>Tag Object</h3> | |
<p>Git provides the "tag" object to simplify creating, managing and | |
exchanging symbolic and signed tokens. The "tag" object at its | |
simplest simply symbolically identifies another object by containing | |
the sha1, type and symbolic name.</p> | |
<p>However it can optionally contain additional signature information | |
(which git doesn't care about as long as there's less than 8k of | |
it). This can then be verified externally to git.</p> | |
<p>Note that despite the tag features, "git" itself only handles content | |
integrity; the trust framework (and signature provision and | |
verification) has to come from outside.</p> | |
<p>A tag is created with <a href="git-mktag.html">git-mktag(1)</a>, | |
its data can be accessed by <a href="git-cat-file.html">git-cat-file(1)</a>, | |
and the signature can be verified by | |
<a href="git-verify-tag.html">git-verify-tag(1)</a>.</p> | |
</div> | |
<h2>The "index" aka "Current Directory Cache"</h2> | |
<div class="sectionbody"> | |
<p>The index is a simple binary file, which contains an efficient | |
representation of a virtual directory content at some random time. It | |
does so by a simple array that associates a set of names, dates, | |
permissions and content (aka "blob") objects together. The cache is | |
always kept ordered by name, and names are unique (with a few very | |
specific rules) at any point in time, but the cache has no long-term | |
meaning, and can be partially updated at any time.</p> | |
<p>In particular, the index certainly does not need to be consistent with | |
the current directory contents (in fact, most operations will depend on | |
different ways to make the index <em>not</em> be consistent with the directory | |
hierarchy), but it has three very important attributes:</p> | |
<p><em>(a) it can re-generate the full state it caches (not just the | |
directory structure: it contains pointers to the "blob" objects so | |
that it can regenerate the data too)</em></p> | |
<p>As a special case, there is a clear and unambiguous one-way mapping | |
from a current directory cache to a "tree object", which can be | |
efficiently created from just the current directory cache without | |
actually looking at any other data. So a directory cache at any one | |
time uniquely specifies one and only one "tree" object (but has | |
additional data to make it easy to match up that tree object with what | |
has happened in the directory)</p> | |
<p><em>(b) it has efficient methods for finding inconsistencies between that | |
cached state ("tree object waiting to be instantiated") and the | |
current state.</em></p> | |
<p><em>(c) it can additionally efficiently represent information about merge | |
conflicts between different tree objects, allowing each pathname to be | |
associated with sufficient information about the trees involved that | |
you can create a three-way merge between them.</em></p> | |
<p>Those are the three ONLY things that the directory cache does. It's a | |
cache, and the normal operation is to re-generate it completely from a | |
known tree object, or update/compare it with a live tree that is being | |
developed. If you blow the directory cache away entirely, you generally | |
haven't lost any information as long as you have the name of the tree | |
that it described.</p> | |
<p>At the same time, the index is at the same time also the | |
staging area for creating new trees, and creating a new tree always | |
involves a controlled modification of the index file. In particular, | |
the index file can have the representation of an intermediate tree that | |
has not yet been instantiated. So the index can be thought of as a | |
write-back cache, which can contain dirty information that has not yet | |
been written back to the backing store.</p> | |
</div> | |
<h2>The Workflow</h2> | |
<div class="sectionbody"> | |
<p>Generally, all "git" operations work on the index file. Some operations | |
work <strong>purely</strong> on the index file (showing the current state of the | |
index), but most operations move data to and from the index file. Either | |
from the database or from the working directory. Thus there are four | |
main combinations:</p> | |
<h3>1) working directory -> index</h3> | |
<p>You update the index with information from the working directory with | |
the <a href="git-update-index.html">git-update-index(1)</a> command. You | |
generally update the index information by just specifying the filename | |
you want to update, like so:</p> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>git-update-index filename</tt></pre> | |
</div></div> | |
<p>but to avoid common mistakes with filename globbing etc, the command | |
will not normally add totally new entries or remove old entries, | |
i.e. it will normally just update existing cache entries.</p> | |
<p>To tell git that yes, you really do realize that certain files no | |
longer exist, or that new files should be added, you | |
should use the <tt>--remove</tt> and <tt>--add</tt> flags respectively.</p> | |
<p>NOTE! A <tt>--remove</tt> flag does <em>not</em> mean that subsequent filenames will | |
necessarily be removed: if the files still exist in your directory | |
structure, the index will be updated with their new status, not | |
removed. The only thing <tt>--remove</tt> means is that update-cache will be | |
considering a removed file to be a valid thing, and if the file really | |
does not exist any more, it will update the index accordingly.</p> | |
<p>As a special case, you can also do <tt>git-update-index --refresh</tt>, which | |
will refresh the "stat" information of each index to match the current | |
stat information. It will <em>not</em> update the object status itself, and | |
it will only update the fields that are used to quickly test whether | |
an object still matches its old backing store object.</p> | |
<h3>2) index -> object database</h3> | |
<p>You write your current index file to a "tree" object with the program</p> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>git-write-tree</tt></pre> | |
</div></div> | |
<p>that doesn't come with any options - it will just write out the | |
current index into the set of tree objects that describe that state, | |
and it will return the name of the resulting top-level tree. You can | |
use that tree to re-generate the index at any time by going in the | |
other direction:</p> | |
<h3>3) object database -> index</h3> | |
<p>You read a "tree" file from the object database, and use that to | |
populate (and overwrite - don't do this if your index contains any | |
unsaved state that you might want to restore later!) your current | |
index. Normal operation is just</p> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>git-read-tree <sha1 of tree></tt></pre> | |
</div></div> | |
<p>and your index file will now be equivalent to the tree that you saved | |
earlier. However, that is only your <em>index</em> file: your working | |
directory contents have not been modified.</p> | |
<h3>4) index -> working directory</h3> | |
<p>You update your working directory from the index by "checking out" | |
files. This is not a very common operation, since normally you'd just | |
keep your files updated, and rather than write to your working | |
directory, you'd tell the index files about the changes in your | |
working directory (i.e. <tt>git-update-index</tt>).</p> | |
<p>However, if you decide to jump to a new version, or check out somebody | |
else's version, or just restore a previous tree, you'd populate your | |
index file with read-tree, and then you need to check out the result | |
with</p> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>git-checkout-index filename</tt></pre> | |
</div></div> | |
<p>or, if you want to check out all of the index, use <tt>-a</tt>.</p> | |
<p>NOTE! git-checkout-index normally refuses to overwrite old files, so | |
if you have an old version of the tree already checked out, you will | |
need to use the "-f" flag (<em>before</em> the "-a" flag or the filename) to | |
<em>force</em> the checkout.</p> | |
<p>Finally, there are a few odds and ends which are not purely moving | |
from one representation to the other:</p> | |
<h3>5) Tying it all together</h3> | |
<p>To commit a tree you have instantiated with "git-write-tree", you'd | |
create a "commit" object that refers to that tree and the history | |
behind it - most notably the "parent" commits that preceded it in | |
history.</p> | |
<p>Normally a "commit" has one parent: the previous state of the tree | |
before a certain change was made. However, sometimes it can have two | |
or more parent commits, in which case we call it a "merge", due to the | |
fact that such a commit brings together ("merges") two or more | |
previous states represented by other commits.</p> | |
<p>In other words, while a "tree" represents a particular directory state | |
of a working directory, a "commit" represents that state in "time", | |
and explains how we got there.</p> | |
<p>You create a commit object by giving it the tree that describes the | |
state at the time of the commit, and a list of parents:</p> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>git-commit-tree <tree> -p <parent> [-p <parent2> ..]</tt></pre> | |
</div></div> | |
<p>and then giving the reason for the commit on stdin (either through | |
redirection from a pipe or file, or by just typing it at the tty).</p> | |
<p>git-commit-tree will return the name of the object that represents | |
that commit, and you should save it away for later use. Normally, | |
you'd commit a new <tt>HEAD</tt> state, and while git doesn't care where you | |
save the note about that state, in practice we tend to just write the | |
result to the file pointed at by <tt>.git/HEAD</tt>, so that we can always see | |
what the last committed state was.</p> | |
<p>Here is an ASCII art by Jon Loeliger that illustrates how | |
various pieces fit together.</p> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><tt> | |
commit-tree | |
commit obj | |
+----+ | |
| | | |
| | | |
V V | |
+-----------+ | |
| Object DB | | |
| Backing | | |
| Store | | |
+-----------+ | |
^ | |
write-tree | | | |
tree obj | | | |
| | read-tree | |
| | tree obj | |
V | |
+-----------+ | |
| Index | | |
| "cache" | | |
+-----------+ | |
update-index ^ | |
blob obj | | | |
| | | |
checkout-index -u | | checkout-index | |
stat | | blob obj | |
V | |
+-----------+ | |
| Working | | |
| Directory | | |
+-----------+ | |
</tt></pre> | |
</div></div> | |
<h3>6) Examining the data</h3> | |
<p>You can examine the data represented in the object database and the | |
index with various helper tools. For every object, you can use | |
<a href="git-cat-file.html">git-cat-file(1)</a> to examine details about the | |
object:</p> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>git-cat-file -t <objectname></tt></pre> | |
</div></div> | |
<p>shows the type of the object, and once you have the type (which is | |
usually implicit in where you find the object), you can use</p> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>git-cat-file blob|tree|commit|tag <objectname></tt></pre> | |
</div></div> | |
<p>to show its contents. NOTE! Trees have binary content, and as a result | |
there is a special helper for showing that content, called | |
<tt>git-ls-tree</tt>, which turns the binary content into a more easily | |
readable form.</p> | |
<p>It's especially instructive to look at "commit" objects, since those | |
tend to be small and fairly self-explanatory. In particular, if you | |
follow the convention of having the top commit name in <tt>.git/HEAD</tt>, | |
you can do</p> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>git-cat-file commit HEAD</tt></pre> | |
</div></div> | |
<p>to see what the top commit was.</p> | |
<h3>7) Merging multiple trees</h3> | |
<p>Git helps you do a three-way merge, which you can expand to n-way by | |
repeating the merge procedure arbitrary times until you finally | |
"commit" the state. The normal situation is that you'd only do one | |
three-way merge (two parents), and commit it, but if you like to, you | |
can do multiple parents in one go.</p> | |
<p>To do a three-way merge, you need the two sets of "commit" objects | |
that you want to merge, use those to find the closest common parent (a | |
third "commit" object), and then use those commit objects to find the | |
state of the directory ("tree" object) at these points.</p> | |
<p>To get the "base" for the merge, you first look up the common parent | |
of two commits with</p> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>git-merge-base <commit1> <commit2></tt></pre> | |
</div></div> | |
<p>which will return you the commit they are both based on. You should | |
now look up the "tree" objects of those commits, which you can easily | |
do with (for example)</p> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>git-cat-file commit <commitname> | head -1</tt></pre> | |
</div></div> | |
<p>since the tree object information is always the first line in a commit | |
object.</p> | |
<p>Once you know the three trees you are going to merge (the one | |
"original" tree, aka the common case, and the two "result" trees, aka | |
the branches you want to merge), you do a "merge" read into the | |
index. This will complain if it has to throw away your old index contents, so you should | |
make sure that you've committed those - in fact you would normally | |
always do a merge against your last commit (which should thus match | |
what you have in your current index anyway).</p> | |
<p>To do the merge, do</p> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>git-read-tree -m -u <origtree> <yourtree> <targettree></tt></pre> | |
</div></div> | |
<p>which will do all trivial merge operations for you directly in the | |
index file, and you can just write the result out with | |
<tt>git-write-tree</tt>.</p> | |
<p>Historical note. We did not have <tt>-u</tt> facility when this | |
section was first written, so we used to warn that | |
the merge is done in the index file, not in your | |
working tree, and your working tree will not match your | |
index after this step. | |
This is no longer true. The above command, thanks to <tt>-u</tt> | |
option, updates your working tree with the merge results for | |
paths that have been trivially merged.</p> | |
<h3>8) Merging multiple trees, continued</h3> | |
<p>Sadly, many merges aren't trivial. If there are files that have | |
been added.moved or removed, or if both branches have modified the | |
same file, you will be left with an index tree that contains "merge | |
entries" in it. Such an index tree can <em>NOT</em> be written out to a tree | |
object, and you will have to resolve any such merge clashes using | |
other tools before you can write out the result.</p> | |
<p>You can examine such index state with <tt>git-ls-files --unmerged</tt> | |
command. An example:</p> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><tt>$ git-read-tree -m $orig HEAD $target | |
$ git-ls-files --unmerged | |
100644 263414f423d0e4d70dae8fe53fa34614ff3e2860 1 hello.c | |
100644 06fa6a24256dc7e560efa5687fa84b51f0263c3a 2 hello.c | |
100644 cc44c73eb783565da5831b4d820c962954019b69 3 hello.c</tt></pre> | |
</div></div> | |
<p>Each line of the <tt>git-ls-files --unmerged</tt> output begins with | |
the blob mode bits, blob SHA1, <em>stage number</em>, and the | |
filename. The <em>stage number</em> is git's way to say which tree it | |
came from: stage 1 corresponds to <tt>$orig</tt> tree, stage 2 <tt>HEAD</tt> | |
tree, and stage3 <tt>$target</tt> tree.</p> | |
<p>Earlier we said that trivial merges are done inside | |
<tt>git-read-tree -m</tt>. For example, if the file did not change | |
from <tt>$orig</tt> to <tt>HEAD</tt> nor <tt>$target</tt>, or if the file changed | |
from <tt>$orig</tt> to <tt>HEAD</tt> and <tt>$orig</tt> to <tt>$target</tt> the same way, | |
obviously the final outcome is what is in <tt>HEAD</tt>. What the | |
above example shows is that file <tt>hello.c</tt> was changed from | |
<tt>$orig</tt> to <tt>HEAD</tt> and <tt>$orig</tt> to <tt>$target</tt> in a different way. | |
You could resolve this by running your favorite 3-way merge | |
program, e.g. <tt>diff3</tt> or <tt>merge</tt>, on the blob objects from | |
these three stages yourself, like this:</p> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><tt>$ git-cat-file blob 263414f... >hello.c~1 | |
$ git-cat-file blob 06fa6a2... >hello.c~2 | |
$ git-cat-file blob cc44c73... >hello.c~3 | |
$ merge hello.c~2 hello.c~1 hello.c~3</tt></pre> | |
</div></div> | |
<p>This would leave the merge result in <tt>hello.c~2</tt> file, along | |
with conflict markers if there are conflicts. After verifying | |
the merge result makes sense, you can tell git what the final | |
merge result for this file is by:</p> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>mv -f hello.c~2 hello.c | |
git-update-index hello.c</tt></pre> | |
</div></div> | |
<p>When a path is in unmerged state, running <tt>git-update-index</tt> for | |
that path tells git to mark the path resolved.</p> | |
<p>The above is the description of a git merge at the lowest level, | |
to help you understand what conceptually happens under the hood. | |
In practice, nobody, not even git itself, uses three <tt>git-cat-file</tt> | |
for this. There is <tt>git-merge-index</tt> program that extracts the | |
stages to temporary files and calls a "merge" script on it:</p> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>git-merge-index git-merge-one-file hello.c</tt></pre> | |
</div></div> | |
<p>and that is what higher level <tt>git resolve</tt> is implemented with.</p> | |
</div> | |
<h2>Authors</h2> | |
<div class="sectionbody"> | |
<ul> | |
<li> | |
<p> | |
git's founding father is Linus Torvalds <torvalds@osdl.org>. | |
</p> | |
</li> | |
<li> | |
<p> | |
The current git nurse is Junio C Hamano <junkio@cox.net>. | |
</p> | |
</li> | |
<li> | |
<p> | |
The git potty was written by Andres Ericsson <ae@op5.se>. | |
</p> | |
</li> | |
<li> | |
<p> | |
General upbringing is handled by the git-list <git@vger.kernel.org>. | |
</p> | |
</li> | |
</ul> | |
</div> | |
<h2>Documentation</h2> | |
<div class="sectionbody"> | |
<p>The documentation for git suite was started by David Greaves | |
<david@dgreaves.com>, and later enhanced greatly by the | |
contributors on the git-list <git@vger.kernel.org>.</p> | |
</div> | |
<h2>GIT</h2> | |
<div class="sectionbody"> | |
<p>Part of the <a href="git.html">git(7)</a> suite</p> | |
</div> | |
<div id="footer"> | |
<div id="footer-text"> | |
Last updated 09-Feb-2007 08:38:38 UTC | |
</div> | |
</div> | |
</body> | |
</html> |