| This file contains reference information for the core git commands. |
| |
| The README contains much useful definition and clarification |
| info - read that first. And of the commands, I suggest reading |
| 'git-update-cache' and 'git-read-tree' first - I wish I had! |
| |
| David Greaves <david@dgreaves.com> |
| 24/4/05 |
| |
| Updated by Junio C Hamano <junkio@cox.net> on 2005-05-05 to |
| reflect recent changes. |
| |
| Identifier terminology used: |
| |
| <object> |
| Indicates any object sha1 identifier |
| |
| <blob> |
| Indicates a blob object sha1 identifier |
| |
| <tree> |
| Indicates a tree object sha1 identifier |
| |
| <commit> |
| Indicates a commit object sha1 identifier |
| |
| <tree-ish> |
| Indicates a tree, commit or tag object sha1 identifier. |
| A command that takes a <tree-ish> argument ultimately |
| wants to operate on a <tree> object but automatically |
| dereferences <commit> and <tag> that points at a |
| <tree>. |
| |
| <type> |
| Indicates that an object type is required. |
| Currently one of: blob/tree/commit/tag |
| |
| <file> |
| Indicates a filename - always relative to the root of |
| the tree structure GIT_INDEX_FILE describes. |
| |
| |
| ################################################################ |
| git-apply-patch-script |
| |
| This is a sample script to be used as GIT_EXTERNAL_DIFF to apply |
| differences git-diff-* family of commands reports to the current |
| work tree. |
| |
| |
| ################################################################ |
| git-cat-file |
| git-cat-file (-t | <type>) <object> |
| |
| Provides contents or type of objects in the repository. The type |
| is required if -t is not being used to find the object type. |
| |
| <object> |
| The sha1 identifier of the object. |
| |
| -t |
| Instead of the content, show the object type identified |
| by <object>. |
| |
| <type> |
| Typically this matches the real type of <object> but |
| asking for type that can trivially dereferenced from the |
| given <object> is also permitted. An example is to ask |
| "tree" with <object> for a commit object that contains |
| it, or to ask "blob" with <object> for a tag object that |
| points at it. |
| |
| Output |
| |
| If -t is specified, one of the <type>. |
| |
| Otherwise the raw (though uncompressed) contents of the <object> will |
| be returned. |
| |
| |
| ################################################################ |
| git-check-files |
| git-check-files <file>... |
| |
| Check that a list of files are up-to-date between the filesystem and |
| the cache. Used to verify a patch target before doing a patch. |
| |
| Files that do not exist on the filesystem are considered up-to-date |
| (whether or not they are in the cache). |
| |
| Emits an error message on failure. |
| preparing to update existing file <file> not in cache |
| <file> exists but is not in the cache |
| |
| preparing to update file <file> not uptodate in cache |
| <file> on disk is not up-to-date with the cache |
| |
| Exits with a status code indicating success if all files are |
| up-to-date. |
| |
| see also: git-update-cache |
| |
| |
| ################################################################ |
| git-checkout-cache |
| git-checkout-cache [-q] [-a] [-f] [-n] [--prefix=<string>] |
| [--] <file>... |
| |
| Will copy all files listed from the cache to the working directory |
| (not overwriting existing files). |
| |
| -q |
| be quiet if files exist or are not in the cache |
| |
| -f |
| forces overwrite of existing files |
| |
| -a |
| checks out all files in the cache (will then continue to |
| process listed files). |
| |
| -n |
| Don't checkout new files, only refresh files already checked |
| out. |
| |
| --prefix=<string> |
| When creating files, prepend <string> (usually a directory |
| including a trailing /) |
| |
| -- |
| Do not interpret any more arguments as options. |
| |
| Note that the order of the flags matters: |
| |
| git-checkout-cache -a -f file.c |
| |
| will first check out all files listed in the cache (but not overwrite |
| any old ones), and then force-checkout file.c a second time (ie that |
| one _will_ overwrite any old contents with the same filename). |
| |
| Also, just doing "git-checkout-cache" does nothing. You probably meant |
| "git-checkout-cache -a". And if you want to force it, you want |
| "git-checkout-cache -f -a". |
| |
| Intuitiveness is not the goal here. Repeatability is. The reason for |
| the "no arguments means no work" thing is that from scripts you are |
| supposed to be able to do things like |
| |
| find . -name '*.h' -print0 | xargs -0 git-checkout-cache -f -- |
| |
| which will force all existing *.h files to be replaced with their |
| cached copies. If an empty command line implied "all", then this would |
| force-refresh everything in the cache, which was not the point. |
| |
| To update and refresh only the files already checked out: |
| |
| git-checkout-cache -n -f -a && git-update-cache --ignore-missing --refresh |
| |
| Oh, and the "--" is just a good idea when you know the rest will be |
| filenames. Just so that you wouldn't have a filename of "-a" causing |
| problems (not possible in the above example, but get used to it in |
| scripting!). |
| |
| The prefix ability basically makes it trivial to use git-checkout-cache as |
| a "git-export as tree" function. Just read the desired tree into the |
| index, and do a |
| |
| git-checkout-cache --prefix=git-export-dir/ -a |
| |
| and git-checkout-cache will "git-export" the cache into the specified |
| directory. |
| |
| NOTE! The final "/" is important. The git-exported name is literally just |
| prefixed with the specified string, so you can also do something like |
| |
| git-checkout-cache --prefix=.merged- Makefile |
| |
| to check out the currently cached copy of "Makefile" into the file |
| ".merged-Makefile". |
| |
| |
| ################################################################ |
| git-commit-tree |
| git-commit-tree <tree> [-p <parent commit>]* < changelog |
| |
| Creates a new commit object based on the provided tree object and |
| emits the new commit object id on stdout. If no parent is given then |
| it is considered to be an initial tree. |
| |
| A commit object usually has 1 parent (a commit after a change) or up |
| to 16 parents. More than one parent represents a merge of branches |
| that led to them. |
| |
| While a tree represents a particular directory state of a working |
| directory, a commit represents that state in "time", and explains how |
| to get there. |
| |
| Normally a commit would identify a new "HEAD" 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 ".git/HEAD", so that we can |
| always see what the last committed state was. |
| |
| Options |
| |
| <tree> |
| An existing tree object |
| |
| -p <parent commit> |
| Each -p indicates a the id of a parent commit object. |
| |
| |
| Commit Information |
| |
| A commit encapsulates: |
| all parent object ids |
| author name, email and date |
| committer name and email and the commit time. |
| |
| If not provided, git-commit-tree uses your name, hostname and domain to |
| provide author and committer info. This can be overridden using the |
| following environment variables. |
| AUTHOR_NAME |
| AUTHOR_EMAIL |
| AUTHOR_DATE |
| COMMIT_AUTHOR_NAME |
| COMMIT_AUTHOR_EMAIL |
| (nb <,> and '\n's are stripped) |
| |
| A commit comment is read from stdin (max 999 chars). If a changelog |
| entry is not provided via '<' redirection, git-commit-tree will just wait |
| for one to be entered and terminated with ^D |
| |
| see also: git-write-tree |
| |
| |
| ################################################################ |
| git-convert-cache |
| |
| Converts old-style GIT repository to the latest. |
| |
| |
| ################################################################ |
| git-diff-cache |
| git-diff-cache [-p] [-r] [-z] [--cached] <tree-ish> |
| |
| Compares the content and mode of the blobs found via a tree object |
| with the content of the current cache and, optionally ignoring the |
| stat state of the file on disk. |
| |
| <tree-ish> |
| The id of a tree object to diff against. |
| |
| -p |
| Generate patch (see section on generating patches) |
| |
| -r |
| This flag does not mean anything. It is there only to match |
| git-diff-tree. Unlike git-diff-tree, git-diff-cache always looks |
| at all the subdirectories. |
| |
| -z |
| \0 line termination on output |
| |
| --cached |
| do not consider the on-disk file at all |
| |
| Output format: |
| |
| See "Output format from git-diff-cache, git-diff-tree and git-diff-files" |
| section. |
| |
| Operating Modes |
| |
| You can choose whether you want to trust the index file entirely |
| (using the "--cached" flag) or ask the diff logic to show any files |
| that don't match the stat state as being "tentatively changed". Both |
| of these operations are very useful indeed. |
| |
| Cached Mode |
| |
| If --cached is specified, it allows you to ask: |
| |
| show me the differences between HEAD and the current index |
| contents (the ones I'd write with a "git-write-tree") |
| |
| For example, let's say that you have worked on your index file, and are |
| ready to commit. You want to see eactly _what_ you are going to commit is |
| without having to write a new tree object and compare it that way, and to |
| do that, you just do |
| |
| git-diff-cache --cached $(cat .git/HEAD) |
| |
| Example: let's say I had renamed "commit.c" to "git-commit.c", and I had |
| done an "git-update-cache" to make that effective in the index file. |
| "git-diff-files" wouldn't show anything at all, since the index file |
| matches my working directory. But doing a git-diff-cache does: |
| |
| torvalds@ppc970:~/git> git-diff-cache --cached $(cat .git/HEAD) |
| -100644 blob 4161aecc6700a2eb579e842af0b7f22b98443f74 commit.c |
| +100644 blob 4161aecc6700a2eb579e842af0b7f22b98443f74 git-commit.c |
| |
| You can trivially see that the above is a rename. |
| |
| In fact, "git-diff-cache --cached" _should_ always be entirely equivalent to |
| actually doing a "git-write-tree" and comparing that. Except this one is much |
| nicer for the case where you just want to check where you are. |
| |
| So doing a "git-diff-cache --cached" is basically very useful when you are |
| asking yourself "what have I already marked for being committed, and |
| what's the difference to a previous tree". |
| |
| Non-cached Mode |
| |
| The "non-cached" mode takes a different approach, and is potentially the |
| even more useful of the two in that what it does can't be emulated with a |
| "git-write-tree + git-diff-tree". Thus that's the default mode. The |
| non-cached version asks the question |
| |
| "show me the differences between HEAD and the currently checked out |
| tree - index contents _and_ files that aren't up-to-date" |
| |
| which is obviously a very useful question too, since that tells you what |
| you _could_ commit. Again, the output matches the "git-diff-tree -r" |
| output to a tee, but with a twist. |
| |
| The twist is that if some file doesn't match the cache, we don't have a |
| backing store thing for it, and we use the magic "all-zero" sha1 to show |
| that. So let's say that you have edited "kernel/sched.c", but have not |
| actually done an git-update-cache on it yet - there is no "object" associated |
| with the new state, and you get: |
| |
| torvalds@ppc970:~/v2.6/linux> git-diff-cache $(cat .git/HEAD ) |
| *100644->100664 blob 7476bb......->000000...... kernel/sched.c |
| |
| ie it shows that the tree has changed, and that "kernel/sched.c" has is |
| not up-to-date and may contain new stuff. The all-zero sha1 means that to |
| get the real diff, you need to look at the object in the working directory |
| directly rather than do an object-to-object diff. |
| |
| NOTE! As with other commands of this type, "git-diff-cache" does not |
| actually look at the contents of the file at all. So maybe |
| "kernel/sched.c" hasn't actually changed, and it's just that you touched |
| it. In either case, it's a note that you need to upate-cache it to make |
| the cache be in sync. |
| |
| NOTE 2! You can have a mixture of files show up as "has been updated" and |
| "is still dirty in the working directory" together. You can always tell |
| which file is in which state, since the "has been updated" ones show a |
| valid sha1, and the "not in sync with the index" ones will always have the |
| special all-zero sha1. |
| |
| |
| ################################################################ |
| git-diff-tree |
| git-diff-tree [-p] [-r] [-z] <tree-ish> <tree-ish> [<pattern>]* |
| |
| Compares the content and mode of the blobs found via two tree objects. |
| |
| Note that git-diff-tree can use the tree encapsulated in a commit object. |
| |
| <tree-ish> |
| The id of a tree object. |
| |
| <pattern> |
| If provided, the results are limited to a subset of files |
| matching one of these prefix strings. |
| ie file matches /^<pattern1>|<pattern2>|.../ |
| Note that pattern does not provide any wildcard or regexp |
| features. |
| |
| -p |
| generate patch (see section on generating patches). For |
| git-diff-tree, this flag implies -r as well. |
| |
| -r |
| recurse |
| |
| -z |
| \0 line termination on output |
| |
| Limiting Output |
| |
| If you're only interested in differences in a subset of files, for |
| example some architecture-specific files, you might do: |
| |
| git-diff-tree -r <tree-ish> <tree-ish> arch/ia64 include/asm-ia64 |
| |
| and it will only show you what changed in those two directories. |
| |
| Or if you are searching for what changed in just kernel/sched.c, just do |
| |
| git-diff-tree -r <tree-ish> <tree-ish> kernel/sched.c |
| |
| and it will ignore all differences to other files. |
| |
| The pattern is always the prefix, and is matched exactly. There are no |
| wildcards. Even stricter, it has to match complete path comonent. |
| I.e. "foo" does not pick up "foobar.h". "foo" does match "foo/bar.h" |
| so it can be used to name subdirectories. |
| |
| Output format: |
| |
| See "Output format from git-diff-cache, git-diff-tree and git-diff-files" |
| section. |
| |
| An example of normal usage is: |
| |
| torvalds@ppc970:~/git> git-diff-tree 5319e4...... |
| *100664->100664 blob ac348b.......->a01513....... git-fsck-cache.c |
| |
| which tells you that the last commit changed just one file (it's from |
| this one: |
| |
| commit 3c6f7ca19ad4043e9e72fa94106f352897e651a8 |
| tree 5319e4d609cdd282069cc4dce33c1db559539b03 |
| parent b4e628ea30d5ab3606119d2ea5caeab141d38df7 |
| author Linus Torvalds <torvalds@ppc970.osdl.org> Sat Apr 9 12:02:30 2005 |
| committer Linus Torvalds <torvalds@ppc970.osdl.org> Sat Apr 9 12:02:30 2005 |
| |
| Make "git-fsck-cache" print out all the root commits it finds. |
| |
| Once I do the reference tracking, I'll also make it print out all the |
| HEAD commits it finds, which is even more interesting. |
| |
| in case you care). |
| |
| |
| ################################################################ |
| git-diff-tree-helper |
| git-diff-tree-helper [-z] [-R] |
| |
| Reads output from git-diff-cache, git-diff-tree and git-diff-files and |
| generates patch format output. |
| |
| -z |
| \0 line termination on input |
| |
| -R |
| Output diff in reverse. This is useful for displaying output from |
| git-diff-cache which always compares tree with cache or working |
| file. E.g. |
| |
| git-diff-cache <tree> | git-diff-tree-helper -R file.c |
| |
| would show a diff to bring the working file back to what is in the |
| <tree>. |
| |
| See also the section on generating patches. |
| |
| |
| ################################################################ |
| git-fsck-cache |
| git-fsck-cache [--tags] [--root] [[--unreachable] [--cache] <object>*] |
| |
| Verifies the connectivity and validity of the objects in the database. |
| |
| <object> |
| An object to treat as the head of an unreachability trace. |
| |
| --unreachable |
| Print out objects that exist but that aren't readable from any |
| of the specified head nodes. |
| |
| --root |
| Report root nodes. |
| |
| --tags |
| Report tags. |
| |
| --cache |
| Consider any object recorded in the cache also as a head node for |
| an unreachability trace. |
| |
| It tests SHA1 and general object sanity, and it does full tracking of |
| the resulting reachability and everything else. It prints out any |
| corruption it finds (missing or bad objects), and if you use the |
| "--unreachable" flag it will also print out objects that exist but |
| that aren't readable from any of the specified head nodes. |
| |
| So for example |
| |
| git-fsck-cache --unreachable $(cat .git/HEAD) |
| |
| or, for Cogito users: |
| |
| git-fsck-cache --unreachable $(cat .git/refs/heads/*) |
| |
| will do quite a _lot_ of verification on the tree. There are a few |
| extra validity tests to be added (make sure that tree objects are |
| sorted properly etc), but on the whole if "git-fsck-cache" is happy, you |
| do have a valid tree. |
| |
| Any corrupt objects you will have to find in backups or other archives |
| (ie you can just remove them and do an "rsync" with some other site in |
| the hopes that somebody else has the object you have corrupted). |
| |
| Of course, "valid tree" doesn't mean that it wasn't generated by some |
| evil person, and the end result might be crap. Git is a revision |
| tracking system, not a quality assurance system ;) |
| |
| Extracted Diagnostics |
| |
| expect dangling commits - potential heads - due to lack of head information |
| You haven't specified any nodes as heads so it won't be |
| possible to differentiate between un-parented commits and |
| root nodes. |
| |
| missing sha1 directory '<dir>' |
| The directory holding the sha1 objects is missing. |
| |
| unreachable <type> <object> |
| The <type> object <object>, isn't actually referred to directly |
| or indirectly in any of the trees or commits seen. This can |
| mean that there's another root na SHA1_ode that you're not specifying |
| or that the tree is corrupt. If you haven't missed a root node |
| then you might as well delete unreachable nodes since they |
| can't be used. |
| |
| missing <type> <object> |
| The <type> object <object>, is referred to but isn't present in |
| the database. |
| |
| dangling <type> <object> |
| The <type> object <object>, is present in the database but never |
| _directly_ used. A dangling commit could be a root node. |
| |
| warning: git-fsck-cache: tree <tree> has full pathnames in it |
| And it shouldn't... |
| |
| sha1 mismatch <object> |
| The database has an object who's sha1 doesn't match the |
| database value. |
| This indicates a ??serious?? data integrity problem. |
| (note: this error occured during early git development when |
| the database format changed.) |
| |
| Environment Variables |
| |
| SHA1_FILE_DIRECTORY |
| used to specify the object database root (usually .git/objects) |
| |
| GIT_INDEX_FILE |
| used to specify the cache |
| |
| |
| ################################################################ |
| git-export |
| git-export top [base] |
| |
| Exports each commit and diff against each of its parents, between |
| top and base. If base is not specified it exports everything. |
| |
| |
| ################################################################ |
| git-init-db |
| git-init-db |
| |
| This simply creates an empty git object database - basically a .git |
| directory and .git/object/??/ directories. |
| |
| If the object storage directory is specified via the SHA1_FILE_DIRECTORY |
| environment variable then the sha1 directories are created underneath - |
| otherwise the default .git/objects directory is used. |
| |
| git-init-db won't hurt an existing repository. |
| |
| |
| ################################################################ |
| git-http-pull |
| |
| git-http-pull [-c] [-t] [-a] [-v] commit-id url |
| |
| Downloads a remote GIT repository via HTTP protocol. |
| |
| -c |
| Get the commit objects. |
| -t |
| Get trees associated with the commit objects. |
| -a |
| Get all the objects. |
| -v |
| Report what is downloaded. |
| |
| |
| ################################################################ |
| git-local-pull |
| |
| git-local-pull [-c] [-t] [-a] [-l] [-s] [-n] [-v] commit-id path |
| |
| Downloads another GIT repository on a local system. |
| |
| -c |
| Get the commit objects. |
| -t |
| Get trees associated with the commit objects. |
| -a |
| Get all the objects. |
| -v |
| Report what is downloaded. |
| |
| ################################################################ |
| git-ls-tree |
| git-ls-tree [-r] [-z] <tree-ish> |
| |
| Converts the tree object to a human readable (and script processable) |
| form. |
| |
| <tree-ish> |
| Id of a tree. |
| |
| -r |
| recurse into sub-trees |
| |
| -z |
| \0 line termination on output |
| |
| Output Format |
| <mode>\t <type>\t <object>\t <file> |
| |
| |
| ################################################################ |
| git-merge-base |
| git-merge-base <commit> <commit> |
| |
| git-merge-base finds as good a common ancestor as possible. Given a |
| selection of equally good common ancestors it should not be relied on |
| to decide in any particular way. |
| |
| The git-merge-base algorithm is still in flux - use the source... |
| |
| |
| ################################################################ |
| git-merge-cache |
| git-merge-cache <merge-program> (-a | -- | <file>*) |
| |
| This looks up the <file>(s) in the cache and, if there are any merge |
| entries, passes the SHA1 hash for those files as arguments 1, 2, 3 (empty |
| argument if no file), and <file> as argument 4. File modes for the three |
| files are passed as arguments 5, 6 and 7. |
| |
| -- |
| Interpret all future arguments as filenames. |
| |
| -a |
| Run merge against all files in the cache that need merging. |
| |
| If git-merge-cache is called with multiple <file>s (or -a) then it |
| processes them in turn only stopping if merge returns a non-zero exit |
| code. |
| |
| Typically this is run with the a script calling the merge command from |
| the RCS package. |
| |
| A sample script called git-merge-one-file-script is included in the |
| ditribution. |
| |
| ALERT ALERT ALERT! The git "merge object order" is different from the |
| RCS "merge" program merge object order. In the above ordering, the |
| original is first. But the argument order to the 3-way merge program |
| "merge" is to have the original in the middle. Don't ask me why. |
| |
| Examples: |
| |
| torvalds@ppc970:~/merge-test> git-merge-cache cat MM |
| This is MM from the original tree. # original |
| This is modified MM in the branch A. # merge1 |
| This is modified MM in the branch B. # merge2 |
| This is modified MM in the branch B. # current contents |
| |
| or |
| |
| torvalds@ppc970:~/merge-test> git-merge-cache cat AA MM |
| cat: : No such file or directory |
| This is added AA in the branch A. |
| This is added AA in the branch B. |
| This is added AA in the branch B. |
| fatal: merge program failed |
| |
| where the latter example shows how "git-merge-cache" will stop trying to |
| merge once anything has returned an error (ie "cat" returned an error |
| for the AA file, because it didn't exist in the original, and thus |
| "git-merge-cache" didn't even try to merge the MM thing). |
| |
| ################################################################ |
| git-merge-one-file-script |
| |
| This is the standard helper program to use with git-merge-cache |
| to resolve a merge after the trivial merge done with git-read-tree -m. |
| |
| ################################################################ |
| git-mktag |
| |
| Reads a tag contents from its standard input and creates a tag object. |
| The input must be a well formed tag object. |
| |
| |
| ################################################################ |
| git-prune-script |
| |
| This runs git-fsck-cache --unreachable program using the heads specified |
| on the command line (or .git/refs/heads/* and .git/refs/tags/* if none is |
| specified), and prunes all unreachable objects from the object database. |
| |
| |
| ################################################################ |
| git-pull-script |
| |
| This script is used by Linus to pull from a remote repository and perform |
| a merge. |
| |
| |
| ################################################################ |
| git-read-tree |
| git-read-tree (<tree-ish> | -m <tree-ish1> [<tree-ish2> <tree-ish3>])" |
| |
| Reads the tree information given by <tree> into the directory cache, |
| but does not actually _update_ any of the files it "caches". (see: |
| git-checkout-cache) |
| |
| Optionally, it can merge a tree into the cache or perform a 3-way |
| merge. |
| |
| Trivial merges are done by git-read-tree itself. Only conflicting paths |
| will be in unmerged state when git-read-tree returns. |
| |
| -m |
| Perform a merge, not just a read |
| |
| <tree-ish#> |
| The id of the tree object(s) to be read/merged. |
| |
| |
| Merging |
| If -m is specified, git-read-tree performs 2 kinds of merge, a single tree |
| merge if only 1 tree is given or a 3-way merge if 3 trees are |
| provided. |
| |
| Single Tree Merge |
| If only 1 tree is specified, git-read-tree operates as if the user did not |
| specify "-m", except that if the original cache has an entry for a |
| given pathname; and the contents of the path matches with the tree |
| being read, the stat info from the cache is used. (In other words, the |
| cache's stat()s take precedence over the merged tree's) |
| |
| That means that if you do a "git-read-tree -m <newtree>" followed by a |
| "git-checkout-cache -f -a", the git-checkout-cache only checks out the stuff |
| that really changed. |
| |
| This is used to avoid unnecessary false hits when git-diff-files is |
| run after git-read-tree. |
| |
| 3-Way Merge |
| Each "index" entry has two bits worth of "stage" state. stage 0 is the |
| normal one, and is the only one you'd see in any kind of normal use. |
| |
| However, when you do "git-read-tree" with three trees, the "stage" |
| starts out at 1. |
| |
| This means that you can do |
| |
| git-read-tree -m <tree1> <tree2> <tree3> |
| |
| and you will end up with an index with all of the <tree1> entries in |
| "stage1", all of the <tree2> entries in "stage2" and all of the |
| <tree3> entries in "stage3". |
| |
| Furthermore, "git-read-tree" has special-case logic that says: if you see |
| a file that matches in all respects in the following states, it |
| "collapses" back to "stage0": |
| |
| - stage 2 and 3 are the same; take one or the other (it makes no |
| difference - the same work has been done on stage 2 and 3) |
| |
| - stage 1 and stage 2 are the same and stage 3 is different; take |
| stage 3 (some work has been done on stage 3) |
| |
| - stage 1 and stage 3 are the same and stage 2 is different take |
| stage 2 (some work has been done on stage 2) |
| |
| The git-write-tree command refuses to write a nonsensical tree, and it |
| will complain about unmerged entries if it sees a single entry that is not |
| stage 0. |
| |
| Ok, this all sounds like a collection of totally nonsensical rules, |
| but it's actually exactly what you want in order to do a fast |
| merge. The different stages represent the "result tree" (stage 0, aka |
| "merged"), the original tree (stage 1, aka "orig"), and the two trees |
| you are trying to merge (stage 2 and 3 respectively). |
| |
| In fact, the way "git-read-tree" works, it's entirely agnostic about how |
| you assign the stages, and you could really assign them any which way, |
| and the above is just a suggested way to do it (except since |
| "git-write-tree" refuses to write anything but stage0 entries, it makes |
| sense to always consider stage 0 to be the "full merge" state). |
| |
| So what happens? Try it out. Select the original tree, and two trees |
| to merge, and look how it works: |
| |
| - if a file exists in identical format in all three trees, it will |
| automatically collapse to "merged" state by the new git-read-tree. |
| |
| - a file that has _any_ difference what-so-ever in the three trees |
| will stay as separate entries in the index. It's up to "script |
| policy" to determine how to remove the non-0 stages, and insert a |
| merged version. But since the index is always sorted, they're easy |
| to find: they'll be clustered together. |
| |
| - the index file saves and restores with all this information, so you |
| can merge things incrementally, but as long as it has entries in |
| stages 1/2/3 (ie "unmerged entries") you can't write the result. |
| |
| So now the merge algorithm ends up being really simple: |
| |
| - you walk the index in order, and ignore all entries of stage 0, |
| since they've already been done. |
| |
| - if you find a "stage1", but no matching "stage2" or "stage3", you |
| know it's been removed from both trees (it only existed in the |
| original tree), and you remove that entry. - if you find a |
| matching "stage2" and "stage3" tree, you remove one of them, and |
| turn the other into a "stage0" entry. Remove any matching "stage1" |
| entry if it exists too. .. all the normal trivial rules .. |
| |
| Incidentally - it also means that you don't even have to have a separate |
| subdirectory for this. All the information literally is in the index file, |
| which is a temporary thing anyway. There is no need to worry about what is |
| in the working directory, since it is never shown and never used. |
| |
| see also: |
| git-write-tree |
| git-ls-files |
| |
| |
| ################################################################ |
| git-resolve-script |
| |
| This script is used by Linus to merge two trees. |
| |
| |
| ################################################################ |
| git-rev-list <commit> |
| |
| Lists commit objects in reverse chronological order starting at the |
| given commit, taking ancestry relationship into account. This is |
| useful to produce human-readable log output. |
| |
| |
| ################################################################ |
| git-rev-tree |
| git-rev-tree [--edges] [--cache <cache-file>] [^]<commit> [[^]<commit>] |
| |
| Provides the revision tree for one or more commits. |
| |
| --edges |
| Show edges (ie places where the marking changes between parent |
| and child) |
| |
| --cache <cache-file> |
| Use the specified file as a cache from a previous git-rev-list run |
| to speed things up. Note that this "cache" is totally different |
| concept from the directory index. Also this option is not |
| implemented yet. |
| |
| [^]<commit> |
| The commit id to trace (a leading caret means to ignore this |
| commit-id and below) |
| |
| Output: |
| <date> <commit>:<flags> [<parent-commit>:<flags> ]* |
| |
| <date> |
| Date in 'seconds since epoch' |
| |
| <commit> |
| id of commit object |
| |
| <parent-commit> |
| id of each parent commit object (>1 indicates a merge) |
| |
| <flags> |
| |
| The flags are read as a bitmask representing each commit |
| provided on the commandline. eg: given the command: |
| |
| $ git-rev-tree <com1> <com2> <com3> |
| |
| The output: |
| |
| <date> <commit>:5 |
| |
| means that <commit> is reachable from <com1>(1) and <com3>(4) |
| |
| A revtree can get quite large. git-rev-tree will eventually allow you to |
| cache previous state so that you don't have to follow the whole thing |
| down. |
| |
| So the change difference between two commits is literally |
| |
| git-rev-tree [commit-id1] > commit1-revtree |
| git-rev-tree [commit-id2] > commit2-revtree |
| join -t : commit1-revtree commit2-revtree > common-revisions |
| |
| (this is also how to find the most common parent - you'd look at just |
| the head revisions - the ones that aren't referred to by other |
| revisions - in "common-revision", and figure out the best one. I |
| think.) |
| |
| |
| ################################################################ |
| git-rpull |
| |
| git-rpull [-c] [-t] [-a] [-v] commit-id url |
| |
| Pulls from a remote repository over ssh connection, invoking git-rpush on |
| the other end. |
| |
| -c |
| Get the commit objects. |
| -t |
| Get trees associated with the commit objects. |
| -a |
| Get all the objects. |
| -v |
| Report what is downloaded. |
| |
| |
| ################################################################ |
| git-rpush |
| |
| Helper "server-side" program used by git-rpull. |
| |
| |
| ################################################################ |
| git-diff-files |
| git-diff-files [-p] [-q] [-r] [-z] [<pattern>...] |
| |
| Compares the files in the working tree and the cache. When paths |
| are specified, compares only those named paths. Otherwise all |
| entries in the cache are compared. The output format is the |
| same as git-diff-cache and git-diff-tree. |
| |
| -p |
| generate patch (see section on generating patches). |
| |
| -q |
| Remain silent even on nonexisting files |
| |
| -r |
| This flag does not mean anything. It is there only to match |
| git-diff-tree. Unlike git-diff-tree, git-diff-files always looks |
| at all the subdirectories. |
| |
| |
| Output format: |
| |
| See "Output format from git-diff-cache, git-diff-tree and git-diff-files" |
| section. |
| |
| |
| ################################################################ |
| git-tag-script |
| |
| This is an example script that uses git-mktag to create a tag object |
| signed with GPG. |
| |
| |
| ################################################################ |
| git-tar-tree |
| |
| git-tar-tree <tree-ish> [ <base> ] |
| |
| Creates a tar archive containing the tree structure for the named tree. |
| When <base> is specified it is added as a leading path as the files in the |
| generated tar archive. |
| |
| |
| ################################################################ |
| git-ls-files |
| git-ls-files [-z] [-t] |
| (--[cached|deleted|others|ignored|stage|unmerged])* |
| (-[c|d|o|i|s|u])* |
| [-x <pattern>|--exclude=<pattern>] |
| [-X <file>|--exclude-from=<file>] |
| |
| This merges the file listing in the directory cache index with the |
| actual working directory list, and shows different combinations of the |
| two. |
| |
| One or more of the options below may be used to determine the files |
| shown: |
| |
| -c|--cached |
| Show cached files in the output (default) |
| |
| -d|--deleted |
| Show deleted files in the output |
| |
| -o|--others |
| Show other files in the output |
| |
| -i|--ignored |
| Show ignored files in the output |
| Note the this also reverses any exclude list present. |
| |
| -s|--stage |
| Show stage files in the output |
| |
| -u|--unmerged |
| Show unmerged files in the output (forces --stage) |
| |
| -z |
| \0 line termination on output |
| |
| -x|--exclude=<pattern> |
| Skips files matching pattern. |
| Note that pattern is a shell wildcard pattern. |
| |
| -X|--exclude-from=<file> |
| exclude patterns are read from <file>; 1 per line. |
| Allows the use of the famous dontdiff file as follows to find |
| out about uncommitted files just as dontdiff is used with |
| the diff command: |
| git-ls-files --others --exclude-from=dontdiff |
| |
| -t |
| Identify the file status with the following tags (followed by |
| a space) at the start of each line: |
| H cached |
| M unmerged |
| R removed/deleted |
| ? other |
| |
| Output |
| show files just outputs the filename unless --stage is specified in |
| which case it outputs: |
| |
| [<tag> ]<mode> <object> <stage> <file> |
| |
| git-ls-files --unmerged" and "git-ls-files --stage " can be used to examine |
| detailed information on unmerged paths. |
| |
| For an unmerged path, instead of recording a single mode/SHA1 pair, |
| the dircache records up to three such pairs; one from tree O in stage |
| 1, A in stage 2, and B in stage 3. This information can be used by |
| the user (or Cogito) to see what should eventually be recorded at the |
| path. (see read-cache for more information on state) |
| |
| see also: |
| read-cache |
| |
| |
| ################################################################ |
| git-unpack-file |
| git-unpack-file <blob> |
| |
| Creates a file holding the contents of the blob specified by sha1. It |
| returns the name of the temporary file in the following format: |
| .merge_file_XXXXX |
| |
| <blob> |
| Must be a blob id |
| |
| ################################################################ |
| git-update-cache |
| git-update-cache |
| [--add] [--remove] [--refresh] |
| [--ignore-missing] |
| [--force-remove <file>] |
| [--cacheinfo <mode> <object> <file>]* |
| [--] [<file>]* |
| |
| Modifies the index or directory cache. Each file mentioned is updated |
| into the cache and any 'unmerged' or 'needs updating' state is |
| cleared. |
| |
| The way git-update-cache handles files it is told about can be modified |
| using the various options: |
| |
| --add |
| If a specified file isn't in the cache already then it's |
| added. |
| Default behaviour is to ignore new files. |
| |
| --remove |
| If a specified file is in the cache but is missing then it's |
| removed. |
| Default behaviour is to ignore removed file. |
| |
| --refresh |
| Looks at the current cache and checks to see if merges or |
| updates are needed by checking stat() information. |
| |
| --ignore-missing |
| Ignores missing files during a --refresh |
| |
| --cacheinfo <mode> <object> <path> |
| Directly insert the specified info into the cache. |
| |
| --force-remove |
| Remove the file from the index even when the working directory |
| still has such a file. |
| |
| -- |
| Do not interpret any more arguments as options. |
| |
| <file> |
| Files to act on. |
| Note that files begining with '.' are discarded. This includes |
| "./file" and "dir/./file". If you don't want this, then use |
| cleaner names. |
| The same applies to directories ending '/' and paths with '//' |
| |
| Using --refresh |
| --refresh does not calculate a new sha1 file or bring the cache |
| up-to-date for mode/content changes. But what it _does_ do is to |
| "re-match" the stat information of a file with the cache, so that you |
| can refresh the cache for a file that hasn't been changed but where |
| the stat entry is out of date. |
| |
| For example, you'd want to do this after doing a "git-read-tree", to link |
| up the stat cache details with the proper files. |
| |
| Using --cacheinfo |
| --cacheinfo is used to register a file that is not in the current |
| working directory. This is useful for minimum-checkout merging. |
| |
| To pretend you have a file with mode and sha1 at path, say: |
| |
| $ git-update-cache --cacheinfo mode sha1 path |
| |
| To update and refresh only the files already checked out: |
| |
| git-checkout-cache -n -f -a && git-update-cache --ignore-missing --refresh |
| |
| |
| ################################################################ |
| git-write-blob |
| |
| git-write-blob <any-file-on-the-filesystem> |
| |
| Writes the contents of the named file (which can be outside of the work |
| tree) as a blob into the object database, and reports its object ID to its |
| standard output. This is used by git-merge-one-file-script to update the |
| cache without modifying files in the work tree. |
| |
| |
| ################################################################ |
| git-write-tree |
| git-write-tree |
| |
| Creates a tree object using the current cache. |
| |
| The cache must be merged. |
| |
| Conceptually, git-write-tree sync()s the current directory cache contents |
| into a set of tree files. |
| In order to have that match what is actually in your directory right |
| now, you need to have done a "git-update-cache" phase before you did the |
| "git-write-tree". |
| |
| |
| ################################################################ |
| |
| Output format from git-diff-cache, git-diff-tree and git-diff-files. |
| |
| These commands all compare two sets of things; what are |
| compared are different: |
| |
| git-diff-cache <tree-ish> |
| |
| compares the <tree-ish> and the files on the filesystem. |
| |
| git-diff-cache --cached <tree-ish> |
| |
| compares the <tree-ish> and the cache. |
| |
| git-diff-tree [-r] <tree-ish-1> <tree-ish-2> [<pattern>...] |
| |
| compares the trees named by the two arguments. |
| |
| git-diff-files [<pattern>...] |
| |
| compares the cache and the files on the filesystem. |
| |
| The following desription uses "old" and "new" to mean those |
| compared entities. |
| |
| For files in old but not in new (i.e. removed): |
| -<mode> \t <type> \t <object> \t <path> |
| |
| For files not in old but in new (i.e. added): |
| +<mode> \t <type> \t <object> \t <path> |
| |
| For files that differ: |
| *<old-mode>-><new-mode> \t <type> \t <old-sha1>-><new-sha1> \t <path> |
| |
| <new-sha1> is shown as all 0's if new is a file on the |
| filesystem and it is out of sync with the cache. Example: |
| |
| *100644->100644 blob 5be4a4.......->000000....... file.c |
| |
| ################################################################ |
| |
| Generating patches |
| |
| When git-diff-cache, git-diff-tree, or git-diff-files are run with a -p |
| option, they do not produce the output described in "Output format from |
| git-diff-cache, git-diff-tree and git-diff-files" section. It instead |
| produces a patch file. |
| |
| The patch generation can be customized at two levels. This |
| customization also applies to git-diff-tree-helper. |
| |
| 1. When the environment variable GIT_EXTERNAL_DIFF is not set, |
| these commands internally invoke diff like this: |
| |
| diff -L a/<path> -L a/<path> -pu <old> <new> |
| |
| For added files, /dev/null is used for <old>. For removed |
| files, /dev/null is used for <new> |
| |
| The diff formatting options can be customized via the |
| environment variable GIT_DIFF_OPTS. For example, if you |
| prefer context diff: |
| |
| GIT_DIFF_OPTS=-c git-diff-cache -p $(cat .git/HEAD) |
| |
| |
| 2. When the environment variable GIT_EXTERNAL_DIFF 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, |
| GIT_EXTERNAL_DIFF is called with 7 parameters: |
| |
| path old-file old-hex old-mode new-file new-hex new-mode |
| |
| where |
| <old|new>-file are files GIT_EXTERNAL_DIFF can use to read the |
| contents of <old|ne>, |
| <old|new>-hex are the 40-hexdigit SHA1 hashes, |
| <old|new>-mode are the octal representation of the file modes. |
| |
| The file parameters can point at the user's working file (e.g. new-file |
| in git-diff-files), /dev/null (e.g. old-file when a new file is added), |
| or a temporary file (e.g. old-file in the cache). GIT_EXTERNAL_DIFF |
| should not worry about unlinking the temporary file --- it is removed |
| when GIT_EXTERNAL_DIFF exits. |
| |
| For a path that is unmerged, GIT_EXTERNAL_DIFF is called with |
| 1 parameter, path. |
| |
| ################################################################ |
| |
| Terminology: - see README for description |
| Each line contains terms used interchangeably |
| |
| object database, .git directory |
| directory cache, index |
| id, sha1, sha1-id, sha1 hash |
| type, tag |
| blob, blob object |
| tree, tree object |
| commit, commit object |
| parent |
| root object |
| changeset |
| |
| |
| git Environment Variables |
| AUTHOR_NAME |
| AUTHOR_EMAIL |
| AUTHOR_DATE |
| COMMIT_AUTHOR_NAME |
| COMMIT_AUTHOR_EMAIL |
| GIT_DIFF_OPTS |
| GIT_EXTERNAL_DIFF |
| GIT_INDEX_FILE |
| SHA1_FILE_DIRECTORY |