1This file contains reference information for the core git commands. 2 3The README contains much useful definition and clarification 4info - read that first. And of the commands, I suggest reading 5'git-update-cache' and 'git-read-tree' first - I wish I had! 6 7David Greaves <david@dgreaves.com> 824/4/05 9 10Updated by Junio C Hamano <junkio@cox.net> on 2005-05-05 to 11reflect recent changes. 12 13Identifier terminology used: 14 15<object> 16 Indicates any object sha1 identifier 17 18<blob> 19 Indicates a blob object sha1 identifier 20 21<tree> 22 Indicates a tree object sha1 identifier 23 24<commit> 25 Indicates a commit object sha1 identifier 26 27<tree-ish> 28 Indicates a tree, commit or tag object sha1 identifier. 29 A command that takes a <tree-ish> argument ultimately 30 wants to operate on a <tree> object but automatically 31 dereferences <commit> and <tag> that points at a 32 <tree>. 33 34<type> 35 Indicates that an object type is required. 36 Currently one of: blob/tree/commit/tag 37 38<file> 39 Indicates a filename - always relative to the root of 40 the tree structure GIT_INDEX_FILE describes. 41 42 43################################################################ 44git-apply-patch-script 45 46This is a sample script to be used as GIT_EXTERNAL_DIFF to apply 47differences git-diff-* family of commands reports to the current 48work tree. 49 50 51################################################################ 52git-cat-file 53 git-cat-file (-t | <type>) <object> 54 55Provides contents or type of objects in the repository. The type 56is required if -t is not being used to find the object type. 57 58<object> 59 The sha1 identifier of the object. 60 61-t 62 Instead of the content, show the object type identified 63 by <object>. 64 65<type> 66 Typically this matches the real type of <object> but 67 asking for type that can trivially dereferenced from the 68 given <object> is also permitted. An example is to ask 69 "tree" with <object> for a commit object that contains 70 it, or to ask "blob" with <object> for a tag object that 71 points at it. 72 73Output 74 75If -t is specified, one of the <type>. 76 77Otherwise the raw (though uncompressed) contents of the <object> will 78be returned. 79 80 81################################################################ 82git-check-files 83 git-check-files <file>... 84 85Check that a list of files are up-to-date between the filesystem and 86the cache. Used to verify a patch target before doing a patch. 87 88Files that do not exist on the filesystem are considered up-to-date 89(whether or not they are in the cache). 90 91Emits an error message on failure. 92preparing to update existing file <file> not in cache 93 <file> exists but is not in the cache 94 95preparing to update file <file> not uptodate in cache 96 <file> on disk is not up-to-date with the cache 97 98Exits with a status code indicating success if all files are 99up-to-date. 100 101see also: git-update-cache 102 103 104################################################################ 105git-checkout-cache 106 git-checkout-cache [-q] [-a] [-f] [-n] [--prefix=<string>] 107 [--] <file>... 108 109Will copy all files listed from the cache to the working directory 110(not overwriting existing files). 111 112-q 113 be quiet if files exist or are not in the cache 114 115-f 116 forces overwrite of existing files 117 118-a 119 checks out all files in the cache (will then continue to 120 process listed files). 121 122-n 123 Don't checkout new files, only refresh files already checked 124 out. 125 126--prefix=<string> 127 When creating files, prepend <string> (usually a directory 128 including a trailing /) 129 130-- 131 Do not interpret any more arguments as options. 132 133Note that the order of the flags matters: 134 135 git-checkout-cache -a -f file.c 136 137will first check out all files listed in the cache (but not overwrite 138any old ones), and then force-checkout file.c a second time (ie that 139one _will_ overwrite any old contents with the same filename). 140 141Also, just doing "git-checkout-cache" does nothing. You probably meant 142"git-checkout-cache -a". And if you want to force it, you want 143"git-checkout-cache -f -a". 144 145Intuitiveness is not the goal here. Repeatability is. The reason for 146the "no arguments means no work" thing is that from scripts you are 147supposed to be able to do things like 148 149 find . -name '*.h' -print0 | xargs -0 git-checkout-cache -f -- 150 151which will force all existing *.h files to be replaced with their 152cached copies. If an empty command line implied "all", then this would 153force-refresh everything in the cache, which was not the point. 154 155To update and refresh only the files already checked out: 156 157 git-checkout-cache -n -f -a && git-update-cache --ignore-missing --refresh 158 159Oh, and the "--" is just a good idea when you know the rest will be 160filenames. Just so that you wouldn't have a filename of "-a" causing 161problems (not possible in the above example, but get used to it in 162scripting!). 163 164The prefix ability basically makes it trivial to use 165git-checkout-cache as an "export as tree" function. Just read the 166desired tree into the index, and do a 167 168 git-checkout-cache --prefix=git-export-dir/ -a 169 170and git-checkout-cache will "export" the cache into the specified 171directory. 172 173NOTE! The final "/" is important. The exported name is literally just 174prefixed with the specified string, so you can also do something like 175 176 git-checkout-cache --prefix=.merged- Makefile 177 178to check out the currently cached copy of "Makefile" into the file 179".merged-Makefile". 180 181 182################################################################ 183git-commit-tree 184 git-commit-tree <tree> [-p <parent commit>]* < changelog 185 186Creates a new commit object based on the provided tree object and 187emits the new commit object id on stdout. If no parent is given then 188it is considered to be an initial tree. 189 190A commit object usually has 1 parent (a commit after a change) or up 191to 16 parents. More than one parent represents a merge of branches 192that led to them. 193 194While a tree represents a particular directory state of a working 195directory, a commit represents that state in "time", and explains how 196to get there. 197 198Normally a commit would identify a new "HEAD" state, and while git 199doesn't care where you save the note about that state, in practice we 200tend to just write the result to the file ".git/HEAD", so that we can 201always see what the last committed state was. 202 203Options 204 205<tree> 206 An existing tree object 207 208-p <parent commit> 209 Each -p indicates a the id of a parent commit object. 210 211 212Commit Information 213 214A commit encapsulates: 215 all parent object ids 216 author name, email and date 217 committer name and email and the commit time. 218 219If not provided, git-commit-tree uses your name, hostname and domain to 220provide author and committer info. This can be overridden using the 221following environment variables. 222 AUTHOR_NAME 223 AUTHOR_EMAIL 224 AUTHOR_DATE 225 COMMIT_AUTHOR_NAME 226 COMMIT_AUTHOR_EMAIL 227(nb <,> and '\n's are stripped) 228 229A commit comment is read from stdin (max 999 chars). If a changelog 230entry is not provided via '<' redirection, git-commit-tree will just wait 231for one to be entered and terminated with ^D 232 233see also: git-write-tree 234 235 236################################################################ 237git-convert-cache 238 239Converts old-style GIT repository to the latest. 240 241 242################################################################ 243git-diff-cache 244 git-diff-cache [-p] [-r] [-z] [-m] [--cached] <tree-ish> 245 246Compares the content and mode of the blobs found via a tree object 247with the content of the current cache and, optionally ignoring the 248stat state of the file on disk. 249 250<tree-ish> 251 The id of a tree object to diff against. 252 253-p 254 Generate patch (see section on generating patches) 255 256-r 257 This flag does not mean anything. It is there only to match 258 git-diff-tree. Unlike git-diff-tree, git-diff-cache always looks 259 at all the subdirectories. 260 261-z 262 \0 line termination on output 263 264--cached 265 do not consider the on-disk file at all 266 267-m 268 269 By default, files recorded in the index but not checked 270 out are reported as deleted. This flag makes 271 git-diff-cache say that all non-checked-out files are up 272 to date. 273 274Output format: 275 276See "Output format from git-diff-cache, git-diff-tree and git-diff-files" 277section. 278 279Operating Modes 280 281You can choose whether you want to trust the index file entirely 282(using the "--cached" flag) or ask the diff logic to show any files 283that don't match the stat state as being "tentatively changed". Both 284of these operations are very useful indeed. 285 286Cached Mode 287 288If --cached is specified, it allows you to ask: 289 290 show me the differences between HEAD and the current index 291 contents (the ones I'd write with a "git-write-tree") 292 293For example, let's say that you have worked on your index file, and are 294ready to commit. You want to see eactly _what_ you are going to commit is 295without having to write a new tree object and compare it that way, and to 296do that, you just do 297 298 git-diff-cache --cached $(cat .git/HEAD) 299 300Example: let's say I had renamed "commit.c" to "git-commit.c", and I had 301done an "git-update-cache" to make that effective in the index file. 302"git-diff-files" wouldn't show anything at all, since the index file 303matches my working directory. But doing a git-diff-cache does: 304 305 torvalds@ppc970:~/git> git-diff-cache --cached $(cat .git/HEAD) 306 -100644 blob 4161aecc6700a2eb579e842af0b7f22b98443f74 commit.c 307 +100644 blob 4161aecc6700a2eb579e842af0b7f22b98443f74 git-commit.c 308 309You can trivially see that the above is a rename. 310 311In fact, "git-diff-cache --cached" _should_ always be entirely equivalent to 312actually doing a "git-write-tree" and comparing that. Except this one is much 313nicer for the case where you just want to check where you are. 314 315So doing a "git-diff-cache --cached" is basically very useful when you are 316asking yourself "what have I already marked for being committed, and 317what's the difference to a previous tree". 318 319Non-cached Mode 320 321The "non-cached" mode takes a different approach, and is potentially the 322even more useful of the two in that what it does can't be emulated with a 323"git-write-tree + git-diff-tree". Thus that's the default mode. The 324non-cached version asks the question 325 326 "show me the differences between HEAD and the currently checked out 327 tree - index contents _and_ files that aren't up-to-date" 328 329which is obviously a very useful question too, since that tells you what 330you _could_ commit. Again, the output matches the "git-diff-tree -r" 331output to a tee, but with a twist. 332 333The twist is that if some file doesn't match the cache, we don't have a 334backing store thing for it, and we use the magic "all-zero" sha1 to show 335that. So let's say that you have edited "kernel/sched.c", but have not 336actually done an git-update-cache on it yet - there is no "object" associated 337with the new state, and you get: 338 339 torvalds@ppc970:~/v2.6/linux> git-diff-cache $(cat .git/HEAD ) 340 *100644->100664 blob 7476bb......->000000...... kernel/sched.c 341 342ie it shows that the tree has changed, and that "kernel/sched.c" has is 343not up-to-date and may contain new stuff. The all-zero sha1 means that to 344get the real diff, you need to look at the object in the working directory 345directly rather than do an object-to-object diff. 346 347NOTE! As with other commands of this type, "git-diff-cache" does not 348actually look at the contents of the file at all. So maybe 349"kernel/sched.c" hasn't actually changed, and it's just that you touched 350it. In either case, it's a note that you need to upate-cache it to make 351the cache be in sync. 352 353NOTE 2! You can have a mixture of files show up as "has been updated" and 354"is still dirty in the working directory" together. You can always tell 355which file is in which state, since the "has been updated" ones show a 356valid sha1, and the "not in sync with the index" ones will always have the 357special all-zero sha1. 358 359 360################################################################ 361git-diff-files 362 git-diff-files [-p] [-q] [-r] [-z] [<pattern>...] 363 364Compares the files in the working tree and the cache. When paths 365are specified, compares only those named paths. Otherwise all 366entries in the cache are compared. The output format is the 367same as git-diff-cache and git-diff-tree. 368 369-p 370 generate patch (see section on generating patches). 371 372-q 373 Remain silent even on nonexisting files 374 375-r 376 This flag does not mean anything. It is there only to match 377 git-diff-tree. Unlike git-diff-tree, git-diff-files always looks 378 at all the subdirectories. 379 380 381Output format: 382 383See "Output format from git-diff-cache, git-diff-tree and git-diff-files" 384section. 385 386 387################################################################ 388git-diff-tree 389 git-diff-tree [-p] [-r] [-z] [--stdin] [-m] [-s] [-v] <tree-ish> <tree-ish> [<pattern>]* 390 391Compares the content and mode of the blobs found via two tree objects. 392 393Note that git-diff-tree can use the tree encapsulated in a commit object. 394 395<tree-ish> 396 The id of a tree object. 397 398<pattern> 399 If provided, the results are limited to a subset of files 400 matching one of these prefix strings. 401 ie file matches /^<pattern1>|<pattern2>|.../ 402 Note that pattern does not provide any wildcard or regexp 403 features. 404 405-p 406 generate patch (see section on generating patches). For 407 git-diff-tree, this flag implies -r as well. 408 409-r 410 recurse 411 412-z 413 \0 line termination on output 414 415--stdin 416 When --stdin is specified, the command does not take 417 <tree-ish> arguments from the command line. Instead, it 418 reads either one <commit> or a pair of <tree-ish> 419 separated with a single space from its standard input. 420 421 When a single commit is given on one line of such input, 422 it compares the commit with its parents. The following 423 flags further affects its behaviour. This does not 424 apply to the case where two <tree-ish> separated with a 425 single space are given. 426 427-m 428 By default, "git-diff-tree --stdin" does not show 429 differences for merge commits. With this flag, it shows 430 differences to that commit from all of its parents. 431 432-s 433 By default, "git-diff-tree --stdin" shows differences, 434 either in machine-readable form (without -p) or in patch 435 form (with -p). This output can be supressed. It is 436 only useful with -v flag. 437 438-v 439 This flag causes "git-diff-tree --stdin" to also show 440 the commit message before the differences. 441 442 443Limiting Output 444 445If you're only interested in differences in a subset of files, for 446example some architecture-specific files, you might do: 447 448 git-diff-tree -r <tree-ish> <tree-ish> arch/ia64 include/asm-ia64 449 450and it will only show you what changed in those two directories. 451 452Or if you are searching for what changed in just kernel/sched.c, just do 453 454 git-diff-tree -r <tree-ish> <tree-ish> kernel/sched.c 455 456and it will ignore all differences to other files. 457 458The pattern is always the prefix, and is matched exactly. There are no 459wildcards. Even stricter, it has to match complete path comonent. 460I.e. "foo" does not pick up "foobar.h". "foo" does match "foo/bar.h" 461so it can be used to name subdirectories. 462 463Output format: 464 465See "Output format from git-diff-cache, git-diff-tree and git-diff-files" 466section. 467 468An example of normal usage is: 469 470 torvalds@ppc970:~/git> git-diff-tree 5319e4...... 471 *100664->100664 blob ac348b.......->a01513....... git-fsck-cache.c 472 473which tells you that the last commit changed just one file (it's from 474this one: 475 476 commit 3c6f7ca19ad4043e9e72fa94106f352897e651a8 477 tree 5319e4d609cdd282069cc4dce33c1db559539b03 478 parent b4e628ea30d5ab3606119d2ea5caeab141d38df7 479 author Linus Torvalds <torvalds@ppc970.osdl.org> Sat Apr 9 12:02:30 2005 480 committer Linus Torvalds <torvalds@ppc970.osdl.org> Sat Apr 9 12:02:30 2005 481 482 Make "git-fsck-cache" print out all the root commits it finds. 483 484 Once I do the reference tracking, I'll also make it print out all the 485 HEAD commits it finds, which is even more interesting. 486 487in case you care). 488 489 490################################################################ 491git-diff-tree-helper 492 git-diff-tree-helper [-z] [-R] 493 494Reads output from git-diff-cache, git-diff-tree and git-diff-files and 495generates patch format output. 496 497-z 498 \0 line termination on input 499 500-R 501 Output diff in reverse. This is useful for displaying output from 502 git-diff-cache which always compares tree with cache or working 503 file. E.g. 504 505 git-diff-cache <tree> | git-diff-tree-helper -R file.c 506 507 would show a diff to bring the working file back to what is in the 508 <tree>. 509 510See also the section on generating patches. 511 512 513################################################################ 514git-export 515 git-export top [base] 516 517Exports each commit and diff against each of its parents, between 518top and base. If base is not specified it exports everything. 519 520 521################################################################ 522git-fsck-cache 523 git-fsck-cache [--tags] [--root] [[--unreachable] [--cache] <object>*] 524 525Verifies the connectivity and validity of the objects in the database. 526 527<object> 528 An object to treat as the head of an unreachability trace. 529 530--unreachable 531 Print out objects that exist but that aren't readable from any 532 of the specified head nodes. 533 534--root 535 Report root nodes. 536 537--tags 538 Report tags. 539 540--cache 541 Consider any object recorded in the cache also as a head node for 542 an unreachability trace. 543 544It tests SHA1 and general object sanity, and it does full tracking of 545the resulting reachability and everything else. It prints out any 546corruption it finds (missing or bad objects), and if you use the 547"--unreachable" flag it will also print out objects that exist but 548that aren't readable from any of the specified head nodes. 549 550So for example 551 552 git-fsck-cache --unreachable $(cat .git/HEAD) 553 554or, for Cogito users: 555 556 git-fsck-cache --unreachable $(cat .git/refs/heads/*) 557 558will do quite a _lot_ of verification on the tree. There are a few 559extra validity tests to be added (make sure that tree objects are 560sorted properly etc), but on the whole if "git-fsck-cache" is happy, you 561do have a valid tree. 562 563Any corrupt objects you will have to find in backups or other archives 564(ie you can just remove them and do an "rsync" with some other site in 565the hopes that somebody else has the object you have corrupted). 566 567Of course, "valid tree" doesn't mean that it wasn't generated by some 568evil person, and the end result might be crap. Git is a revision 569tracking system, not a quality assurance system ;) 570 571Extracted Diagnostics 572 573expect dangling commits - potential heads - due to lack of head information 574 You haven't specified any nodes as heads so it won't be 575 possible to differentiate between un-parented commits and 576 root nodes. 577 578missing sha1 directory '<dir>' 579 The directory holding the sha1 objects is missing. 580 581unreachable <type> <object> 582 The <type> object <object>, isn't actually referred to directly 583 or indirectly in any of the trees or commits seen. This can 584 mean that there's another root na SHA1_ode that you're not specifying 585 or that the tree is corrupt. If you haven't missed a root node 586 then you might as well delete unreachable nodes since they 587 can't be used. 588 589missing <type> <object> 590 The <type> object <object>, is referred to but isn't present in 591 the database. 592 593dangling <type> <object> 594 The <type> object <object>, is present in the database but never 595 _directly_ used. A dangling commit could be a root node. 596 597warning: git-fsck-cache: tree <tree> has full pathnames in it 598 And it shouldn't... 599 600sha1 mismatch <object> 601 The database has an object who's sha1 doesn't match the 602 database value. 603 This indicates a ??serious?? data integrity problem. 604 (note: this error occured during early git development when 605 the database format changed.) 606 607Environment Variables 608 609SHA1_FILE_DIRECTORY 610 used to specify the object database root (usually .git/objects) 611 612GIT_INDEX_FILE 613 used to specify the cache 614 615 616################################################################ 617git-http-pull 618 619 git-http-pull [-c] [-t] [-a] [-v] commit-id url 620 621Downloads a remote GIT repository via HTTP protocol. 622 623-c 624 Get the commit objects. 625-t 626 Get trees associated with the commit objects. 627-a 628 Get all the objects. 629-v 630 Report what is downloaded. 631 632 633################################################################ 634git-init-db 635 git-init-db 636 637This simply creates an empty git object database - basically a .git 638directory and .git/object/??/ directories. 639 640If the object storage directory is specified via the SHA1_FILE_DIRECTORY 641environment variable then the sha1 directories are created underneath - 642otherwise the default .git/objects directory is used. 643 644git-init-db won't hurt an existing repository. 645 646 647################################################################ 648git-local-pull 649 650 git-local-pull [-c] [-t] [-a] [-l] [-s] [-n] [-v] commit-id path 651 652Downloads another GIT repository on a local system. 653 654-c 655 Get the commit objects. 656-t 657 Get trees associated with the commit objects. 658-a 659 Get all the objects. 660-v 661 Report what is downloaded. 662 663################################################################ 664git-ls-files 665 git-ls-files [-z] [-t] 666 (--[cached|deleted|others|ignored|stage|unmerged])* 667 (-[c|d|o|i|s|u])* 668 [-x <pattern>|--exclude=<pattern>] 669 [-X <file>|--exclude-from=<file>] 670 671This merges the file listing in the directory cache index with the 672actual working directory list, and shows different combinations of the 673two. 674 675One or more of the options below may be used to determine the files 676shown: 677 678-c|--cached 679 Show cached files in the output (default) 680 681-d|--deleted 682 Show deleted files in the output 683 684-o|--others 685 Show other files in the output 686 687-i|--ignored 688 Show ignored files in the output 689 Note the this also reverses any exclude list present. 690 691-s|--stage 692 Show stage files in the output 693 694-u|--unmerged 695 Show unmerged files in the output (forces --stage) 696 697-z 698 \0 line termination on output 699 700-x|--exclude=<pattern> 701 Skips files matching pattern. 702 Note that pattern is a shell wildcard pattern. 703 704-X|--exclude-from=<file> 705 exclude patterns are read from <file>; 1 per line. 706 Allows the use of the famous dontdiff file as follows to find 707 out about uncommitted files just as dontdiff is used with 708 the diff command: 709 git-ls-files --others --exclude-from=dontdiff 710 711-t 712 Identify the file status with the following tags (followed by 713 a space) at the start of each line: 714 H cached 715 M unmerged 716 R removed/deleted 717 ? other 718 719Output 720show files just outputs the filename unless --stage is specified in 721which case it outputs: 722 723[<tag> ]<mode> <object> <stage> <file> 724 725git-ls-files --unmerged" and "git-ls-files --stage " can be used to examine 726detailed information on unmerged paths. 727 728For an unmerged path, instead of recording a single mode/SHA1 pair, 729the dircache records up to three such pairs; one from tree O in stage 7301, A in stage 2, and B in stage 3. This information can be used by 731the user (or Cogito) to see what should eventually be recorded at the 732path. (see read-cache for more information on state) 733 734see also: 735read-cache 736 737 738################################################################ 739git-ls-tree 740 git-ls-tree [-r] [-z] <tree-ish> 741 742Converts the tree object to a human readable (and script processable) 743form. 744 745<tree-ish> 746 Id of a tree. 747 748-r 749 recurse into sub-trees 750 751-z 752 \0 line termination on output 753 754Output Format 755<mode>\t <type>\t <object>\t <file> 756 757 758################################################################ 759git-merge-base 760 git-merge-base <commit> <commit> 761 762git-merge-base finds as good a common ancestor as possible. Given a 763selection of equally good common ancestors it should not be relied on 764to decide in any particular way. 765 766The git-merge-base algorithm is still in flux - use the source... 767 768 769################################################################ 770git-merge-cache 771 git-merge-cache <merge-program> (-a | -- | <file>*) 772 773This looks up the <file>(s) in the cache and, if there are any merge 774entries, passes the SHA1 hash for those files as arguments 1, 2, 3 (empty 775argument if no file), and <file> as argument 4. File modes for the three 776files are passed as arguments 5, 6 and 7. 777 778-- 779 Interpret all future arguments as filenames. 780 781-a 782 Run merge against all files in the cache that need merging. 783 784If git-merge-cache is called with multiple <file>s (or -a) then it 785processes them in turn only stopping if merge returns a non-zero exit 786code. 787 788Typically this is run with the a script calling the merge command from 789the RCS package. 790 791A sample script called git-merge-one-file-script is included in the 792ditribution. 793 794ALERT ALERT ALERT! The git "merge object order" is different from the 795RCS "merge" program merge object order. In the above ordering, the 796original is first. But the argument order to the 3-way merge program 797"merge" is to have the original in the middle. Don't ask me why. 798 799Examples: 800 801 torvalds@ppc970:~/merge-test> git-merge-cache cat MM 802 This is MM from the original tree. # original 803 This is modified MM in the branch A. # merge1 804 This is modified MM in the branch B. # merge2 805 This is modified MM in the branch B. # current contents 806 807or 808 809 torvalds@ppc970:~/merge-test> git-merge-cache cat AA MM 810 cat: : No such file or directory 811 This is added AA in the branch A. 812 This is added AA in the branch B. 813 This is added AA in the branch B. 814 fatal: merge program failed 815 816where the latter example shows how "git-merge-cache" will stop trying to 817merge once anything has returned an error (ie "cat" returned an error 818for the AA file, because it didn't exist in the original, and thus 819"git-merge-cache" didn't even try to merge the MM thing). 820 821################################################################ 822git-merge-one-file-script 823 824This is the standard helper program to use with git-merge-cache 825to resolve a merge after the trivial merge done with git-read-tree -m. 826 827################################################################ 828git-mktag 829 830Reads a tag contents from its standard input and creates a tag object. 831The input must be a well formed tag object. 832 833 834################################################################ 835git-prune-script 836 837This runs git-fsck-cache --unreachable program using the heads specified 838on the command line (or .git/refs/heads/* and .git/refs/tags/* if none is 839specified), and prunes all unreachable objects from the object database. 840 841 842################################################################ 843git-pull-script 844 845This script is used by Linus to pull from a remote repository and perform 846a merge. 847 848 849################################################################ 850git-read-tree 851 git-read-tree (<tree-ish> | -m <tree-ish1> [<tree-ish2> <tree-ish3>])" 852 853Reads the tree information given by <tree> into the directory cache, 854but does not actually _update_ any of the files it "caches". (see: 855git-checkout-cache) 856 857Optionally, it can merge a tree into the cache or perform a 3-way 858merge. 859 860Trivial merges are done by git-read-tree itself. Only conflicting paths 861will be in unmerged state when git-read-tree returns. 862 863-m 864 Perform a merge, not just a read 865 866<tree-ish#> 867 The id of the tree object(s) to be read/merged. 868 869 870Merging 871If -m is specified, git-read-tree performs 2 kinds of merge, a single tree 872merge if only 1 tree is given or a 3-way merge if 3 trees are 873provided. 874 875Single Tree Merge 876If only 1 tree is specified, git-read-tree operates as if the user did not 877specify "-m", except that if the original cache has an entry for a 878given pathname; and the contents of the path matches with the tree 879being read, the stat info from the cache is used. (In other words, the 880cache's stat()s take precedence over the merged tree's) 881 882That means that if you do a "git-read-tree -m <newtree>" followed by a 883"git-checkout-cache -f -a", the git-checkout-cache only checks out the stuff 884that really changed. 885 886This is used to avoid unnecessary false hits when git-diff-files is 887run after git-read-tree. 888 8893-Way Merge 890Each "index" entry has two bits worth of "stage" state. stage 0 is the 891normal one, and is the only one you'd see in any kind of normal use. 892 893However, when you do "git-read-tree" with three trees, the "stage" 894starts out at 1. 895 896This means that you can do 897 898 git-read-tree -m <tree1> <tree2> <tree3> 899 900and you will end up with an index with all of the <tree1> entries in 901"stage1", all of the <tree2> entries in "stage2" and all of the 902<tree3> entries in "stage3". 903 904Furthermore, "git-read-tree" has special-case logic that says: if you see 905a file that matches in all respects in the following states, it 906"collapses" back to "stage0": 907 908 - stage 2 and 3 are the same; take one or the other (it makes no 909 difference - the same work has been done on stage 2 and 3) 910 911 - stage 1 and stage 2 are the same and stage 3 is different; take 912 stage 3 (some work has been done on stage 3) 913 914 - stage 1 and stage 3 are the same and stage 2 is different take 915 stage 2 (some work has been done on stage 2) 916 917The git-write-tree command refuses to write a nonsensical tree, and it 918will complain about unmerged entries if it sees a single entry that is not 919stage 0. 920 921Ok, this all sounds like a collection of totally nonsensical rules, 922but it's actually exactly what you want in order to do a fast 923merge. The different stages represent the "result tree" (stage 0, aka 924"merged"), the original tree (stage 1, aka "orig"), and the two trees 925you are trying to merge (stage 2 and 3 respectively). 926 927In fact, the way "git-read-tree" works, it's entirely agnostic about how 928you assign the stages, and you could really assign them any which way, 929and the above is just a suggested way to do it (except since 930"git-write-tree" refuses to write anything but stage0 entries, it makes 931sense to always consider stage 0 to be the "full merge" state). 932 933So what happens? Try it out. Select the original tree, and two trees 934to merge, and look how it works: 935 936 - if a file exists in identical format in all three trees, it will 937 automatically collapse to "merged" state by the new git-read-tree. 938 939 - a file that has _any_ difference what-so-ever in the three trees 940 will stay as separate entries in the index. It's up to "script 941 policy" to determine how to remove the non-0 stages, and insert a 942 merged version. But since the index is always sorted, they're easy 943 to find: they'll be clustered together. 944 945 - the index file saves and restores with all this information, so you 946 can merge things incrementally, but as long as it has entries in 947 stages 1/2/3 (ie "unmerged entries") you can't write the result. 948 949So now the merge algorithm ends up being really simple: 950 951 - you walk the index in order, and ignore all entries of stage 0, 952 since they've already been done. 953 954 - if you find a "stage1", but no matching "stage2" or "stage3", you 955 know it's been removed from both trees (it only existed in the 956 original tree), and you remove that entry. - if you find a 957 matching "stage2" and "stage3" tree, you remove one of them, and 958 turn the other into a "stage0" entry. Remove any matching "stage1" 959 entry if it exists too. .. all the normal trivial rules .. 960 961Incidentally - it also means that you don't even have to have a separate 962subdirectory for this. All the information literally is in the index file, 963which is a temporary thing anyway. There is no need to worry about what is 964in the working directory, since it is never shown and never used. 965 966see also: 967git-write-tree 968git-ls-files 969 970 971################################################################ 972git-resolve-script 973 974This script is used by Linus to merge two trees. 975 976 977################################################################ 978git-rev-list <commit> 979 980Lists commit objects in reverse chronological order starting at the 981given commit, taking ancestry relationship into account. This is 982useful to produce human-readable log output. 983 984 985################################################################ 986git-rev-tree 987 git-rev-tree [--edges] [--cache <cache-file>] [^]<commit> [[^]<commit>] 988 989Provides the revision tree for one or more commits. 990 991--edges 992 Show edges (ie places where the marking changes between parent 993 and child) 994 995--cache <cache-file> 996 Use the specified file as a cache from a previous git-rev-list run 997 to speed things up. Note that this "cache" is totally different 998 concept from the directory index. Also this option is not 999 implemented yet.10001001[^]<commit>1002 The commit id to trace (a leading caret means to ignore this1003 commit-id and below)10041005Output:1006<date> <commit>:<flags> [<parent-commit>:<flags> ]*10071008<date>1009 Date in 'seconds since epoch'10101011<commit>1012 id of commit object10131014<parent-commit>1015 id of each parent commit object (>1 indicates a merge)10161017<flags>10181019 The flags are read as a bitmask representing each commit1020 provided on the commandline. eg: given the command:10211022 $ git-rev-tree <com1> <com2> <com3>10231024 The output:10251026 <date> <commit>:510271028 means that <commit> is reachable from <com1>(1) and <com3>(4)10291030A revtree can get quite large. git-rev-tree will eventually allow you to1031cache previous state so that you don't have to follow the whole thing1032down.10331034So the change difference between two commits is literally10351036 git-rev-tree [commit-id1] > commit1-revtree1037 git-rev-tree [commit-id2] > commit2-revtree1038 join -t : commit1-revtree commit2-revtree > common-revisions10391040(this is also how to find the most common parent - you'd look at just1041the head revisions - the ones that aren't referred to by other1042revisions - in "common-revision", and figure out the best one. I1043think.)104410451046################################################################1047git-rpull10481049 git-rpull [-c] [-t] [-a] [-v] commit-id url10501051Pulls from a remote repository over ssh connection, invoking git-rpush on1052the other end.10531054-c1055 Get the commit objects.1056-t1057 Get trees associated with the commit objects.1058-a1059 Get all the objects.1060-v1061 Report what is downloaded.106210631064################################################################1065git-rpush10661067Helper "server-side" program used by git-rpull.106810691070################################################################1071git-tag-script10721073This is an example script that uses git-mktag to create a tag object1074signed with GPG.107510761077################################################################1078git-tar-tree10791080 git-tar-tree <tree-ish> [ <base> ]10811082Creates a tar archive containing the tree structure for the named tree.1083When <base> is specified it is added as a leading path as the files in the1084generated tar archive.108510861087################################################################1088git-unpack-file1089 git-unpack-file <blob>10901091Creates a file holding the contents of the blob specified by sha1. It1092returns the name of the temporary file in the following format:1093 .merge_file_XXXXX10941095<blob>1096 Must be a blob id10971098################################################################1099git-update-cache1100 git-update-cache1101 [--add] [--remove] [--refresh] [--replace]1102 [--ignore-missing]1103 [--force-remove <file>]1104 [--cacheinfo <mode> <object> <file>]*1105 [--] [<file>]*11061107Modifies the index or directory cache. Each file mentioned is updated1108into the cache and any 'unmerged' or 'needs updating' state is1109cleared.11101111The way git-update-cache handles files it is told about can be modified1112using the various options:11131114--add1115 If a specified file isn't in the cache already then it's1116 added.1117 Default behaviour is to ignore new files.11181119--remove1120 If a specified file is in the cache but is missing then it's1121 removed.1122 Default behaviour is to ignore removed file.11231124--refresh1125 Looks at the current cache and checks to see if merges or1126 updates are needed by checking stat() information.11271128--ignore-missing1129 Ignores missing files during a --refresh11301131--cacheinfo <mode> <object> <path>1132 Directly insert the specified info into the cache.11331134--force-remove1135 Remove the file from the index even when the working directory1136 still has such a file.11371138--replace1139 By default, when a file "path" exists in the index,1140 git-update-cache refuses an attempt to add "path/file".1141 Similarly if a file "path/file" exists, a file "path"1142 cannot be added. With --replace flag, existing entries1143 that conflicts with the entry being added are1144 automatically removed with warning messages.11451146--1147 Do not interpret any more arguments as options.11481149<file>1150 Files to act on.1151 Note that files begining with '.' are discarded. This includes1152 "./file" and "dir/./file". If you don't want this, then use 1153 cleaner names.1154 The same applies to directories ending '/' and paths with '//'11551156Using --refresh1157--refresh does not calculate a new sha1 file or bring the cache1158up-to-date for mode/content changes. But what it _does_ do is to1159"re-match" the stat information of a file with the cache, so that you1160can refresh the cache for a file that hasn't been changed but where1161the stat entry is out of date.11621163For example, you'd want to do this after doing a "git-read-tree", to link1164up the stat cache details with the proper files.11651166Using --cacheinfo1167--cacheinfo is used to register a file that is not in the current1168working directory. This is useful for minimum-checkout merging.11691170To pretend you have a file with mode and sha1 at path, say:11711172 $ git-update-cache --cacheinfo mode sha1 path11731174To update and refresh only the files already checked out:11751176 git-checkout-cache -n -f -a && git-update-cache --ignore-missing --refresh117711781179################################################################1180git-write-blob11811182 git-write-blob <any-file-on-the-filesystem>11831184Writes the contents of the named file (which can be outside of the work1185tree) as a blob into the object database, and reports its object ID to its1186standard output. This is used by git-merge-one-file-script to update the1187cache without modifying files in the work tree.118811891190################################################################1191git-write-tree1192 git-write-tree11931194Creates a tree object using the current cache.11951196The cache must be merged.11971198Conceptually, git-write-tree sync()s the current directory cache contents1199into a set of tree files.1200In order to have that match what is actually in your directory right1201now, you need to have done a "git-update-cache" phase before you did the1202"git-write-tree".120312041205################################################################12061207Output format from git-diff-cache, git-diff-tree and git-diff-files.12081209These commands all compare two sets of things; what are1210compared are different:12111212 git-diff-cache <tree-ish>12131214 compares the <tree-ish> and the files on the filesystem.12151216 git-diff-cache --cached <tree-ish>12171218 compares the <tree-ish> and the cache.12191220 git-diff-tree [-r] <tree-ish-1> <tree-ish-2> [<pattern>...]12211222 compares the trees named by the two arguments.12231224 git-diff-files [<pattern>...]12251226 compares the cache and the files on the filesystem.12271228The following desription uses "old" and "new" to mean those1229compared entities.12301231For files in old but not in new (i.e. removed):1232-<mode> \t <type> \t <object> \t <path>12331234For files not in old but in new (i.e. added):1235+<mode> \t <type> \t <object> \t <path>12361237For files that differ:1238*<old-mode>-><new-mode> \t <type> \t <old-sha1>-><new-sha1> \t <path>12391240<new-sha1> is shown as all 0's if new is a file on the1241filesystem and it is out of sync with the cache. Example:12421243 *100644->100644 blob 5be4a4.......->000000....... file.c12441245################################################################12461247Generating patches12481249When git-diff-cache, git-diff-tree, or git-diff-files are run with a -p1250option, they do not produce the output described in "Output format from1251git-diff-cache, git-diff-tree and git-diff-files" section. It instead1252produces a patch file.12531254The patch generation can be customized at two levels. This1255customization also applies to git-diff-tree-helper.125612571. When the environment variable GIT_EXTERNAL_DIFF is not set,1258 these commands internally invoke diff like this:12591260 diff -L a/<path> -L a/<path> -pu <old> <new>12611262 For added files, /dev/null is used for <old>. For removed1263 files, /dev/null is used for <new>12641265 The diff formatting options can be customized via the1266 environment variable GIT_DIFF_OPTS. For example, if you1267 prefer context diff:12681269 GIT_DIFF_OPTS=-c git-diff-cache -p $(cat .git/HEAD)1270127112722. When the environment variable GIT_EXTERNAL_DIFF is set, the1273 program named by it is called, instead of the diff invocation1274 described above.12751276 For a path that is added, removed, or modified,1277 GIT_EXTERNAL_DIFF is called with 7 parameters:12781279 path old-file old-hex old-mode new-file new-hex new-mode12801281 where1282 <old|new>-file are files GIT_EXTERNAL_DIFF can use to read the1283 contents of <old|ne>,1284 <old|new>-hex are the 40-hexdigit SHA1 hashes,1285 <old|new>-mode are the octal representation of the file modes.12861287 The file parameters can point at the user's working file (e.g. new-file1288 in git-diff-files), /dev/null (e.g. old-file when a new file is added),1289 or a temporary file (e.g. old-file in the cache). GIT_EXTERNAL_DIFF1290 should not worry about unlinking the temporary file --- it is removed1291 when GIT_EXTERNAL_DIFF exits.12921293 For a path that is unmerged, GIT_EXTERNAL_DIFF is called with1294 1 parameter, path.12951296################################################################12971298Terminology: - see README for description1299Each line contains terms used interchangeably13001301object database, .git directory1302directory cache, index1303id, sha1, sha1-id, sha1 hash1304type, tag1305blob, blob object1306tree, tree object1307commit, commit object1308parent1309root object1310changeset131113121313git Environment Variables1314AUTHOR_NAME1315AUTHOR_EMAIL1316AUTHOR_DATE1317COMMIT_AUTHOR_NAME1318COMMIT_AUTHOR_EMAIL1319GIT_DIFF_OPTS1320GIT_EXTERNAL_DIFF1321GIT_INDEX_FILE1322SHA1_FILE_DIRECTORY