1Git User's Manual 2_________________ 3 4This manual is designed to be readable by someone with basic unix 5command-line skills, but no previous knowledge of git. 6 7Chapter 1 gives a brief overview of git commands, without any 8explanation; you may prefer to skip to chapter 2 on a first reading. 9 10Chapters 2 and 3 explain how to fetch and study a project using 11git--the tools you'd need to build and test a particular version of a 12software project, to search for regressions, and so on. 13 14Chapter 4 explains how to do development with git, and chapter 5 how 15to share that development with others. 16 17Further chapters cover more specialized topics. 18 19Comprehensive reference documentation is available through the man 20pages. For a command such as "git clone", just use 21 22------------------------------------------------ 23$ man git-clone 24------------------------------------------------ 25 26Git Quick Start 27=============== 28 29This is a quick summary of the major commands; the following chapters 30will explain how these work in more detail. 31 32Creating a new repository 33------------------------- 34 35From a tarball: 36 37----------------------------------------------- 38$ tar xzf project.tar.gz 39$ cd project 40$ git init 41Initialized empty Git repository in .git/ 42$ git add . 43$ git commit 44----------------------------------------------- 45 46From a remote repository: 47 48----------------------------------------------- 49$ git clone git://example.com/pub/project.git 50$ cd project 51----------------------------------------------- 52 53Managing branches 54----------------- 55 56----------------------------------------------- 57$ git branch # list all branches in this repo 58$ git checkout test # switch working directory to branch "test" 59$ git branch new # create branch "new" starting at current HEAD 60$ git branch -d new # delete branch "new" 61----------------------------------------------- 62 63Instead of basing new branch on current HEAD (the default), use: 64 65----------------------------------------------- 66$ git branch new test # branch named "test" 67$ git branch new v2.6.15 # tag named v2.6.15 68$ git branch new HEAD^ # commit before the most recent 69$ git branch new HEAD^^ # commit before that 70$ git branch new test~10 # ten commits before tip of branch "test" 71----------------------------------------------- 72 73Create and switch to a new branch at the same time: 74 75----------------------------------------------- 76$ git checkout -b new v2.6.15 77----------------------------------------------- 78 79Update and examine branches from the repository you cloned from: 80 81----------------------------------------------- 82$ git fetch # update 83$ git branch -r # list 84 origin/master 85 origin/next 86 ... 87$ git checkout -b masterwork origin/master 88----------------------------------------------- 89 90Fetch a branch from a different repository, and give it a new 91name in your repository: 92 93----------------------------------------------- 94$ git fetch git://example.com/project.git theirbranch:mybranch 95$ git fetch git://example.com/project.git v2.6.15:mybranch 96----------------------------------------------- 97 98Keep a list of repositories you work with regularly: 99 100----------------------------------------------- 101$ git remote add example git://example.com/project.git 102$ git remote # list remote repositories 103example 104origin 105$ git remote show example # get details 106* remote example 107 URL: git://example.com/project.git 108 Tracked remote branches 109 master next ... 110$ git fetch example # update branches from example 111$ git branch -r # list all remote branches 112----------------------------------------------- 113 114 115Exploring history 116----------------- 117 118----------------------------------------------- 119$ gitk # visualize and browse history 120$ git log # list all commits 121$ git log src/ # ...modifying src/ 122$ git log v2.6.15..v2.6.16 # ...in v2.6.16, not in v2.6.15 123$ git log master..test # ...in branch test, not in branch master 124$ git log test..master # ...in branch master, but not in test 125$ git log test...master # ...in one branch, not in both 126$ git log -S'foo()' # ...where difference contain "foo()" 127$ git log --since="2 weeks ago" 128$ git log -p # show patches as well 129$ git show # most recent commit 130$ git diff v2.6.15..v2.6.16 # diff between two tagged versions 131$ git diff v2.6.15..HEAD # diff with current head 132$ git grep "foo()" # search working directory for "foo()" 133$ git grep v2.6.15 "foo()" # search old tree for "foo()" 134$ git show v2.6.15:a.txt # look at old version of a.txt 135----------------------------------------------- 136 137Search for regressions: 138 139----------------------------------------------- 140$ git bisect start 141$ git bisect bad # current version is bad 142$ git bisect good v2.6.13-rc2 # last known good revision 143Bisecting: 675 revisions left to test after this 144 # test here, then: 145$ git bisect good # if this revision is good, or 146$ git bisect bad # if this revision is bad. 147 # repeat until done. 148----------------------------------------------- 149 150Making changes 151-------------- 152 153Make sure git knows who to blame: 154 155------------------------------------------------ 156$ cat >~/.gitconfig <<\EOF 157[user] 158 name = Your Name Comes Here 159 email = you@yourdomain.example.com 160EOF 161------------------------------------------------ 162 163Select file contents to include in the next commit, then make the 164commit: 165 166----------------------------------------------- 167$ git add a.txt # updated file 168$ git add b.txt # new file 169$ git rm c.txt # old file 170$ git commit 171----------------------------------------------- 172 173Or, prepare and create the commit in one step: 174 175----------------------------------------------- 176$ git commit d.txt # use latest content only of d.txt 177$ git commit -a # use latest content of all tracked files 178----------------------------------------------- 179 180Merging 181------- 182 183----------------------------------------------- 184$ git merge test # merge branch "test" into the current branch 185$ git pull git://example.com/project.git master 186 # fetch and merge in remote branch 187$ git pull . test # equivalent to git merge test 188----------------------------------------------- 189 190Sharing your changes 191-------------------- 192 193Importing or exporting patches: 194 195----------------------------------------------- 196$ git format-patch origin..HEAD # format a patch for each commit 197 # in HEAD but not in origin 198$ git am mbox # import patches from the mailbox "mbox" 199----------------------------------------------- 200 201Fetch a branch in a different git repository, then merge into the 202current branch: 203 204----------------------------------------------- 205$ git pull git://example.com/project.git theirbranch 206----------------------------------------------- 207 208Store the fetched branch into a local branch before merging into the 209current branch: 210 211----------------------------------------------- 212$ git pull git://example.com/project.git theirbranch:mybranch 213----------------------------------------------- 214 215After creating commits on a local branch, update the remote 216branch with your commits: 217 218----------------------------------------------- 219$ git push ssh://example.com/project.git mybranch:theirbranch 220----------------------------------------------- 221 222When remote and local branch are both named "test": 223 224----------------------------------------------- 225$ git push ssh://example.com/project.git test 226----------------------------------------------- 227 228Shortcut version for a frequently used remote repository: 229 230----------------------------------------------- 231$ git remote add example ssh://example.com/project.git 232$ git push example test 233----------------------------------------------- 234 235Repository maintenance 236---------------------- 237 238Check for corruption: 239 240----------------------------------------------- 241$ git fsck 242----------------------------------------------- 243 244Recompress, remove unused cruft: 245 246----------------------------------------------- 247$ git gc 248----------------------------------------------- 249 250Repositories and Branches 251========================= 252 253How to get a git repository 254--------------------------- 255 256It will be useful to have a git repository to experiment with as you 257read this manual. 258 259The best way to get one is by using the gitlink:git-clone[1] command 260to download a copy of an existing repository for a project that you 261are interested in. If you don't already have a project in mind, here 262are some interesting examples: 263 264------------------------------------------------ 265 # git itself (approx. 10MB download): 266$ git clone git://git.kernel.org/pub/scm/git/git.git 267 # the linux kernel (approx. 150MB download): 268$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 269------------------------------------------------ 270 271The initial clone may be time-consuming for a large project, but you 272will only need to clone once. 273 274The clone command creates a new directory named after the project 275("git" or "linux-2.6" in the examples above). After you cd into this 276directory, you will see that it contains a copy of the project files, 277together with a special top-level directory named ".git", which 278contains all the information about the history of the project. 279 280In most of the following, examples will be taken from one of the two 281repositories above. 282 283How to check out a different version of a project 284------------------------------------------------- 285 286Git is best thought of as a tool for storing the history of a 287collection of files. It stores the history as a compressed 288collection of interrelated snapshots (versions) of the project's 289contents. 290 291A single git repository may contain multiple branches. It keeps track 292of them by keeping a list of <<def_head,heads>> which reference the 293latest version on each branch; the gitlink:git-branch[1] command shows 294you the list of branch heads: 295 296------------------------------------------------ 297$ git branch 298* master 299------------------------------------------------ 300 301A freshly cloned repository contains a single branch head, by default 302named "master", with the working directory initialized to the state of 303the project referred to by that branch head. 304 305Most projects also use <<def_tag,tags>>. Tags, like heads, are 306references into the project's history, and can be listed using the 307gitlink:git-tag[1] command: 308 309------------------------------------------------ 310$ git tag -l 311v2.6.11 312v2.6.11-tree 313v2.6.12 314v2.6.12-rc2 315v2.6.12-rc3 316v2.6.12-rc4 317v2.6.12-rc5 318v2.6.12-rc6 319v2.6.13 320... 321------------------------------------------------ 322 323Tags are expected to always point at the same version of a project, 324while heads are expected to advance as development progresses. 325 326Create a new branch head pointing to one of these versions and check it 327out using gitlink:git-checkout[1]: 328 329------------------------------------------------ 330$ git checkout -b new v2.6.13 331------------------------------------------------ 332 333The working directory then reflects the contents that the project had 334when it was tagged v2.6.13, and gitlink:git-branch[1] shows two 335branches, with an asterisk marking the currently checked-out branch: 336 337------------------------------------------------ 338$ git branch 339 master 340* new 341------------------------------------------------ 342 343If you decide that you'd rather see version 2.6.17, you can modify 344the current branch to point at v2.6.17 instead, with 345 346------------------------------------------------ 347$ git reset --hard v2.6.17 348------------------------------------------------ 349 350Note that if the current branch head was your only reference to a 351particular point in history, then resetting that branch may leave you 352with no way to find the history it used to point to; so use this command 353carefully. 354 355Understanding History: Commits 356------------------------------ 357 358Every change in the history of a project is represented by a commit. 359The gitlink:git-show[1] command shows the most recent commit on the 360current branch: 361 362------------------------------------------------ 363$ git show 364commit 2b5f6dcce5bf94b9b119e9ed8d537098ec61c3d2 365Author: Jamal Hadi Salim <hadi@cyberus.ca> 366Date: Sat Dec 2 22:22:25 2006 -0800 367 368 [XFRM]: Fix aevent structuring to be more complete. 369 370 aevents can not uniquely identify an SA. We break the ABI with this 371 patch, but consensus is that since it is not yet utilized by any 372 (known) application then it is fine (better do it now than later). 373 374 Signed-off-by: Jamal Hadi Salim <hadi@cyberus.ca> 375 Signed-off-by: David S. Miller <davem@davemloft.net> 376 377diff --git a/Documentation/networking/xfrm_sync.txt b/Documentation/networking/xfrm_sync.txt 378index 8be626f..d7aac9d 100644 379--- a/Documentation/networking/xfrm_sync.txt 380+++ b/Documentation/networking/xfrm_sync.txt 381@@ -47,10 +47,13 @@ aevent_id structure looks like: 382 383 struct xfrm_aevent_id { 384 struct xfrm_usersa_id sa_id; 385+ xfrm_address_t saddr; 386 __u32 flags; 387+ __u32 reqid; 388 }; 389... 390------------------------------------------------ 391 392As you can see, a commit shows who made the latest change, what they 393did, and why. 394 395Every commit has a 40-hexdigit id, sometimes called the "object name" or the 396"SHA1 id", shown on the first line of the "git show" output. You can usually 397refer to a commit by a shorter name, such as a tag or a branch name, but this 398longer name can also be useful. Most importantly, it is a globally unique 399name for this commit: so if you tell somebody else the object name (for 400example in email), then you are guaranteed that name will refer to the same 401commit in their repository that it does in yours (assuming their repository 402has that commit at all). Since the object name is computed as a hash over the 403contents of the commit, you are guaranteed that the commit can never change 404without its name also changing. 405 406In fact, in <<git-internals>> we shall see that everything stored in git 407history, including file data and directory contents, is stored in an object 408with a name that is a hash of its contents. 409 410Understanding history: commits, parents, and reachability 411~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 412 413Every commit (except the very first commit in a project) also has a 414parent commit which shows what happened before this commit. 415Following the chain of parents will eventually take you back to the 416beginning of the project. 417 418However, the commits do not form a simple list; git allows lines of 419development to diverge and then reconverge, and the point where two 420lines of development reconverge is called a "merge". The commit 421representing a merge can therefore have more than one parent, with 422each parent representing the most recent commit on one of the lines 423of development leading to that point. 424 425The best way to see how this works is using the gitlink:gitk[1] 426command; running gitk now on a git repository and looking for merge 427commits will help understand how the git organizes history. 428 429In the following, we say that commit X is "reachable" from commit Y 430if commit X is an ancestor of commit Y. Equivalently, you could say 431that Y is a descendent of X, or that there is a chain of parents 432leading from commit Y to commit X. 433 434Understanding history: History diagrams 435~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 437We will sometimes represent git history using diagrams like the one 438below. Commits are shown as "o", and the links between them with 439lines drawn with - / and \. Time goes left to right: 440 441 442................................................ 443 o--o--o <-- Branch A 444 / 445 o--o--o <-- master 446 \ 447 o--o--o <-- Branch B 448................................................ 449 450If we need to talk about a particular commit, the character "o" may 451be replaced with another letter or number. 452 453Understanding history: What is a branch? 454~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 455 456When we need to be precise, we will use the word "branch" to mean a line 457of development, and "branch head" (or just "head") to mean a reference 458to the most recent commit on a branch. In the example above, the branch 459head named "A" is a pointer to one particular commit, but we refer to 460the line of three commits leading up to that point as all being part of 461"branch A". 462 463However, when no confusion will result, we often just use the term 464"branch" both for branches and for branch heads. 465 466Manipulating branches 467--------------------- 468 469Creating, deleting, and modifying branches is quick and easy; here's 470a summary of the commands: 471 472git branch:: 473 list all branches 474git branch <branch>:: 475 create a new branch named <branch>, referencing the same 476 point in history as the current branch 477git branch <branch> <start-point>:: 478 create a new branch named <branch>, referencing 479 <start-point>, which may be specified any way you like, 480 including using a branch name or a tag name 481git branch -d <branch>:: 482 delete the branch <branch>; if the branch you are deleting 483 points to a commit which is not reachable from this branch, 484 this command will fail with a warning. 485git branch -D <branch>:: 486 even if the branch points to a commit not reachable 487 from the current branch, you may know that that commit 488 is still reachable from some other branch or tag. In that 489 case it is safe to use this command to force git to delete 490 the branch. 491git checkout <branch>:: 492 make the current branch <branch>, updating the working 493 directory to reflect the version referenced by <branch> 494git checkout -b <new> <start-point>:: 495 create a new branch <new> referencing <start-point>, and 496 check it out. 497 498The special symbol "HEAD" can always be used to refer to the current 499branch. In fact, git uses a file named "HEAD" in the .git directory to 500remember which branch is current: 501 502------------------------------------------------ 503$ cat .git/HEAD 504ref: refs/heads/master 505------------------------------------------------ 506 507[[detached-head]] 508Examining an old version without creating a new branch 509------------------------------------------------------ 510 511The git-checkout command normally expects a branch head, but will also 512accept an arbitrary commit; for example, you can check out the commit 513referenced by a tag: 514 515------------------------------------------------ 516$ git checkout v2.6.17 517Note: moving to "v2.6.17" which isn't a local branch 518If you want to create a new branch from this checkout, you may do so 519(now or later) by using -b with the checkout command again. Example: 520 git checkout -b <new_branch_name> 521HEAD is now at 427abfa... Linux v2.6.17 522------------------------------------------------ 523 524The HEAD then refers to the SHA1 of the commit instead of to a branch, 525and git branch shows that you are no longer on a branch: 526 527------------------------------------------------ 528$ cat .git/HEAD 529427abfa28afedffadfca9dd8b067eb6d36bac53f 530git branch 531* (no branch) 532 master 533------------------------------------------------ 534 535In this case we say that the HEAD is "detached". 536 537This can be an easy way to check out a particular version without having 538to make up a name for a new branch. However, keep in mind that when you 539switch away from the (for example, by checking out something else), you 540can lose track of what the HEAD used to point to. 541 542Examining branches from a remote repository 543------------------------------------------- 544 545The "master" branch that was created at the time you cloned is a copy 546of the HEAD in the repository that you cloned from. That repository 547may also have had other branches, though, and your local repository 548keeps branches which track each of those remote branches, which you 549can view using the "-r" option to gitlink:git-branch[1]: 550 551------------------------------------------------ 552$ git branch -r 553 origin/HEAD 554 origin/html 555 origin/maint 556 origin/man 557 origin/master 558 origin/next 559 origin/pu 560 origin/todo 561------------------------------------------------ 562 563You cannot check out these remote-tracking branches, but you can 564examine them on a branch of your own, just as you would a tag: 565 566------------------------------------------------ 567$ git checkout -b my-todo-copy origin/todo 568------------------------------------------------ 569 570Note that the name "origin" is just the name that git uses by default 571to refer to the repository that you cloned from. 572 573[[how-git-stores-references]] 574Naming branches, tags, and other references 575------------------------------------------- 576 577Branches, remote-tracking branches, and tags are all references to 578commits. All references are named with a slash-separated path name 579starting with "refs"; the names we've been using so far are actually 580shorthand: 581 582 - The branch "test" is short for "refs/heads/test". 583 - The tag "v2.6.18" is short for "refs/tags/v2.6.18". 584 - "origin/master" is short for "refs/remotes/origin/master". 585 586The full name is occasionally useful if, for example, there ever 587exists a tag and a branch with the same name. 588 589As another useful shortcut, if the repository "origin" posesses only 590a single branch, you can refer to that branch as just "origin". 591 592More generally, if you have defined a remote repository named 593"example", you can refer to the branch in that repository as 594"example". And for a repository with multiple branches, this will 595refer to the branch designated as the "HEAD" branch. 596 597For the complete list of paths which git checks for references, and 598the order it uses to decide which to choose when there are multiple 599references with the same shorthand name, see the "SPECIFYING 600REVISIONS" section of gitlink:git-rev-parse[1]. 601 602[[Updating-a-repository-with-git-fetch]] 603Updating a repository with git fetch 604------------------------------------ 605 606Eventually the developer cloned from will do additional work in her 607repository, creating new commits and advancing the branches to point 608at the new commits. 609 610The command "git fetch", with no arguments, will update all of the 611remote-tracking branches to the latest version found in her 612repository. It will not touch any of your own branches--not even the 613"master" branch that was created for you on clone. 614 615Fetching branches from other repositories 616----------------------------------------- 617 618You can also track branches from repositories other than the one you 619cloned from, using gitlink:git-remote[1]: 620 621------------------------------------------------- 622$ git remote add linux-nfs git://linux-nfs.org/pub/nfs-2.6.git 623$ git fetch linux-nfs 624* refs/remotes/linux-nfs/master: storing branch 'master' ... 625 commit: bf81b46 626------------------------------------------------- 627 628New remote-tracking branches will be stored under the shorthand name 629that you gave "git remote add", in this case linux-nfs: 630 631------------------------------------------------- 632$ git branch -r 633linux-nfs/master 634origin/master 635------------------------------------------------- 636 637If you run "git fetch <remote>" later, the tracking branches for the 638named <remote> will be updated. 639 640If you examine the file .git/config, you will see that git has added 641a new stanza: 642 643------------------------------------------------- 644$ cat .git/config 645... 646[remote "linux-nfs"] 647 url = git://linux-nfs.org/pub/nfs-2.6.git 648 fetch = +refs/heads/*:refs/remotes/linux-nfs/* 649... 650------------------------------------------------- 651 652This is what causes git to track the remote's branches; you may modify 653or delete these configuration options by editing .git/config with a 654text editor. (See the "CONFIGURATION FILE" section of 655gitlink:git-config[1] for details.) 656 657Exploring git history 658===================== 659 660Git is best thought of as a tool for storing the history of a 661collection of files. It does this by storing compressed snapshots of 662the contents of a file heirarchy, together with "commits" which show 663the relationships between these snapshots. 664 665Git provides extremely flexible and fast tools for exploring the 666history of a project. 667 668We start with one specialized tool that is useful for finding the 669commit that introduced a bug into a project. 670 671How to use bisect to find a regression 672-------------------------------------- 673 674Suppose version 2.6.18 of your project worked, but the version at 675"master" crashes. Sometimes the best way to find the cause of such a 676regression is to perform a brute-force search through the project's 677history to find the particular commit that caused the problem. The 678gitlink:git-bisect[1] command can help you do this: 679 680------------------------------------------------- 681$ git bisect start 682$ git bisect good v2.6.18 683$ git bisect bad master 684Bisecting: 3537 revisions left to test after this 685[65934a9a028b88e83e2b0f8b36618fe503349f8e] BLOCK: Make USB storage depend on SCSI rather than selecting it [try #6] 686------------------------------------------------- 687 688If you run "git branch" at this point, you'll see that git has 689temporarily moved you to a new branch named "bisect". This branch 690points to a commit (with commit id 65934...) that is reachable from 691v2.6.19 but not from v2.6.18. Compile and test it, and see whether 692it crashes. Assume it does crash. Then: 693 694------------------------------------------------- 695$ git bisect bad 696Bisecting: 1769 revisions left to test after this 697[7eff82c8b1511017ae605f0c99ac275a7e21b867] i2c-core: Drop useless bitmaskings 698------------------------------------------------- 699 700checks out an older version. Continue like this, telling git at each 701stage whether the version it gives you is good or bad, and notice 702that the number of revisions left to test is cut approximately in 703half each time. 704 705After about 13 tests (in this case), it will output the commit id of 706the guilty commit. You can then examine the commit with 707gitlink:git-show[1], find out who wrote it, and mail them your bug 708report with the commit id. Finally, run 709 710------------------------------------------------- 711$ git bisect reset 712------------------------------------------------- 713 714to return you to the branch you were on before and delete the 715temporary "bisect" branch. 716 717Note that the version which git-bisect checks out for you at each 718point is just a suggestion, and you're free to try a different 719version if you think it would be a good idea. For example, 720occasionally you may land on a commit that broke something unrelated; 721run 722 723------------------------------------------------- 724$ git bisect visualize 725------------------------------------------------- 726 727which will run gitk and label the commit it chose with a marker that 728says "bisect". Chose a safe-looking commit nearby, note its commit 729id, and check it out with: 730 731------------------------------------------------- 732$ git reset --hard fb47ddb2db... 733------------------------------------------------- 734 735then test, run "bisect good" or "bisect bad" as appropriate, and 736continue. 737 738Naming commits 739-------------- 740 741We have seen several ways of naming commits already: 742 743 - 40-hexdigit object name 744 - branch name: refers to the commit at the head of the given 745 branch 746 - tag name: refers to the commit pointed to by the given tag 747 (we've seen branches and tags are special cases of 748 <<how-git-stores-references,references>>). 749 - HEAD: refers to the head of the current branch 750 751There are many more; see the "SPECIFYING REVISIONS" section of the 752gitlink:git-rev-parse[1] man page for the complete list of ways to 753name revisions. Some examples: 754 755------------------------------------------------- 756$ git show fb47ddb2 # the first few characters of the object name 757 # are usually enough to specify it uniquely 758$ git show HEAD^ # the parent of the HEAD commit 759$ git show HEAD^^ # the grandparent 760$ git show HEAD~4 # the great-great-grandparent 761------------------------------------------------- 762 763Recall that merge commits may have more than one parent; by default, 764^ and ~ follow the first parent listed in the commit, but you can 765also choose: 766 767------------------------------------------------- 768$ git show HEAD^1 # show the first parent of HEAD 769$ git show HEAD^2 # show the second parent of HEAD 770------------------------------------------------- 771 772In addition to HEAD, there are several other special names for 773commits: 774 775Merges (to be discussed later), as well as operations such as 776git-reset, which change the currently checked-out commit, generally 777set ORIG_HEAD to the value HEAD had before the current operation. 778 779The git-fetch operation always stores the head of the last fetched 780branch in FETCH_HEAD. For example, if you run git fetch without 781specifying a local branch as the target of the operation 782 783------------------------------------------------- 784$ git fetch git://example.com/proj.git theirbranch 785------------------------------------------------- 786 787the fetched commits will still be available from FETCH_HEAD. 788 789When we discuss merges we'll also see the special name MERGE_HEAD, 790which refers to the other branch that we're merging in to the current 791branch. 792 793The gitlink:git-rev-parse[1] command is a low-level command that is 794occasionally useful for translating some name for a commit to the object 795name for that commit: 796 797------------------------------------------------- 798$ git rev-parse origin 799e05db0fd4f31dde7005f075a84f96b360d05984b 800------------------------------------------------- 801 802Creating tags 803------------- 804 805We can also create a tag to refer to a particular commit; after 806running 807 808------------------------------------------------- 809$ git tag stable-1 1b2e1d63ff 810------------------------------------------------- 811 812You can use stable-1 to refer to the commit 1b2e1d63ff. 813 814This creates a "lightweight" tag. If the tag is a tag you wish to 815share with others, and possibly sign cryptographically, then you 816should create a tag object instead; see the gitlink:git-tag[1] man 817page for details. 818 819Browsing revisions 820------------------ 821 822The gitlink:git-log[1] command can show lists of commits. On its 823own, it shows all commits reachable from the parent commit; but you 824can also make more specific requests: 825 826------------------------------------------------- 827$ git log v2.5.. # commits since (not reachable from) v2.5 828$ git log test..master # commits reachable from master but not test 829$ git log master..test # ...reachable from test but not master 830$ git log master...test # ...reachable from either test or master, 831 # but not both 832$ git log --since="2 weeks ago" # commits from the last 2 weeks 833$ git log Makefile # commits which modify Makefile 834$ git log fs/ # ... which modify any file under fs/ 835$ git log -S'foo()' # commits which add or remove any file data 836 # matching the string 'foo()' 837------------------------------------------------- 838 839And of course you can combine all of these; the following finds 840commits since v2.5 which touch the Makefile or any file under fs: 841 842------------------------------------------------- 843$ git log v2.5.. Makefile fs/ 844------------------------------------------------- 845 846You can also ask git log to show patches: 847 848------------------------------------------------- 849$ git log -p 850------------------------------------------------- 851 852See the "--pretty" option in the gitlink:git-log[1] man page for more 853display options. 854 855Note that git log starts with the most recent commit and works 856backwards through the parents; however, since git history can contain 857multiple independent lines of development, the particular order that 858commits are listed in may be somewhat arbitrary. 859 860Generating diffs 861---------------- 862 863You can generate diffs between any two versions using 864gitlink:git-diff[1]: 865 866------------------------------------------------- 867$ git diff master..test 868------------------------------------------------- 869 870Sometimes what you want instead is a set of patches: 871 872------------------------------------------------- 873$ git format-patch master..test 874------------------------------------------------- 875 876will generate a file with a patch for each commit reachable from test 877but not from master. Note that if master also has commits which are 878not reachable from test, then the combined result of these patches 879will not be the same as the diff produced by the git-diff example. 880 881Viewing old file versions 882------------------------- 883 884You can always view an old version of a file by just checking out the 885correct revision first. But sometimes it is more convenient to be 886able to view an old version of a single file without checking 887anything out; this command does that: 888 889------------------------------------------------- 890$ git show v2.5:fs/locks.c 891------------------------------------------------- 892 893Before the colon may be anything that names a commit, and after it 894may be any path to a file tracked by git. 895 896Examples 897-------- 898 899Check whether two branches point at the same history 900~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 901 902Suppose you want to check whether two branches point at the same point 903in history. 904 905------------------------------------------------- 906$ git diff origin..master 907------------------------------------------------- 908 909will tell you whether the contents of the project are the same at the 910two branches; in theory, however, it's possible that the same project 911contents could have been arrived at by two different historical 912routes. You could compare the object names: 913 914------------------------------------------------- 915$ git rev-list origin 916e05db0fd4f31dde7005f075a84f96b360d05984b 917$ git rev-list master 918e05db0fd4f31dde7005f075a84f96b360d05984b 919------------------------------------------------- 920 921Or you could recall that the ... operator selects all commits 922contained reachable from either one reference or the other but not 923both: so 924 925------------------------------------------------- 926$ git log origin...master 927------------------------------------------------- 928 929will return no commits when the two branches are equal. 930 931Find first tagged version including a given fix 932~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 933 934Suppose you know that the commit e05db0fd fixed a certain problem. 935You'd like to find the earliest tagged release that contains that 936fix. 937 938Of course, there may be more than one answer--if the history branched 939after commit e05db0fd, then there could be multiple "earliest" tagged 940releases. 941 942You could just visually inspect the commits since e05db0fd: 943 944------------------------------------------------- 945$ gitk e05db0fd.. 946------------------------------------------------- 947 948Or you can use gitlink:git-name-rev[1], which will give the commit a 949name based on any tag it finds pointing to one of the commit's 950descendants: 951 952------------------------------------------------- 953$ git name-rev --tags e05db0fd 954e05db0fd tags/v1.5.0-rc1^0~23 955------------------------------------------------- 956 957The gitlink:git-describe[1] command does the opposite, naming the 958revision using a tag on which the given commit is based: 959 960------------------------------------------------- 961$ git describe e05db0fd 962v1.5.0-rc0-260-ge05db0f 963------------------------------------------------- 964 965but that may sometimes help you guess which tags might come after the 966given commit. 967 968If you just want to verify whether a given tagged version contains a 969given commit, you could use gitlink:git-merge-base[1]: 970 971------------------------------------------------- 972$ git merge-base e05db0fd v1.5.0-rc1 973e05db0fd4f31dde7005f075a84f96b360d05984b 974------------------------------------------------- 975 976The merge-base command finds a common ancestor of the given commits, 977and always returns one or the other in the case where one is a 978descendant of the other; so the above output shows that e05db0fd 979actually is an ancestor of v1.5.0-rc1. 980 981Alternatively, note that 982 983------------------------------------------------- 984$ git log v1.5.0-rc1..e05db0fd 985------------------------------------------------- 986 987will produce empty output if and only if v1.5.0-rc1 includes e05db0fd, 988because it outputs only commits that are not reachable from v1.5.0-rc1. 989 990As yet another alternative, the gitlink:git-show-branch[1] command lists 991the commits reachable from its arguments with a display on the left-hand 992side that indicates which arguments that commit is reachable from. So, 993you can run something like 994 995------------------------------------------------- 996$ git show-branch e05db0fd v1.5.0-rc0 v1.5.0-rc1 v1.5.0-rc2 997! [e05db0fd] Fix warnings in sha1_file.c - use C99 printf format if 998available 999 ! [v1.5.0-rc0] GIT v1.5.0 preview1000 ! [v1.5.0-rc1] GIT v1.5.0-rc11001 ! [v1.5.0-rc2] GIT v1.5.0-rc21002...1003-------------------------------------------------10041005then search for a line that looks like10061007-------------------------------------------------1008+ ++ [e05db0fd] Fix warnings in sha1_file.c - use C99 printf format if1009available1010-------------------------------------------------10111012Which shows that e05db0fd is reachable from itself, from v1.5.0-rc1, and1013from v1.5.0-rc2, but not from v1.5.0-rc0.101410151016Developing with git1017===================10181019Telling git your name1020---------------------10211022Before creating any commits, you should introduce yourself to git. The1023easiest way to do so is:10241025------------------------------------------------1026$ cat >~/.gitconfig <<\EOF1027[user]1028 name = Your Name Comes Here1029 email = you@yourdomain.example.com1030EOF1031------------------------------------------------10321033(See the "CONFIGURATION FILE" section of gitlink:git-config[1] for1034details on the configuration file.)103510361037Creating a new repository1038-------------------------10391040Creating a new repository from scratch is very easy:10411042-------------------------------------------------1043$ mkdir project1044$ cd project1045$ git init1046-------------------------------------------------10471048If you have some initial content (say, a tarball):10491050-------------------------------------------------1051$ tar -xzvf project.tar.gz1052$ cd project1053$ git init1054$ git add . # include everything below ./ in the first commit:1055$ git commit1056-------------------------------------------------10571058[[how-to-make-a-commit]]1059How to make a commit1060--------------------10611062Creating a new commit takes three steps:10631064 1. Making some changes to the working directory using your1065 favorite editor.1066 2. Telling git about your changes.1067 3. Creating the commit using the content you told git about1068 in step 2.10691070In practice, you can interleave and repeat steps 1 and 2 as many1071times as you want: in order to keep track of what you want committed1072at step 3, git maintains a snapshot of the tree's contents in a1073special staging area called "the index."10741075At the beginning, the content of the index will be identical to1076that of the HEAD. The command "git diff --cached", which shows1077the difference between the HEAD and the index, should therefore1078produce no output at that point.10791080Modifying the index is easy:10811082To update the index with the new contents of a modified file, use10831084-------------------------------------------------1085$ git add path/to/file1086-------------------------------------------------10871088To add the contents of a new file to the index, use10891090-------------------------------------------------1091$ git add path/to/file1092-------------------------------------------------10931094To remove a file from the index and from the working tree,10951096-------------------------------------------------1097$ git rm path/to/file1098-------------------------------------------------10991100After each step you can verify that11011102-------------------------------------------------1103$ git diff --cached1104-------------------------------------------------11051106always shows the difference between the HEAD and the index file--this1107is what you'd commit if you created the commit now--and that11081109-------------------------------------------------1110$ git diff1111-------------------------------------------------11121113shows the difference between the working tree and the index file.11141115Note that "git add" always adds just the current contents of a file1116to the index; further changes to the same file will be ignored unless1117you run git-add on the file again.11181119When you're ready, just run11201121-------------------------------------------------1122$ git commit1123-------------------------------------------------11241125and git will prompt you for a commit message and then create the new1126commit. Check to make sure it looks like what you expected with11271128-------------------------------------------------1129$ git show1130-------------------------------------------------11311132As a special shortcut,11331134-------------------------------------------------1135$ git commit -a1136-------------------------------------------------11371138will update the index with any files that you've modified or removed1139and create a commit, all in one step.11401141A number of commands are useful for keeping track of what you're1142about to commit:11431144-------------------------------------------------1145$ git diff --cached # difference between HEAD and the index; what1146 # would be commited if you ran "commit" now.1147$ git diff # difference between the index file and your1148 # working directory; changes that would not1149 # be included if you ran "commit" now.1150$ git status # a brief per-file summary of the above.1151-------------------------------------------------11521153Creating good commit messages1154-----------------------------11551156Though not required, it's a good idea to begin the commit message1157with a single short (less than 50 character) line summarizing the1158change, followed by a blank line and then a more thorough1159description. Tools that turn commits into email, for example, use1160the first line on the Subject line and the rest of the commit in the1161body.11621163How to merge1164------------11651166You can rejoin two diverging branches of development using1167gitlink:git-merge[1]:11681169-------------------------------------------------1170$ git merge branchname1171-------------------------------------------------11721173merges the development in the branch "branchname" into the current1174branch. If there are conflicts--for example, if the same file is1175modified in two different ways in the remote branch and the local1176branch--then you are warned; the output may look something like this:11771178-------------------------------------------------1179$ git merge next1180 100% (4/4) done1181Auto-merged file.txt1182CONFLICT (content): Merge conflict in file.txt1183Automatic merge failed; fix conflicts and then commit the result.1184-------------------------------------------------11851186Conflict markers are left in the problematic files, and after1187you resolve the conflicts manually, you can update the index1188with the contents and run git commit, as you normally would when1189creating a new file.11901191If you examine the resulting commit using gitk, you will see that it1192has two parents, one pointing to the top of the current branch, and1193one to the top of the other branch.11941195In more detail:11961197[[resolving-a-merge]]1198Resolving a merge1199-----------------12001201When a merge isn't resolved automatically, git leaves the index and1202the working tree in a special state that gives you all the1203information you need to help resolve the merge.12041205Files with conflicts are marked specially in the index, so until you1206resolve the problem and update the index, gitlink:git-commit[1] will1207fail:12081209-------------------------------------------------1210$ git commit1211file.txt: needs merge1212-------------------------------------------------12131214Also, gitlink:git-status[1] will list those files as "unmerged", and the1215files with conflicts will have conflict markers added, like this:12161217-------------------------------------------------1218<<<<<<< HEAD:file.txt1219Hello world1220=======1221Goodbye1222>>>>>>> 77976da35a11db4580b80ae27e8d65caf5208086:file.txt1223-------------------------------------------------12241225All you need to do is edit the files to resolve the conflicts, and then12261227-------------------------------------------------1228$ git add file.txt1229$ git commit1230-------------------------------------------------12311232Note that the commit message will already be filled in for you with1233some information about the merge. Normally you can just use this1234default message unchanged, but you may add additional commentary of1235your own if desired.12361237The above is all you need to know to resolve a simple merge. But git1238also provides more information to help resolve conflicts:12391240Getting conflict-resolution help during a merge1241~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~12421243All of the changes that git was able to merge automatically are1244already added to the index file, so gitlink:git-diff[1] shows only1245the conflicts. It uses an unusual syntax:12461247-------------------------------------------------1248$ git diff1249diff --cc file.txt1250index 802992c,2b60207..00000001251--- a/file.txt1252+++ b/file.txt1253@@@ -1,1 -1,1 +1,5 @@@1254++<<<<<<< HEAD:file.txt1255 +Hello world1256++=======1257+ Goodbye1258++>>>>>>> 77976da35a11db4580b80ae27e8d65caf5208086:file.txt1259-------------------------------------------------12601261Recall that the commit which will be commited after we resolve this1262conflict will have two parents instead of the usual one: one parent1263will be HEAD, the tip of the current branch; the other will be the1264tip of the other branch, which is stored temporarily in MERGE_HEAD.12651266During the merge, the index holds three versions of each file. Each of1267these three "file stages" represents a different version of the file:12681269-------------------------------------------------1270$ git show :1:file.txt # the file in a common ancestor of both branches1271$ git show :2:file.txt # the version from HEAD, but including any1272 # nonconflicting changes from MERGE_HEAD1273$ git show :3:file.txt # the version from MERGE_HEAD, but including any1274 # nonconflicting changes from HEAD.1275-------------------------------------------------12761277Since the stage 2 and stage 3 versions have already been updated with1278nonconflicting changes, the only remaining differences between them are1279the important ones; thus gitlink:git-diff[1] can use the information in1280the index to show only those conflicts.12811282The diff above shows the differences between the working-tree version of1283file.txt and the stage 2 and stage 3 versions. So instead of preceding1284each line by a single "+" or "-", it now uses two columns: the first1285column is used for differences between the first parent and the working1286directory copy, and the second for differences between the second parent1287and the working directory copy. (See the "COMBINED DIFF FORMAT" section1288of gitlink:git-diff-files[1] for a details of the format.)12891290After resolving the conflict in the obvious way (but before updating the1291index), the diff will look like:12921293-------------------------------------------------1294$ git diff1295diff --cc file.txt1296index 802992c,2b60207..00000001297--- a/file.txt1298+++ b/file.txt1299@@@ -1,1 -1,1 +1,1 @@@1300- Hello world1301 -Goodbye1302++Goodbye world1303-------------------------------------------------13041305This shows that our resolved version deleted "Hello world" from the1306first parent, deleted "Goodbye" from the second parent, and added1307"Goodbye world", which was previously absent from both.13081309Some special diff options allow diffing the working directory against1310any of these stages:13111312-------------------------------------------------1313$ git diff -1 file.txt # diff against stage 11314$ git diff --base file.txt # same as the above1315$ git diff -2 file.txt # diff against stage 21316$ git diff --ours file.txt # same as the above1317$ git diff -3 file.txt # diff against stage 31318$ git diff --theirs file.txt # same as the above.1319-------------------------------------------------13201321The gitlink:git-log[1] and gitk[1] commands also provide special help1322for merges:13231324-------------------------------------------------1325$ git log --merge1326$ gitk --merge1327-------------------------------------------------13281329These will display all commits which exist only on HEAD or on1330MERGE_HEAD, and which touch an unmerged file.13311332Each time you resolve the conflicts in a file and update the index:13331334-------------------------------------------------1335$ git add file.txt1336-------------------------------------------------13371338the different stages of that file will be "collapsed", after which1339git-diff will (by default) no longer show diffs for that file.13401341[[undoing-a-merge]]1342Undoing a merge1343---------------13441345If you get stuck and decide to just give up and throw the whole mess1346away, you can always return to the pre-merge state with13471348-------------------------------------------------1349$ git reset --hard HEAD1350-------------------------------------------------13511352Or, if you've already commited the merge that you want to throw away,13531354-------------------------------------------------1355$ git reset --hard ORIG_HEAD1356-------------------------------------------------13571358However, this last command can be dangerous in some cases--never1359throw away a commit you have already committed if that commit may1360itself have been merged into another branch, as doing so may confuse1361further merges.13621363Fast-forward merges1364-------------------13651366There is one special case not mentioned above, which is treated1367differently. Normally, a merge results in a merge commit, with two1368parents, one pointing at each of the two lines of development that1369were merged.13701371However, if one of the two lines of development is completely1372contained within the other--so every commit present in the one is1373already contained in the other--then git just performs a1374<<fast-forwards,fast forward>>; the head of the current branch is1375moved forward to point at the head of the merged-in branch, without1376any new commits being created.13771378Fixing mistakes1379---------------13801381If you've messed up the working tree, but haven't yet committed your1382mistake, you can return the entire working tree to the last committed1383state with13841385-------------------------------------------------1386$ git reset --hard HEAD1387-------------------------------------------------13881389If you make a commit that you later wish you hadn't, there are two1390fundamentally different ways to fix the problem:13911392 1. You can create a new commit that undoes whatever was done1393 by the previous commit. This is the correct thing if your1394 mistake has already been made public.13951396 2. You can go back and modify the old commit. You should1397 never do this if you have already made the history public;1398 git does not normally expect the "history" of a project to1399 change, and cannot correctly perform repeated merges from1400 a branch that has had its history changed.14011402Fixing a mistake with a new commit1403~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~14041405Creating a new commit that reverts an earlier change is very easy;1406just pass the gitlink:git-revert[1] command a reference to the bad1407commit; for example, to revert the most recent commit:14081409-------------------------------------------------1410$ git revert HEAD1411-------------------------------------------------14121413This will create a new commit which undoes the change in HEAD. You1414will be given a chance to edit the commit message for the new commit.14151416You can also revert an earlier change, for example, the next-to-last:14171418-------------------------------------------------1419$ git revert HEAD^1420-------------------------------------------------14211422In this case git will attempt to undo the old change while leaving1423intact any changes made since then. If more recent changes overlap1424with the changes to be reverted, then you will be asked to fix1425conflicts manually, just as in the case of <<resolving-a-merge,1426resolving a merge>>.14271428[[fixing-a-mistake-by-editing-history]]1429Fixing a mistake by editing history1430~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~14311432If the problematic commit is the most recent commit, and you have not1433yet made that commit public, then you may just1434<<undoing-a-merge,destroy it using git-reset>>.14351436Alternatively, you1437can edit the working directory and update the index to fix your1438mistake, just as if you were going to <<how-to-make-a-commit,create a1439new commit>>, then run14401441-------------------------------------------------1442$ git commit --amend1443-------------------------------------------------14441445which will replace the old commit by a new commit incorporating your1446changes, giving you a chance to edit the old commit message first.14471448Again, you should never do this to a commit that may already have1449been merged into another branch; use gitlink:git-revert[1] instead in1450that case.14511452It is also possible to edit commits further back in the history, but1453this is an advanced topic to be left for1454<<cleaning-up-history,another chapter>>.14551456Checking out an old version of a file1457~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~14581459In the process of undoing a previous bad change, you may find it1460useful to check out an older version of a particular file using1461gitlink:git-checkout[1]. We've used git checkout before to switch1462branches, but it has quite different behavior if it is given a path1463name: the command14641465-------------------------------------------------1466$ git checkout HEAD^ path/to/file1467-------------------------------------------------14681469replaces path/to/file by the contents it had in the commit HEAD^, and1470also updates the index to match. It does not change branches.14711472If you just want to look at an old version of the file, without1473modifying the working directory, you can do that with1474gitlink:git-show[1]:14751476-------------------------------------------------1477$ git show HEAD^:path/to/file1478-------------------------------------------------14791480which will display the given version of the file.14811482Ensuring good performance1483-------------------------14841485On large repositories, git depends on compression to keep the history1486information from taking up to much space on disk or in memory.14871488This compression is not performed automatically. Therefore you1489should occasionally run gitlink:git-gc[1]:14901491-------------------------------------------------1492$ git gc1493-------------------------------------------------14941495to recompress the archive. This can be very time-consuming, so1496you may prefer to run git-gc when you are not doing other work.14971498Ensuring reliability1499--------------------15001501Checking the repository for corruption1502~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~15031504The gitlink:git-fsck[1] command runs a number of self-consistency checks1505on the repository, and reports on any problems. This may take some1506time. The most common warning by far is about "dangling" objects:15071508-------------------------------------------------1509$ git fsck1510dangling commit 7281251ddd2a61e38657c827739c57015671a6b31511dangling commit 2706a059f258c6b245f298dc4ff2ccd30ec21a631512dangling commit 13472b7c4b80851a1bc551779171dcb03655e9b51513dangling blob 218761f9d90712d37a9c5e36f406f92202db07eb1514dangling commit bf093535a34a4d35731aa2bd90fe6b176302f14f1515dangling commit 8e4bec7f2ddaa268bef999853c25755452100f8e1516dangling tree d50bb86186bf27b681d25af89d3b5b68382e40851517dangling tree b24c2473f1fd3d91352a624795be026d64c8841f1518...1519-------------------------------------------------15201521Dangling objects are objects that are harmless, but also unnecessary;1522you can remove them at any time with gitlink:git-prune[1] or the --prune1523option to gitlink:git-gc[1]:15241525-------------------------------------------------1526$ git gc --prune1527-------------------------------------------------15281529This may be time-consuming. Unlike most other git operations (including1530git-gc when run without any options), it is not safe to prune while1531other git operations are in progress in the same repository.15321533For more about dangling objects, see <<dangling-objects>>.153415351536Recovering lost changes1537~~~~~~~~~~~~~~~~~~~~~~~15381539Reflogs1540^^^^^^^15411542Say you modify a branch with gitlink:git-reset[1] --hard, and then1543realize that the branch was the only reference you had to that point in1544history.15451546Fortunately, git also keeps a log, called a "reflog", of all the1547previous values of each branch. So in this case you can still find the1548old history using, for example, 15491550-------------------------------------------------1551$ git log master@{1}1552-------------------------------------------------15531554This lists the commits reachable from the previous version of the head.1555This syntax can be used to with any git command that accepts a commit,1556not just with git log. Some other examples:15571558-------------------------------------------------1559$ git show master@{2} # See where the branch pointed 2,1560$ git show master@{3} # 3, ... changes ago.1561$ gitk master@{yesterday} # See where it pointed yesterday,1562$ gitk master@{"1 week ago"} # ... or last week1563-------------------------------------------------15641565The reflogs are kept by default for 30 days, after which they may be1566pruned. See gitlink:git-reflog[1] and gitlink:git-gc[1] to learn1567how to control this pruning, and see the "SPECIFYING REVISIONS"1568section of gitlink:git-rev-parse[1] for details.15691570Note that the reflog history is very different from normal git history.1571While normal history is shared by every repository that works on the1572same project, the reflog history is not shared: it tells you only about1573how the branches in your local repository have changed over time.15741575Examining dangling objects1576^^^^^^^^^^^^^^^^^^^^^^^^^^15771578In some situations the reflog may not be able to save you. For1579example, suppose you delete a branch, then realize you need the history1580it contained. The reflog is also deleted; however, if you have not1581yet pruned the repository, then you may still be able to find1582the lost commits; run git-fsck and watch for output that mentions1583"dangling commits":15841585-------------------------------------------------1586$ git fsck1587dangling commit 7281251ddd2a61e38657c827739c57015671a6b31588dangling commit 2706a059f258c6b245f298dc4ff2ccd30ec21a631589dangling commit 13472b7c4b80851a1bc551779171dcb03655e9b51590...1591-------------------------------------------------15921593You can examine1594one of those dangling commits with, for example,15951596------------------------------------------------1597$ gitk 7281251ddd --not --all1598------------------------------------------------15991600which does what it sounds like: it says that you want to see the commit1601history that is described by the dangling commit(s), but not the1602history that is described by all your existing branches and tags. Thus1603you get exactly the history reachable from that commit that is lost.1604(And notice that it might not be just one commit: we only report the1605"tip of the line" as being dangling, but there might be a whole deep1606and complex commit history that was dropped.)16071608If you decide you want the history back, you can always create a new1609reference pointing to it, for example, a new branch:16101611------------------------------------------------1612$ git branch recovered-branch 7281251ddd 1613------------------------------------------------161416151616Sharing development with others1617===============================16181619[[getting-updates-with-git-pull]]1620Getting updates with git pull1621-----------------------------16221623After you clone a repository and make a few changes of your own, you1624may wish to check the original repository for updates and merge them1625into your own work.16261627We have already seen <<Updating-a-repository-with-git-fetch,how to1628keep remote tracking branches up to date>> with gitlink:git-fetch[1],1629and how to merge two branches. So you can merge in changes from the1630original repository's master branch with:16311632-------------------------------------------------1633$ git fetch1634$ git merge origin/master1635-------------------------------------------------16361637However, the gitlink:git-pull[1] command provides a way to do this in1638one step:16391640-------------------------------------------------1641$ git pull origin master1642-------------------------------------------------16431644In fact, "origin" is normally the default repository to pull from,1645and the default branch is normally the HEAD of the remote repository,1646so often you can accomplish the above with just16471648-------------------------------------------------1649$ git pull1650-------------------------------------------------16511652See the descriptions of the branch.<name>.remote and1653branch.<name>.merge options in gitlink:git-config[1] to learn1654how to control these defaults depending on the current branch.16551656In addition to saving you keystrokes, "git pull" also helps you by1657producing a default commit message documenting the branch and1658repository that you pulled from.16591660(But note that no such commit will be created in the case of a1661<<fast-forwards,fast forward>>; instead, your branch will just be1662updated to point to the latest commit from the upstream branch.)16631664The git-pull command can also be given "." as the "remote" repository,1665in which case it just merges in a branch from the current repository; so1666the commands16671668-------------------------------------------------1669$ git pull . branch1670$ git merge branch1671-------------------------------------------------16721673are roughly equivalent. The former is actually very commonly used.16741675Submitting patches to a project1676-------------------------------16771678If you just have a few changes, the simplest way to submit them may1679just be to send them as patches in email:16801681First, use gitlink:git-format-patch[1]; for example:16821683-------------------------------------------------1684$ git format-patch origin1685-------------------------------------------------16861687will produce a numbered series of files in the current directory, one1688for each patch in the current branch but not in origin/HEAD.16891690You can then import these into your mail client and send them by1691hand. However, if you have a lot to send at once, you may prefer to1692use the gitlink:git-send-email[1] script to automate the process.1693Consult the mailing list for your project first to determine how they1694prefer such patches be handled.16951696Importing patches to a project1697------------------------------16981699Git also provides a tool called gitlink:git-am[1] (am stands for1700"apply mailbox"), for importing such an emailed series of patches.1701Just save all of the patch-containing messages, in order, into a1702single mailbox file, say "patches.mbox", then run17031704-------------------------------------------------1705$ git am -3 patches.mbox1706-------------------------------------------------17071708Git will apply each patch in order; if any conflicts are found, it1709will stop, and you can fix the conflicts as described in1710"<<resolving-a-merge,Resolving a merge>>". (The "-3" option tells1711git to perform a merge; if you would prefer it just to abort and1712leave your tree and index untouched, you may omit that option.)17131714Once the index is updated with the results of the conflict1715resolution, instead of creating a new commit, just run17161717-------------------------------------------------1718$ git am --resolved1719-------------------------------------------------17201721and git will create the commit for you and continue applying the1722remaining patches from the mailbox.17231724The final result will be a series of commits, one for each patch in1725the original mailbox, with authorship and commit log message each1726taken from the message containing each patch.17271728[[setting-up-a-public-repository]]1729Setting up a public repository1730------------------------------17311732Another way to submit changes to a project is to simply tell the1733maintainer of that project to pull from your repository, exactly as1734you did in the section "<<getting-updates-with-git-pull, Getting1735updates with git pull>>".17361737If you and maintainer both have accounts on the same machine, then1738then you can just pull changes from each other's repositories1739directly; note that all of the commands (gitlink:git-clone[1],1740git-fetch[1], git-pull[1], etc.) that accept a URL as an argument1741will also accept a local directory name; so, for example, you can1742use17431744-------------------------------------------------1745$ git clone /path/to/repository1746$ git pull /path/to/other/repository1747-------------------------------------------------17481749If this sort of setup is inconvenient or impossible, another (more1750common) option is to set up a public repository on a public server.1751This also allows you to cleanly separate private work in progress1752from publicly visible work.17531754You will continue to do your day-to-day work in your personal1755repository, but periodically "push" changes from your personal1756repository into your public repository, allowing other developers to1757pull from that repository. So the flow of changes, in a situation1758where there is one other developer with a public repository, looks1759like this:17601761 you push1762 your personal repo ------------------> your public repo1763 ^ |1764 | |1765 | you pull | they pull1766 | |1767 | |1768 | they push V1769 their public repo <------------------- their repo17701771Now, assume your personal repository is in the directory ~/proj. We1772first create a new clone of the repository:17731774-------------------------------------------------1775$ git clone --bare proj-clone.git1776-------------------------------------------------17771778The resulting directory proj-clone.git will contains a "bare" git1779repository--it is just the contents of the ".git" directory, without1780a checked-out copy of a working directory.17811782Next, copy proj-clone.git to the server where you plan to host the1783public repository. You can use scp, rsync, or whatever is most1784convenient.17851786If somebody else maintains the public server, they may already have1787set up a git service for you, and you may skip to the section1788"<<pushing-changes-to-a-public-repository,Pushing changes to a public1789repository>>", below.17901791Otherwise, the following sections explain how to export your newly1792created public repository:17931794[[exporting-via-http]]1795Exporting a git repository via http1796-----------------------------------17971798The git protocol gives better performance and reliability, but on a1799host with a web server set up, http exports may be simpler to set up.18001801All you need to do is place the newly created bare git repository in1802a directory that is exported by the web server, and make some1803adjustments to give web clients some extra information they need:18041805-------------------------------------------------1806$ mv proj.git /home/you/public_html/proj.git1807$ cd proj.git1808$ git update-server-info1809$ chmod a+x hooks/post-update1810-------------------------------------------------18111812(For an explanation of the last two lines, see1813gitlink:git-update-server-info[1], and the documentation1814link:hooks.txt[Hooks used by git].)18151816Advertise the url of proj.git. Anybody else should then be able to1817clone or pull from that url, for example with a commandline like:18181819-------------------------------------------------1820$ git clone http://yourserver.com/~you/proj.git1821-------------------------------------------------18221823(See also1824link:howto/setup-git-server-over-http.txt[setup-git-server-over-http]1825for a slightly more sophisticated setup using WebDAV which also1826allows pushing over http.)18271828[[exporting-via-git]]1829Exporting a git repository via the git protocol1830-----------------------------------------------18311832This is the preferred method.18331834For now, we refer you to the gitlink:git-daemon[1] man page for1835instructions. (See especially the examples section.)18361837[[pushing-changes-to-a-public-repository]]1838Pushing changes to a public repository1839--------------------------------------18401841Note that the two techniques outline above (exporting via1842<<exporting-via-http,http>> or <<exporting-via-git,git>>) allow other1843maintainers to fetch your latest changes, but they do not allow write1844access, which you will need to update the public repository with the1845latest changes created in your private repository.18461847The simplest way to do this is using gitlink:git-push[1] and ssh; to1848update the remote branch named "master" with the latest state of your1849branch named "master", run18501851-------------------------------------------------1852$ git push ssh://yourserver.com/~you/proj.git master:master1853-------------------------------------------------18541855or just18561857-------------------------------------------------1858$ git push ssh://yourserver.com/~you/proj.git master1859-------------------------------------------------18601861As with git-fetch, git-push will complain if this does not result in1862a <<fast-forwards,fast forward>>. Normally this is a sign of1863something wrong. However, if you are sure you know what you're1864doing, you may force git-push to perform the update anyway by1865proceeding the branch name by a plus sign:18661867-------------------------------------------------1868$ git push ssh://yourserver.com/~you/proj.git +master1869-------------------------------------------------18701871As with git-fetch, you may also set up configuration options to1872save typing; so, for example, after18731874-------------------------------------------------1875$ cat >.git/config <<EOF1876[remote "public-repo"]1877 url = ssh://yourserver.com/~you/proj.git1878EOF1879-------------------------------------------------18801881you should be able to perform the above push with just18821883-------------------------------------------------1884$ git push public-repo master1885-------------------------------------------------18861887See the explanations of the remote.<name>.url, branch.<name>.remote,1888and remote.<name>.push options in gitlink:git-config[1] for1889details.18901891Setting up a shared repository1892------------------------------18931894Another way to collaborate is by using a model similar to that1895commonly used in CVS, where several developers with special rights1896all push to and pull from a single shared repository. See1897link:cvs-migration.txt[git for CVS users] for instructions on how to1898set this up.18991900Allow web browsing of a repository1901----------------------------------19021903The gitweb cgi script provides users an easy way to browse your1904project's files and history without having to install git; see the file1905gitweb/INSTALL in the git source tree for instructions on setting it up.19061907Examples1908--------19091910TODO: topic branches, typical roles as in everyday.txt, ?191119121913[[cleaning-up-history]]1914Rewriting history and maintaining patch series1915==============================================19161917Normally commits are only added to a project, never taken away or1918replaced. Git is designed with this assumption, and violating it will1919cause git's merge machinery (for example) to do the wrong thing.19201921However, there is a situation in which it can be useful to violate this1922assumption.19231924Creating the perfect patch series1925---------------------------------19261927Suppose you are a contributor to a large project, and you want to add a1928complicated feature, and to present it to the other developers in a way1929that makes it easy for them to read your changes, verify that they are1930correct, and understand why you made each change.19311932If you present all of your changes as a single patch (or commit), they1933may find that it is too much to digest all at once.19341935If you present them with the entire history of your work, complete with1936mistakes, corrections, and dead ends, they may be overwhelmed.19371938So the ideal is usually to produce a series of patches such that:19391940 1. Each patch can be applied in order.19411942 2. Each patch includes a single logical change, together with a1943 message explaining the change.19441945 3. No patch introduces a regression: after applying any initial1946 part of the series, the resulting project still compiles and1947 works, and has no bugs that it didn't have before.19481949 4. The complete series produces the same end result as your own1950 (probably much messier!) development process did.19511952We will introduce some tools that can help you do this, explain how to1953use them, and then explain some of the problems that can arise because1954you are rewriting history.19551956Keeping a patch series up to date using git-rebase1957--------------------------------------------------19581959Suppose that you create a branch "mywork" on a remote-tracking branch1960"origin", and create some commits on top of it:19611962-------------------------------------------------1963$ git checkout -b mywork origin1964$ vi file.txt1965$ git commit1966$ vi otherfile.txt1967$ git commit1968...1969-------------------------------------------------19701971You have performed no merges into mywork, so it is just a simple linear1972sequence of patches on top of "origin":19731974................................................1975 o--o--o <-- origin1976 \1977 o--o--o <-- mywork1978................................................19791980Some more interesting work has been done in the upstream project, and1981"origin" has advanced:19821983................................................1984 o--o--O--o--o--o <-- origin1985 \1986 a--b--c <-- mywork1987................................................19881989At this point, you could use "pull" to merge your changes back in;1990the result would create a new merge commit, like this:19911992................................................1993 o--o--O--o--o--o <-- origin1994 \ \1995 a--b--c--m <-- mywork1996................................................19971998However, if you prefer to keep the history in mywork a simple series of1999commits without any merges, you may instead choose to use2000gitlink:git-rebase[1]:20012002-------------------------------------------------2003$ git checkout mywork2004$ git rebase origin2005-------------------------------------------------20062007This will remove each of your commits from mywork, temporarily saving2008them as patches (in a directory named ".dotest"), update mywork to2009point at the latest version of origin, then apply each of the saved2010patches to the new mywork. The result will look like:201120122013................................................2014 o--o--O--o--o--o <-- origin2015 \2016 a'--b'--c' <-- mywork2017................................................20182019In the process, it may discover conflicts. In that case it will stop2020and allow you to fix the conflicts; after fixing conflicts, use "git2021add" to update the index with those contents, and then, instead of2022running git-commit, just run20232024-------------------------------------------------2025$ git rebase --continue2026-------------------------------------------------20272028and git will continue applying the rest of the patches.20292030At any point you may use the --abort option to abort this process and2031return mywork to the state it had before you started the rebase:20322033-------------------------------------------------2034$ git rebase --abort2035-------------------------------------------------20362037Modifying a single commit2038-------------------------20392040We saw in <<fixing-a-mistake-by-editing-history>> that you can replace the2041most recent commit using20422043-------------------------------------------------2044$ git commit --amend2045-------------------------------------------------20462047which will replace the old commit by a new commit incorporating your2048changes, giving you a chance to edit the old commit message first.20492050You can also use a combination of this and gitlink:git-rebase[1] to edit2051commits further back in your history. First, tag the problematic commit with20522053-------------------------------------------------2054$ git tag bad mywork~52055-------------------------------------------------20562057(Either gitk or git-log may be useful for finding the commit.)20582059Then check out that commit, edit it, and rebase the rest of the series2060on top of it (note that we could check out the commit on a temporary2061branch, but instead we're using a <<detached-head,detached head>>):20622063-------------------------------------------------2064$ git checkout bad2065$ # make changes here and update the index2066$ git commit --amend2067$ git rebase --onto HEAD bad mywork2068-------------------------------------------------20692070When you're done, you'll be left with mywork checked out, with the top2071patches on mywork reapplied on top of your modified commit. You can2072then clean up with20732074-------------------------------------------------2075$ git tag -d bad2076-------------------------------------------------20772078Note that the immutable nature of git history means that you haven't really2079"modified" existing commits; instead, you have replaced the old commits with2080new commits having new object names.20812082Reordering or selecting from a patch series2083-------------------------------------------20842085Given one existing commit, the gitlink:git-cherry-pick[1] command2086allows you to apply the change introduced by that commit and create a2087new commit that records it. So, for example, if "mywork" points to a2088series of patches on top of "origin", you might do something like:20892090-------------------------------------------------2091$ git checkout -b mywork-new origin2092$ gitk origin..mywork &2093-------------------------------------------------20942095And browse through the list of patches in the mywork branch using gitk,2096applying them (possibly in a different order) to mywork-new using2097cherry-pick, and possibly modifying them as you go using commit2098--amend.20992100Another technique is to use git-format-patch to create a series of2101patches, then reset the state to before the patches:21022103-------------------------------------------------2104$ git format-patch origin2105$ git reset --hard origin2106-------------------------------------------------21072108Then modify, reorder, or eliminate patches as preferred before applying2109them again with gitlink:git-am[1].21102111Other tools2112-----------21132114There are numerous other tools, such as stgit, which exist for the2115purpose of maintaining a patch series. These are outside of the scope of2116this manual.21172118Problems with rewriting history2119-------------------------------21202121The primary problem with rewriting the history of a branch has to do2122with merging. Suppose somebody fetches your branch and merges it into2123their branch, with a result something like this:21242125................................................2126 o--o--O--o--o--o <-- origin2127 \ \2128 t--t--t--m <-- their branch:2129................................................21302131Then suppose you modify the last three commits:21322133................................................2134 o--o--o <-- new head of origin2135 /2136 o--o--O--o--o--o <-- old head of origin2137................................................21382139If we examined all this history together in one repository, it will2140look like:21412142................................................2143 o--o--o <-- new head of origin2144 /2145 o--o--O--o--o--o <-- old head of origin2146 \ \2147 t--t--t--m <-- their branch:2148................................................21492150Git has no way of knowing that the new head is an updated version of2151the old head; it treats this situation exactly the same as it would if2152two developers had independently done the work on the old and new heads2153in parallel. At this point, if someone attempts to merge the new head2154in to their branch, git will attempt to merge together the two (old and2155new) lines of development, instead of trying to replace the old by the2156new. The results are likely to be unexpected.21572158You may still choose to publish branches whose history is rewritten,2159and it may be useful for others to be able to fetch those branches in2160order to examine or test them, but they should not attempt to pull such2161branches into their own work.21622163For true distributed development that supports proper merging,2164published branches should never be rewritten.21652166Advanced branch management2167==========================21682169Fetching individual branches2170----------------------------21712172Instead of using gitlink:git-remote[1], you can also choose just2173to update one branch at a time, and to store it locally under an2174arbitrary name:21752176-------------------------------------------------2177$ git fetch origin todo:my-todo-work2178-------------------------------------------------21792180The first argument, "origin", just tells git to fetch from the2181repository you originally cloned from. The second argument tells git2182to fetch the branch named "todo" from the remote repository, and to2183store it locally under the name refs/heads/my-todo-work.21842185You can also fetch branches from other repositories; so21862187-------------------------------------------------2188$ git fetch git://example.com/proj.git master:example-master2189-------------------------------------------------21902191will create a new branch named "example-master" and store in it the2192branch named "master" from the repository at the given URL. If you2193already have a branch named example-master, it will attempt to2194"fast-forward" to the commit given by example.com's master branch. So2195next we explain what a fast-forward is:21962197[[fast-forwards]]2198Understanding git history: fast-forwards2199----------------------------------------22002201In the previous example, when updating an existing branch, "git2202fetch" checks to make sure that the most recent commit on the remote2203branch is a descendant of the most recent commit on your copy of the2204branch before updating your copy of the branch to point at the new2205commit. Git calls this process a "fast forward".22062207A fast forward looks something like this:22082209................................................2210 o--o--o--o <-- old head of the branch2211 \2212 o--o--o <-- new head of the branch2213................................................221422152216In some cases it is possible that the new head will *not* actually be2217a descendant of the old head. For example, the developer may have2218realized she made a serious mistake, and decided to backtrack,2219resulting in a situation like:22202221................................................2222 o--o--o--o--a--b <-- old head of the branch2223 \2224 o--o--o <-- new head of the branch2225................................................22262227In this case, "git fetch" will fail, and print out a warning.22282229In that case, you can still force git to update to the new head, as2230described in the following section. However, note that in the2231situation above this may mean losing the commits labeled "a" and "b",2232unless you've already created a reference of your own pointing to2233them.22342235Forcing git fetch to do non-fast-forward updates2236------------------------------------------------22372238If git fetch fails because the new head of a branch is not a2239descendant of the old head, you may force the update with:22402241-------------------------------------------------2242$ git fetch git://example.com/proj.git +master:refs/remotes/example/master2243-------------------------------------------------22442245Note the addition of the "+" sign. Be aware that commits that the2246old version of example/master pointed at may be lost, as we saw in2247the previous section.22482249Configuring remote branches2250---------------------------22512252We saw above that "origin" is just a shortcut to refer to the2253repository that you originally cloned from. This information is2254stored in git configuration variables, which you can see using2255gitlink:git-config[1]:22562257-------------------------------------------------2258$ git config -l2259core.repositoryformatversion=02260core.filemode=true2261core.logallrefupdates=true2262remote.origin.url=git://git.kernel.org/pub/scm/git/git.git2263remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*2264branch.master.remote=origin2265branch.master.merge=refs/heads/master2266-------------------------------------------------22672268If there are other repositories that you also use frequently, you can2269create similar configuration options to save typing; for example,2270after22712272-------------------------------------------------2273$ git config remote.example.url git://example.com/proj.git2274-------------------------------------------------22752276then the following two commands will do the same thing:22772278-------------------------------------------------2279$ git fetch git://example.com/proj.git master:refs/remotes/example/master2280$ git fetch example master:refs/remotes/example/master2281-------------------------------------------------22822283Even better, if you add one more option:22842285-------------------------------------------------2286$ git config remote.example.fetch master:refs/remotes/example/master2287-------------------------------------------------22882289then the following commands will all do the same thing:22902291-------------------------------------------------2292$ git fetch git://example.com/proj.git master:ref/remotes/example/master2293$ git fetch example master:ref/remotes/example/master2294$ git fetch example example/master2295$ git fetch example2296-------------------------------------------------22972298You can also add a "+" to force the update each time:22992300-------------------------------------------------2301$ git config remote.example.fetch +master:ref/remotes/example/master2302-------------------------------------------------23032304Don't do this unless you're sure you won't mind "git fetch" possibly2305throwing away commits on mybranch.23062307Also note that all of the above configuration can be performed by2308directly editing the file .git/config instead of using2309gitlink:git-config[1].23102311See gitlink:git-config[1] for more details on the configuration2312options mentioned above.231323142315[[git-internals]]2316Git internals2317=============23182319Git depends on two fundamental abstractions: the "object database", and2320the "current directory cache" aka "index".23212322The Object Database2323-------------------23242325The object database is literally just a content-addressable collection2326of objects. All objects are named by their content, which is2327approximated by the SHA1 hash of the object itself. Objects may refer2328to other objects (by referencing their SHA1 hash), and so you can2329build up a hierarchy of objects.23302331All objects have a statically determined "type" aka "tag", which is2332determined at object creation time, and which identifies the format of2333the object (i.e. how it is used, and how it can refer to other2334objects). There are currently four different object types: "blob",2335"tree", "commit", and "tag".23362337A <<def_blob_object,"blob" object>> cannot refer to any other object,2338and is, as the name implies, a pure storage object containing some2339user data. It is used to actually store the file data, i.e. a blob2340object is associated with some particular version of some file.23412342A <<def_tree_object,"tree" object>> is an object that ties one or more2343"blob" objects into a directory structure. In addition, a tree object2344can refer to other tree objects, thus creating a directory hierarchy.23452346A <<def_commit_object,"commit" object>> ties such directory hierarchies2347together into a <<def_DAG,directed acyclic graph>> of revisions - each2348"commit" is associated with exactly one tree (the directory hierarchy at2349the time of the commit). In addition, a "commit" refers to one or more2350"parent" commit objects that describe the history of how we arrived at2351that directory hierarchy.23522353As a special case, a commit object with no parents is called the "root"2354object, and is the point of an initial project commit. Each project2355must have at least one root, and while you can tie several different2356root objects together into one project by creating a commit object which2357has two or more separate roots as its ultimate parents, that's probably2358just going to confuse people. So aim for the notion of "one root object2359per project", even if git itself does not enforce that. 23602361A <<def_tag_object,"tag" object>> symbolically identifies and can be2362used to sign other objects. It contains the identifier and type of2363another object, a symbolic name (of course!) and, optionally, a2364signature.23652366Regardless of object type, all objects share the following2367characteristics: they are all deflated with zlib, and have a header2368that not only specifies their type, but also provides size information2369about the data in the object. It's worth noting that the SHA1 hash2370that is used to name the object is the hash of the original data2371plus this header, so `sha1sum` 'file' does not match the object name2372for 'file'.2373(Historical note: in the dawn of the age of git the hash2374was the sha1 of the 'compressed' object.)23752376As a result, the general consistency of an object can always be tested2377independently of the contents or the type of the object: all objects can2378be validated by verifying that (a) their hashes match the content of the2379file and (b) the object successfully inflates to a stream of bytes that2380forms a sequence of <ascii type without space> + <space> + <ascii decimal2381size> + <byte\0> + <binary object data>. 23822383The structured objects can further have their structure and2384connectivity to other objects verified. This is generally done with2385the `git-fsck` program, which generates a full dependency graph2386of all objects, and verifies their internal consistency (in addition2387to just verifying their superficial consistency through the hash).23882389The object types in some more detail:23902391Blob Object2392-----------23932394A "blob" object is nothing but a binary blob of data, and doesn't2395refer to anything else. There is no signature or any other2396verification of the data, so while the object is consistent (it 'is'2397indexed by its sha1 hash, so the data itself is certainly correct), it2398has absolutely no other attributes. No name associations, no2399permissions. It is purely a blob of data (i.e. normally "file2400contents").24012402In particular, since the blob is entirely defined by its data, if two2403files in a directory tree (or in multiple different versions of the2404repository) have the same contents, they will share the same blob2405object. The object is totally independent of its location in the2406directory tree, and renaming a file does not change the object that2407file is associated with in any way.24082409A blob is typically created when gitlink:git-update-index[1]2410is run, and its data can be accessed by gitlink:git-cat-file[1].24112412Tree Object2413-----------24142415The next hierarchical object type is the "tree" object. A tree object2416is a list of mode/name/blob data, sorted by name. Alternatively, the2417mode data may specify a directory mode, in which case instead of2418naming a blob, that name is associated with another TREE object.24192420Like the "blob" object, a tree object is uniquely determined by the2421set contents, and so two separate but identical trees will always2422share the exact same object. This is true at all levels, i.e. it's2423true for a "leaf" tree (which does not refer to any other trees, only2424blobs) as well as for a whole subdirectory.24252426For that reason a "tree" object is just a pure data abstraction: it2427has no history, no signatures, no verification of validity, except2428that since the contents are again protected by the hash itself, we can2429trust that the tree is immutable and its contents never change.24302431So you can trust the contents of a tree to be valid, the same way you2432can trust the contents of a blob, but you don't know where those2433contents 'came' from.24342435Side note on trees: since a "tree" object is a sorted list of2436"filename+content", you can create a diff between two trees without2437actually having to unpack two trees. Just ignore all common parts,2438and your diff will look right. In other words, you can effectively2439(and efficiently) tell the difference between any two random trees by2440O(n) where "n" is the size of the difference, rather than the size of2441the tree.24422443Side note 2 on trees: since the name of a "blob" depends entirely and2444exclusively on its contents (i.e. there are no names or permissions2445involved), you can see trivial renames or permission changes by2446noticing that the blob stayed the same. However, renames with data2447changes need a smarter "diff" implementation.24482449A tree is created with gitlink:git-write-tree[1] and2450its data can be accessed by gitlink:git-ls-tree[1].2451Two trees can be compared with gitlink:git-diff-tree[1].24522453Commit Object2454-------------24552456The "commit" object is an object that introduces the notion of2457history into the picture. In contrast to the other objects, it2458doesn't just describe the physical state of a tree, it describes how2459we got there, and why.24602461A "commit" is defined by the tree-object that it results in, the2462parent commits (zero, one or more) that led up to that point, and a2463comment on what happened. Again, a commit is not trusted per se:2464the contents are well-defined and "safe" due to the cryptographically2465strong signatures at all levels, but there is no reason to believe2466that the tree is "good" or that the merge information makes sense.2467The parents do not have to actually have any relationship with the2468result, for example.24692470Note on commits: unlike real SCM's, commits do not contain2471rename information or file mode change information. All of that is2472implicit in the trees involved (the result tree, and the result trees2473of the parents), and describing that makes no sense in this idiotic2474file manager.24752476A commit is created with gitlink:git-commit-tree[1] and2477its data can be accessed by gitlink:git-cat-file[1].24782479Trust2480-----24812482An aside on the notion of "trust". Trust is really outside the scope2483of "git", but it's worth noting a few things. First off, since2484everything is hashed with SHA1, you 'can' trust that an object is2485intact and has not been messed with by external sources. So the name2486of an object uniquely identifies a known state - just not a state that2487you may want to trust.24882489Furthermore, since the SHA1 signature of a commit refers to the2490SHA1 signatures of the tree it is associated with and the signatures2491of the parent, a single named commit specifies uniquely a whole set2492of history, with full contents. You can't later fake any step of the2493way once you have the name of a commit.24942495So to introduce some real trust in the system, the only thing you need2496to do is to digitally sign just 'one' special note, which includes the2497name of a top-level commit. Your digital signature shows others2498that you trust that commit, and the immutability of the history of2499commits tells others that they can trust the whole history.25002501In other words, you can easily validate a whole archive by just2502sending out a single email that tells the people the name (SHA1 hash)2503of the top commit, and digitally sign that email using something2504like GPG/PGP.25052506To assist in this, git also provides the tag object...25072508Tag Object2509----------25102511Git provides the "tag" object to simplify creating, managing and2512exchanging symbolic and signed tokens. The "tag" object at its2513simplest simply symbolically identifies another object by containing2514the sha1, type and symbolic name.25152516However it can optionally contain additional signature information2517(which git doesn't care about as long as there's less than 8k of2518it). This can then be verified externally to git.25192520Note that despite the tag features, "git" itself only handles content2521integrity; the trust framework (and signature provision and2522verification) has to come from outside.25232524A tag is created with gitlink:git-mktag[1],2525its data can be accessed by gitlink:git-cat-file[1],2526and the signature can be verified by2527gitlink:git-verify-tag[1].252825292530The "index" aka "Current Directory Cache"2531-----------------------------------------25322533The index is a simple binary file, which contains an efficient2534representation of a virtual directory content at some random time. It2535does so by a simple array that associates a set of names, dates,2536permissions and content (aka "blob") objects together. The cache is2537always kept ordered by name, and names are unique (with a few very2538specific rules) at any point in time, but the cache has no long-term2539meaning, and can be partially updated at any time.25402541In particular, the index certainly does not need to be consistent with2542the current directory contents (in fact, most operations will depend on2543different ways to make the index 'not' be consistent with the directory2544hierarchy), but it has three very important attributes:25452546'(a) it can re-generate the full state it caches (not just the2547directory structure: it contains pointers to the "blob" objects so2548that it can regenerate the data too)'25492550As a special case, there is a clear and unambiguous one-way mapping2551from a current directory cache to a "tree object", which can be2552efficiently created from just the current directory cache without2553actually looking at any other data. So a directory cache at any one2554time uniquely specifies one and only one "tree" object (but has2555additional data to make it easy to match up that tree object with what2556has happened in the directory)25572558'(b) it has efficient methods for finding inconsistencies between that2559cached state ("tree object waiting to be instantiated") and the2560current state.'25612562'(c) it can additionally efficiently represent information about merge2563conflicts between different tree objects, allowing each pathname to be2564associated with sufficient information about the trees involved that2565you can create a three-way merge between them.'25662567Those are the ONLY three things that the directory cache does. It's a2568cache, and the normal operation is to re-generate it completely from a2569known tree object, or update/compare it with a live tree that is being2570developed. If you blow the directory cache away entirely, you generally2571haven't lost any information as long as you have the name of the tree2572that it described. 25732574At the same time, the index is at the same time also the2575staging area for creating new trees, and creating a new tree always2576involves a controlled modification of the index file. In particular,2577the index file can have the representation of an intermediate tree that2578has not yet been instantiated. So the index can be thought of as a2579write-back cache, which can contain dirty information that has not yet2580been written back to the backing store.2581258225832584The Workflow2585------------25862587Generally, all "git" operations work on the index file. Some operations2588work *purely* on the index file (showing the current state of the2589index), but most operations move data to and from the index file. Either2590from the database or from the working directory. Thus there are four2591main combinations: 25922593working directory -> index2594~~~~~~~~~~~~~~~~~~~~~~~~~~25952596You update the index with information from the working directory with2597the gitlink:git-update-index[1] command. You2598generally update the index information by just specifying the filename2599you want to update, like so:26002601-------------------------------------------------2602$ git-update-index filename2603-------------------------------------------------26042605but to avoid common mistakes with filename globbing etc, the command2606will not normally add totally new entries or remove old entries,2607i.e. it will normally just update existing cache entries.26082609To tell git that yes, you really do realize that certain files no2610longer exist, or that new files should be added, you2611should use the `--remove` and `--add` flags respectively.26122613NOTE! A `--remove` flag does 'not' mean that subsequent filenames will2614necessarily be removed: if the files still exist in your directory2615structure, the index will be updated with their new status, not2616removed. The only thing `--remove` means is that update-cache will be2617considering a removed file to be a valid thing, and if the file really2618does not exist any more, it will update the index accordingly.26192620As a special case, you can also do `git-update-index --refresh`, which2621will refresh the "stat" information of each index to match the current2622stat information. It will 'not' update the object status itself, and2623it will only update the fields that are used to quickly test whether2624an object still matches its old backing store object.26252626index -> object database2627~~~~~~~~~~~~~~~~~~~~~~~~26282629You write your current index file to a "tree" object with the program26302631-------------------------------------------------2632$ git-write-tree2633-------------------------------------------------26342635that doesn't come with any options - it will just write out the2636current index into the set of tree objects that describe that state,2637and it will return the name of the resulting top-level tree. You can2638use that tree to re-generate the index at any time by going in the2639other direction:26402641object database -> index2642~~~~~~~~~~~~~~~~~~~~~~~~26432644You read a "tree" file from the object database, and use that to2645populate (and overwrite - don't do this if your index contains any2646unsaved state that you might want to restore later!) your current2647index. Normal operation is just26482649-------------------------------------------------2650$ git-read-tree <sha1 of tree>2651-------------------------------------------------26522653and your index file will now be equivalent to the tree that you saved2654earlier. However, that is only your 'index' file: your working2655directory contents have not been modified.26562657index -> working directory2658~~~~~~~~~~~~~~~~~~~~~~~~~~26592660You update your working directory from the index by "checking out"2661files. This is not a very common operation, since normally you'd just2662keep your files updated, and rather than write to your working2663directory, you'd tell the index files about the changes in your2664working directory (i.e. `git-update-index`).26652666However, if you decide to jump to a new version, or check out somebody2667else's version, or just restore a previous tree, you'd populate your2668index file with read-tree, and then you need to check out the result2669with26702671-------------------------------------------------2672$ git-checkout-index filename2673-------------------------------------------------26742675or, if you want to check out all of the index, use `-a`.26762677NOTE! git-checkout-index normally refuses to overwrite old files, so2678if you have an old version of the tree already checked out, you will2679need to use the "-f" flag ('before' the "-a" flag or the filename) to2680'force' the checkout.268126822683Finally, there are a few odds and ends which are not purely moving2684from one representation to the other:26852686Tying it all together2687~~~~~~~~~~~~~~~~~~~~~26882689To commit a tree you have instantiated with "git-write-tree", you'd2690create a "commit" object that refers to that tree and the history2691behind it - most notably the "parent" commits that preceded it in2692history.26932694Normally a "commit" has one parent: the previous state of the tree2695before a certain change was made. However, sometimes it can have two2696or more parent commits, in which case we call it a "merge", due to the2697fact that such a commit brings together ("merges") two or more2698previous states represented by other commits.26992700In other words, while a "tree" represents a particular directory state2701of a working directory, a "commit" represents that state in "time",2702and explains how we got there.27032704You create a commit object by giving it the tree that describes the2705state at the time of the commit, and a list of parents:27062707-------------------------------------------------2708$ git-commit-tree <tree> -p <parent> [-p <parent2> ..]2709-------------------------------------------------27102711and then giving the reason for the commit on stdin (either through2712redirection from a pipe or file, or by just typing it at the tty).27132714git-commit-tree will return the name of the object that represents2715that commit, and you should save it away for later use. Normally,2716you'd commit a new `HEAD` state, and while git doesn't care where you2717save the note about that state, in practice we tend to just write the2718result to the file pointed at by `.git/HEAD`, so that we can always see2719what the last committed state was.27202721Here is an ASCII art by Jon Loeliger that illustrates how2722various pieces fit together.27232724------------27252726 commit-tree2727 commit obj2728 +----+2729 | |2730 | |2731 V V2732 +-----------+2733 | Object DB |2734 | Backing |2735 | Store |2736 +-----------+2737 ^2738 write-tree | |2739 tree obj | |2740 | | read-tree2741 | | tree obj2742 V2743 +-----------+2744 | Index |2745 | "cache" |2746 +-----------+2747 update-index ^2748 blob obj | |2749 | |2750 checkout-index -u | | checkout-index2751 stat | | blob obj2752 V2753 +-----------+2754 | Working |2755 | Directory |2756 +-----------+27572758------------275927602761Examining the data2762------------------27632764You can examine the data represented in the object database and the2765index with various helper tools. For every object, you can use2766gitlink:git-cat-file[1] to examine details about the2767object:27682769-------------------------------------------------2770$ git-cat-file -t <objectname>2771-------------------------------------------------27722773shows the type of the object, and once you have the type (which is2774usually implicit in where you find the object), you can use27752776-------------------------------------------------2777$ git-cat-file blob|tree|commit|tag <objectname>2778-------------------------------------------------27792780to show its contents. NOTE! Trees have binary content, and as a result2781there is a special helper for showing that content, called2782`git-ls-tree`, which turns the binary content into a more easily2783readable form.27842785It's especially instructive to look at "commit" objects, since those2786tend to be small and fairly self-explanatory. In particular, if you2787follow the convention of having the top commit name in `.git/HEAD`,2788you can do27892790-------------------------------------------------2791$ git-cat-file commit HEAD2792-------------------------------------------------27932794to see what the top commit was.27952796Merging multiple trees2797----------------------27982799Git helps you do a three-way merge, which you can expand to n-way by2800repeating the merge procedure arbitrary times until you finally2801"commit" the state. The normal situation is that you'd only do one2802three-way merge (two parents), and commit it, but if you like to, you2803can do multiple parents in one go.28042805To do a three-way merge, you need the two sets of "commit" objects2806that you want to merge, use those to find the closest common parent (a2807third "commit" object), and then use those commit objects to find the2808state of the directory ("tree" object) at these points.28092810To get the "base" for the merge, you first look up the common parent2811of two commits with28122813-------------------------------------------------2814$ git-merge-base <commit1> <commit2>2815-------------------------------------------------28162817which will return you the commit they are both based on. You should2818now look up the "tree" objects of those commits, which you can easily2819do with (for example)28202821-------------------------------------------------2822$ git-cat-file commit <commitname> | head -12823-------------------------------------------------28242825since the tree object information is always the first line in a commit2826object.28272828Once you know the three trees you are going to merge (the one "original"2829tree, aka the common case, and the two "result" trees, aka the branches2830you want to merge), you do a "merge" read into the index. This will2831complain if it has to throw away your old index contents, so you should2832make sure that you've committed those - in fact you would normally2833always do a merge against your last commit (which should thus match what2834you have in your current index anyway).28352836To do the merge, do28372838-------------------------------------------------2839$ git-read-tree -m -u <origtree> <yourtree> <targettree>2840-------------------------------------------------28412842which will do all trivial merge operations for you directly in the2843index file, and you can just write the result out with2844`git-write-tree`.284528462847Merging multiple trees, continued2848---------------------------------28492850Sadly, many merges aren't trivial. If there are files that have2851been added.moved or removed, or if both branches have modified the2852same file, you will be left with an index tree that contains "merge2853entries" in it. Such an index tree can 'NOT' be written out to a tree2854object, and you will have to resolve any such merge clashes using2855other tools before you can write out the result.28562857You can examine such index state with `git-ls-files --unmerged`2858command. An example:28592860------------------------------------------------2861$ git-read-tree -m $orig HEAD $target2862$ git-ls-files --unmerged2863100644 263414f423d0e4d70dae8fe53fa34614ff3e2860 1 hello.c2864100644 06fa6a24256dc7e560efa5687fa84b51f0263c3a 2 hello.c2865100644 cc44c73eb783565da5831b4d820c962954019b69 3 hello.c2866------------------------------------------------28672868Each line of the `git-ls-files --unmerged` output begins with2869the blob mode bits, blob SHA1, 'stage number', and the2870filename. The 'stage number' is git's way to say which tree it2871came from: stage 1 corresponds to `$orig` tree, stage 2 `HEAD`2872tree, and stage3 `$target` tree.28732874Earlier we said that trivial merges are done inside2875`git-read-tree -m`. For example, if the file did not change2876from `$orig` to `HEAD` nor `$target`, or if the file changed2877from `$orig` to `HEAD` and `$orig` to `$target` the same way,2878obviously the final outcome is what is in `HEAD`. What the2879above example shows is that file `hello.c` was changed from2880`$orig` to `HEAD` and `$orig` to `$target` in a different way.2881You could resolve this by running your favorite 3-way merge2882program, e.g. `diff3` or `merge`, on the blob objects from2883these three stages yourself, like this:28842885------------------------------------------------2886$ git-cat-file blob 263414f... >hello.c~12887$ git-cat-file blob 06fa6a2... >hello.c~22888$ git-cat-file blob cc44c73... >hello.c~32889$ merge hello.c~2 hello.c~1 hello.c~32890------------------------------------------------28912892This would leave the merge result in `hello.c~2` file, along2893with conflict markers if there are conflicts. After verifying2894the merge result makes sense, you can tell git what the final2895merge result for this file is by:28962897-------------------------------------------------2898$ mv -f hello.c~2 hello.c2899$ git-update-index hello.c2900-------------------------------------------------29012902When a path is in unmerged state, running `git-update-index` for2903that path tells git to mark the path resolved.29042905The above is the description of a git merge at the lowest level,2906to help you understand what conceptually happens under the hood.2907In practice, nobody, not even git itself, uses three `git-cat-file`2908for this. There is `git-merge-index` program that extracts the2909stages to temporary files and calls a "merge" script on it:29102911-------------------------------------------------2912$ git-merge-index git-merge-one-file hello.c2913-------------------------------------------------29142915and that is what higher level `git merge -s resolve` is implemented with.29162917How git stores objects efficiently: pack files2918----------------------------------------------29192920We've seen how git stores each object in a file named after the2921object's SHA1 hash.29222923Unfortunately this system becomes inefficient once a project has a2924lot of objects. Try this on an old project:29252926------------------------------------------------2927$ git count-objects29286930 objects, 47620 kilobytes2929------------------------------------------------29302931The first number is the number of objects which are kept in2932individual files. The second is the amount of space taken up by2933those "loose" objects.29342935You can save space and make git faster by moving these loose objects in2936to a "pack file", which stores a group of objects in an efficient2937compressed format; the details of how pack files are formatted can be2938found in link:technical/pack-format.txt[technical/pack-format.txt].29392940To put the loose objects into a pack, just run git repack:29412942------------------------------------------------2943$ git repack2944Generating pack...2945Done counting 6020 objects.2946Deltifying 6020 objects.2947 100% (6020/6020) done2948Writing 6020 objects.2949 100% (6020/6020) done2950Total 6020, written 6020 (delta 4070), reused 0 (delta 0)2951Pack pack-3e54ad29d5b2e05838c75df582c65257b8d08e1c created.2952------------------------------------------------29532954You can then run29552956------------------------------------------------2957$ git prune2958------------------------------------------------29592960to remove any of the "loose" objects that are now contained in the2961pack. This will also remove any unreferenced objects (which may be2962created when, for example, you use "git reset" to remove a commit).2963You can verify that the loose objects are gone by looking at the2964.git/objects directory or by running29652966------------------------------------------------2967$ git count-objects29680 objects, 0 kilobytes2969------------------------------------------------29702971Although the object files are gone, any commands that refer to those2972objects will work exactly as they did before.29732974The gitlink:git-gc[1] command performs packing, pruning, and more for2975you, so is normally the only high-level command you need.29762977[[dangling-objects]]2978Dangling objects2979----------------29802981The gitlink:git-fsck[1] command will sometimes complain about dangling2982objects. They are not a problem.29832984The most common cause of dangling objects is that you've rebased a2985branch, or you have pulled from somebody else who rebased a branch--see2986<<cleaning-up-history>>. In that case, the old head of the original2987branch still exists, as does obviously everything it pointed to. The2988branch pointer itself just doesn't, since you replaced it with another2989one.29902991There are also other situations too that cause dangling objects. For2992example, a "dangling blob" may arise because you did a "git add" of a2993file, but then, before you actually committed it and made it part of the2994bigger picture, you changed something else in that file and committed2995that *updated* thing - the old state that you added originally ends up2996not being pointed to by any commit or tree, so it's now a dangling blob2997object.29982999Similarly, when the "recursive" merge strategy runs, and finds that3000there are criss-cross merges and thus more than one merge base (which is3001fairly unusual, but it does happen), it will generate one temporary3002midway tree (or possibly even more, if you had lots of criss-crossing3003merges and more than two merge bases) as a temporary internal merge3004base, and again, those are real objects, but the end result will not end3005up pointing to them, so they end up "dangling" in your repository.30063007Generally, dangling objects aren't anything to worry about. They can3008even be very useful: if you screw something up, the dangling objects can3009be how you recover your old tree (say, you did a rebase, and realized3010that you really didn't want to - you can look at what dangling objects3011you have, and decide to reset your head to some old dangling state).30123013For commits, the most useful thing to do with dangling objects tends to3014be to do a simple30153016------------------------------------------------3017$ gitk <dangling-commit-sha-goes-here> --not --all3018------------------------------------------------30193020For blobs and trees, you can't do the same, but you can examine them.3021You can just do30223023------------------------------------------------3024$ git show <dangling-blob/tree-sha-goes-here>3025------------------------------------------------30263027to show what the contents of the blob were (or, for a tree, basically3028what the "ls" for that directory was), and that may give you some idea3029of what the operation was that left that dangling object.30303031Usually, dangling blobs and trees aren't very interesting. They're3032almost always the result of either being a half-way mergebase (the blob3033will often even have the conflict markers from a merge in it, if you3034have had conflicting merges that you fixed up by hand), or simply3035because you interrupted a "git fetch" with ^C or something like that,3036leaving _some_ of the new objects in the object database, but just3037dangling and useless.30383039Anyway, once you are sure that you're not interested in any dangling 3040state, you can just prune all unreachable objects:30413042------------------------------------------------3043$ git prune3044------------------------------------------------30453046and they'll be gone. But you should only run "git prune" on a quiescent3047repository - it's kind of like doing a filesystem fsck recovery: you3048don't want to do that while the filesystem is mounted.30493050(The same is true of "git-fsck" itself, btw - but since 3051git-fsck never actually *changes* the repository, it just reports 3052on what it found, git-fsck itself is never "dangerous" to run. 3053Running it while somebody is actually changing the repository can cause 3054confusing and scary messages, but it won't actually do anything bad. In 3055contrast, running "git prune" while somebody is actively changing the 3056repository is a *BAD* idea).30573058include::glossary.txt[]30593060Notes and todo list for this manual3061===================================30623063This is a work in progress.30643065The basic requirements:3066 - It must be readable in order, from beginning to end, by3067 someone intelligent with a basic grasp of the unix3068 commandline, but without any special knowledge of git. If3069 necessary, any other prerequisites should be specifically3070 mentioned as they arise.3071 - Whenever possible, section headings should clearly describe3072 the task they explain how to do, in language that requires3073 no more knowledge than necessary: for example, "importing3074 patches into a project" rather than "the git-am command"30753076Think about how to create a clear chapter dependency graph that will3077allow people to get to important topics without necessarily reading3078everything in between.30793080Say something about .gitignore.30813082Scan Documentation/ for other stuff left out; in particular:3083 howto's3084 some of technical/?3085 hooks3086 list of commands in gitlink:git[1]30873088Scan email archives for other stuff left out30893090Scan man pages to see if any assume more background than this manual3091provides.30923093Simplify beginning by suggesting disconnected head instead of3094temporary branch creation?30953096Add more good examples. Entire sections of just cookbook examples3097might be a good idea; maybe make an "advanced examples" section a3098standard end-of-chapter section?30993100Include cross-references to the glossary, where appropriate.31013102Document shallow clones? See draft 1.5.0 release notes for some3103documentation.31043105Add a section on working with other version control systems, including3106CVS, Subversion, and just imports of series of release tarballs.31073108More details on gitweb?31093110Write a chapter on using plumbing and writing scripts.