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 branch 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] 158name = Your Name Comes Here 159email = 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. Each branch 292is a bookmark referencing a particular point in the project history. 293The gitlink:git-branch[1] command shows you the list of branches: 294 295------------------------------------------------ 296$ git branch 297* master 298------------------------------------------------ 299 300A freshly cloned repository contains a single branch, named "master", 301and the working directory contains the version of the project 302referred to by the master branch. 303 304Most projects also use tags. Tags, like branches, are references 305into the project's history, and can be listed using the 306gitlink:git-tag[1] command: 307 308------------------------------------------------ 309$ git tag -l 310v2.6.11 311v2.6.11-tree 312v2.6.12 313v2.6.12-rc2 314v2.6.12-rc3 315v2.6.12-rc4 316v2.6.12-rc5 317v2.6.12-rc6 318v2.6.13 319... 320------------------------------------------------ 321 322Tags are expected to always point at the same version of a project, 323while branches are expected to advance as development progresses. 324 325Create a new branch pointing to one of these versions and check it 326out using gitlink:git-checkout[1]: 327 328------------------------------------------------ 329$ git checkout -b new v2.6.13 330------------------------------------------------ 331 332The working directory then reflects the contents that the project had 333when it was tagged v2.6.13, and gitlink:git-branch[1] shows two 334branches, with an asterisk marking the currently checked-out branch: 335 336------------------------------------------------ 337$ git branch 338 master 339* new 340------------------------------------------------ 341 342If you decide that you'd rather see version 2.6.17, you can modify 343the current branch to point at v2.6.17 instead, with 344 345------------------------------------------------ 346$ git reset --hard v2.6.17 347------------------------------------------------ 348 349Note that if the current branch was your only reference to a 350particular point in history, then resetting that branch may leave you 351with no way to find the history it used to point to; so use this 352command carefully. 353 354Understanding History: Commits 355------------------------------ 356 357Every change in the history of a project is represented by a commit. 358The gitlink:git-show[1] command shows the most recent commit on the 359current branch: 360 361------------------------------------------------ 362$ git show 363commit 2b5f6dcce5bf94b9b119e9ed8d537098ec61c3d2 364Author: Jamal Hadi Salim <hadi@cyberus.ca> 365Date: Sat Dec 2 22:22:25 2006 -0800 366 367 [XFRM]: Fix aevent structuring to be more complete. 368 369 aevents can not uniquely identify an SA. We break the ABI with this 370 patch, but consensus is that since it is not yet utilized by any 371 (known) application then it is fine (better do it now than later). 372 373 Signed-off-by: Jamal Hadi Salim <hadi@cyberus.ca> 374 Signed-off-by: David S. Miller <davem@davemloft.net> 375 376diff --git a/Documentation/networking/xfrm_sync.txt b/Documentation/networking/xfrm_sync.txt 377index 8be626f..d7aac9d 100644 378--- a/Documentation/networking/xfrm_sync.txt 379+++ b/Documentation/networking/xfrm_sync.txt 380@@ -47,10 +47,13 @@ aevent_id structure looks like: 381 382 struct xfrm_aevent_id { 383 struct xfrm_usersa_id sa_id; 384+ xfrm_address_t saddr; 385 __u32 flags; 386+ __u32 reqid; 387 }; 388... 389------------------------------------------------ 390 391As you can see, a commit shows who made the latest change, what they 392did, and why. 393 394Every commit has a 40-hexdigit id, sometimes called the "object name" or the 395"SHA1 id", shown on the first line of the "git show" output. You can usually 396refer to a commit by a shorter name, such as a tag or a branch name, but this 397longer name can also be useful. Most importantly, it is a globally unique 398name for this commit: so if you tell somebody else the object name (for 399example in email), then you are guaranteed that name will refer to the same 400commit in their repository that it does in yours (assuming their repository 401has that commit at all). Since the object name is computed as a hash over the 402contents of the commit, you are guaranteed that the commit can never change 403without its name also changing. 404 405In fact, in <<git-internals>> we shall see that everything stored in git 406history, including file data and directory contents, is stored in an object 407with a name that is a hash of its contents. 408 409Understanding history: commits, parents, and reachability 410~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 412Every commit (except the very first commit in a project) also has a 413parent commit which shows what happened before this commit. 414Following the chain of parents will eventually take you back to the 415beginning of the project. 416 417However, the commits do not form a simple list; git allows lines of 418development to diverge and then reconverge, and the point where two 419lines of development reconverge is called a "merge". The commit 420representing a merge can therefore have more than one parent, with 421each parent representing the most recent commit on one of the lines 422of development leading to that point. 423 424The best way to see how this works is using the gitlink:gitk[1] 425command; running gitk now on a git repository and looking for merge 426commits will help understand how the git organizes history. 427 428In the following, we say that commit X is "reachable" from commit Y 429if commit X is an ancestor of commit Y. Equivalently, you could say 430that Y is a descendent of X, or that there is a chain of parents 431leading from commit Y to commit X. 432 433Understanding history: History diagrams 434~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 435 436We will sometimes represent git history using diagrams like the one 437below. Commits are shown as "o", and the links between them with 438lines drawn with - / and \. Time goes left to right: 439 440 441................................................ 442 o--o--o <-- Branch A 443 / 444 o--o--o <-- master 445 \ 446 o--o--o <-- Branch B 447................................................ 448 449If we need to talk about a particular commit, the character "o" may 450be replaced with another letter or number. 451 452Understanding history: What is a branch? 453~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 454 455Though we've been using the word "branch" to mean a kind of reference 456to a particular commit, the word branch is also commonly used to 457refer to the line of commits leading up to that point. In the 458example above, git may think of the branch named "A" as just a 459pointer to one particular commit, but we may refer informally to the 460line of three commits leading up to that point as all being part of 461"branch A". 462 463If we need to make it clear that we're just talking about the most 464recent commit on the branch, we may refer to that commit as the 465"head" of the branch. 466 467Manipulating branches 468--------------------- 469 470Creating, deleting, and modifying branches is quick and easy; here's 471a summary of the commands: 472 473git branch:: 474 list all branches 475git branch <branch>:: 476 create a new branch named <branch>, referencing the same 477 point in history as the current branch 478git branch <branch> <start-point>:: 479 create a new branch named <branch>, referencing 480 <start-point>, which may be specified any way you like, 481 including using a branch name or a tag name 482git branch -d <branch>:: 483 delete the branch <branch>; if the branch you are deleting 484 points to a commit which is not reachable from this branch, 485 this command will fail with a warning. 486git branch -D <branch>:: 487 even if the branch points to a commit not reachable 488 from the current branch, you may know that that commit 489 is still reachable from some other branch or tag. In that 490 case it is safe to use this command to force git to delete 491 the branch. 492git checkout <branch>:: 493 make the current branch <branch>, updating the working 494 directory to reflect the version referenced by <branch> 495git checkout -b <new> <start-point>:: 496 create a new branch <new> referencing <start-point>, and 497 check it out. 498 499It is also useful to know that the special symbol "HEAD" can always 500be used to refer to the current branch. 501 502Examining branches from a remote repository 503------------------------------------------- 504 505The "master" branch that was created at the time you cloned is a copy 506of the HEAD in the repository that you cloned from. That repository 507may also have had other branches, though, and your local repository 508keeps branches which track each of those remote branches, which you 509can view using the "-r" option to gitlink:git-branch[1]: 510 511------------------------------------------------ 512$ git branch -r 513 origin/HEAD 514 origin/html 515 origin/maint 516 origin/man 517 origin/master 518 origin/next 519 origin/pu 520 origin/todo 521------------------------------------------------ 522 523You cannot check out these remote-tracking branches, but you can 524examine them on a branch of your own, just as you would a tag: 525 526------------------------------------------------ 527$ git checkout -b my-todo-copy origin/todo 528------------------------------------------------ 529 530Note that the name "origin" is just the name that git uses by default 531to refer to the repository that you cloned from. 532 533[[how-git-stores-references]] 534Naming branches, tags, and other references 535------------------------------------------- 536 537Branches, remote-tracking branches, and tags are all references to 538commits. All references are named with a slash-separated path name 539starting with "refs"; the names we've been using so far are actually 540shorthand: 541 542 - The branch "test" is short for "refs/heads/test". 543 - The tag "v2.6.18" is short for "refs/tags/v2.6.18". 544 - "origin/master" is short for "refs/remotes/origin/master". 545 546The full name is occasionally useful if, for example, there ever 547exists a tag and a branch with the same name. 548 549As another useful shortcut, if the repository "origin" posesses only 550a single branch, you can refer to that branch as just "origin". 551 552More generally, if you have defined a remote repository named 553"example", you can refer to the branch in that repository as 554"example". And for a repository with multiple branches, this will 555refer to the branch designated as the "HEAD" branch. 556 557For the complete list of paths which git checks for references, and 558the order it uses to decide which to choose when there are multiple 559references with the same shorthand name, see the "SPECIFYING 560REVISIONS" section of gitlink:git-rev-parse[1]. 561 562[[Updating-a-repository-with-git-fetch]] 563Updating a repository with git fetch 564------------------------------------ 565 566Eventually the developer cloned from will do additional work in her 567repository, creating new commits and advancing the branches to point 568at the new commits. 569 570The command "git fetch", with no arguments, will update all of the 571remote-tracking branches to the latest version found in her 572repository. It will not touch any of your own branches--not even the 573"master" branch that was created for you on clone. 574 575Fetching branches from other repositories 576----------------------------------------- 577 578You can also track branches from repositories other than the one you 579cloned from, using gitlink:git-remote[1]: 580 581------------------------------------------------- 582$ git remote add linux-nfs git://linux-nfs.org/pub/nfs-2.6.git 583$ git fetch 584* refs/remotes/linux-nfs/master: storing branch 'master' ... 585 commit: bf81b46 586------------------------------------------------- 587 588New remote-tracking branches will be stored under the shorthand name 589that you gave "git remote add", in this case linux-nfs: 590 591------------------------------------------------- 592$ git branch -r 593linux-nfs/master 594origin/master 595------------------------------------------------- 596 597If you run "git fetch <remote>" later, the tracking branches for the 598named <remote> will be updated. 599 600If you examine the file .git/config, you will see that git has added 601a new stanza: 602 603------------------------------------------------- 604$ cat .git/config 605... 606[remote "linux-nfs"] 607 url = git://linux-nfs.org/pub/nfs-2.6.git 608 fetch = +refs/heads/*:refs/remotes/linux-nfs/* 609... 610------------------------------------------------- 611 612This is what causes git to track the remote's branches; you may modify 613or delete these configuration options by editing .git/config with a 614text editor. (See the "CONFIGURATION FILE" section of 615gitlink:git-config[1] for details.) 616 617Exploring git history 618===================== 619 620Git is best thought of as a tool for storing the history of a 621collection of files. It does this by storing compressed snapshots of 622the contents of a file heirarchy, together with "commits" which show 623the relationships between these snapshots. 624 625Git provides extremely flexible and fast tools for exploring the 626history of a project. 627 628We start with one specialized tool that is useful for finding the 629commit that introduced a bug into a project. 630 631How to use bisect to find a regression 632-------------------------------------- 633 634Suppose version 2.6.18 of your project worked, but the version at 635"master" crashes. Sometimes the best way to find the cause of such a 636regression is to perform a brute-force search through the project's 637history to find the particular commit that caused the problem. The 638gitlink:git-bisect[1] command can help you do this: 639 640------------------------------------------------- 641$ git bisect start 642$ git bisect good v2.6.18 643$ git bisect bad master 644Bisecting: 3537 revisions left to test after this 645[65934a9a028b88e83e2b0f8b36618fe503349f8e] BLOCK: Make USB storage depend on SCSI rather than selecting it [try #6] 646------------------------------------------------- 647 648If you run "git branch" at this point, you'll see that git has 649temporarily moved you to a new branch named "bisect". This branch 650points to a commit (with commit id 65934...) that is reachable from 651v2.6.19 but not from v2.6.18. Compile and test it, and see whether 652it crashes. Assume it does crash. Then: 653 654------------------------------------------------- 655$ git bisect bad 656Bisecting: 1769 revisions left to test after this 657[7eff82c8b1511017ae605f0c99ac275a7e21b867] i2c-core: Drop useless bitmaskings 658------------------------------------------------- 659 660checks out an older version. Continue like this, telling git at each 661stage whether the version it gives you is good or bad, and notice 662that the number of revisions left to test is cut approximately in 663half each time. 664 665After about 13 tests (in this case), it will output the commit id of 666the guilty commit. You can then examine the commit with 667gitlink:git-show[1], find out who wrote it, and mail them your bug 668report with the commit id. Finally, run 669 670------------------------------------------------- 671$ git bisect reset 672------------------------------------------------- 673 674to return you to the branch you were on before and delete the 675temporary "bisect" branch. 676 677Note that the version which git-bisect checks out for you at each 678point is just a suggestion, and you're free to try a different 679version if you think it would be a good idea. For example, 680occasionally you may land on a commit that broke something unrelated; 681run 682 683------------------------------------------------- 684$ git bisect-visualize 685------------------------------------------------- 686 687which will run gitk and label the commit it chose with a marker that 688says "bisect". Chose a safe-looking commit nearby, note its commit 689id, and check it out with: 690 691------------------------------------------------- 692$ git reset --hard fb47ddb2db... 693------------------------------------------------- 694 695then test, run "bisect good" or "bisect bad" as appropriate, and 696continue. 697 698Naming commits 699-------------- 700 701We have seen several ways of naming commits already: 702 703 - 40-hexdigit object name 704 - branch name: refers to the commit at the head of the given 705 branch 706 - tag name: refers to the commit pointed to by the given tag 707 (we've seen branches and tags are special cases of 708 <<how-git-stores-references,references>>). 709 - HEAD: refers to the head of the current branch 710 711There are many more; see the "SPECIFYING REVISIONS" section of the 712gitlink:git-rev-parse[1] man page for the complete list of ways to 713name revisions. Some examples: 714 715------------------------------------------------- 716$ git show fb47ddb2 # the first few characters of the object name 717 # are usually enough to specify it uniquely 718$ git show HEAD^ # the parent of the HEAD commit 719$ git show HEAD^^ # the grandparent 720$ git show HEAD~4 # the great-great-grandparent 721------------------------------------------------- 722 723Recall that merge commits may have more than one parent; by default, 724^ and ~ follow the first parent listed in the commit, but you can 725also choose: 726 727------------------------------------------------- 728$ git show HEAD^1 # show the first parent of HEAD 729$ git show HEAD^2 # show the second parent of HEAD 730------------------------------------------------- 731 732In addition to HEAD, there are several other special names for 733commits: 734 735Merges (to be discussed later), as well as operations such as 736git-reset, which change the currently checked-out commit, generally 737set ORIG_HEAD to the value HEAD had before the current operation. 738 739The git-fetch operation always stores the head of the last fetched 740branch in FETCH_HEAD. For example, if you run git fetch without 741specifying a local branch as the target of the operation 742 743------------------------------------------------- 744$ git fetch git://example.com/proj.git theirbranch 745------------------------------------------------- 746 747the fetched commits will still be available from FETCH_HEAD. 748 749When we discuss merges we'll also see the special name MERGE_HEAD, 750which refers to the other branch that we're merging in to the current 751branch. 752 753The gitlink:git-rev-parse[1] command is a low-level command that is 754occasionally useful for translating some name for a commit to the object 755name for that commit: 756 757------------------------------------------------- 758$ git rev-parse origin 759e05db0fd4f31dde7005f075a84f96b360d05984b 760------------------------------------------------- 761 762Creating tags 763------------- 764 765We can also create a tag to refer to a particular commit; after 766running 767 768------------------------------------------------- 769$ git-tag stable-1 1b2e1d63ff 770------------------------------------------------- 771 772You can use stable-1 to refer to the commit 1b2e1d63ff. 773 774This creates a "lightweight" tag. If the tag is a tag you wish to 775share with others, and possibly sign cryptographically, then you 776should create a tag object instead; see the gitlink:git-tag[1] man 777page for details. 778 779Browsing revisions 780------------------ 781 782The gitlink:git-log[1] command can show lists of commits. On its 783own, it shows all commits reachable from the parent commit; but you 784can also make more specific requests: 785 786------------------------------------------------- 787$ git log v2.5.. # commits since (not reachable from) v2.5 788$ git log test..master # commits reachable from master but not test 789$ git log master..test # ...reachable from test but not master 790$ git log master...test # ...reachable from either test or master, 791 # but not both 792$ git log --since="2 weeks ago" # commits from the last 2 weeks 793$ git log Makefile # commits which modify Makefile 794$ git log fs/ # ... which modify any file under fs/ 795$ git log -S'foo()' # commits which add or remove any file data 796 # matching the string 'foo()' 797------------------------------------------------- 798 799And of course you can combine all of these; the following finds 800commits since v2.5 which touch the Makefile or any file under fs: 801 802------------------------------------------------- 803$ git log v2.5.. Makefile fs/ 804------------------------------------------------- 805 806You can also ask git log to show patches: 807 808------------------------------------------------- 809$ git log -p 810------------------------------------------------- 811 812See the "--pretty" option in the gitlink:git-log[1] man page for more 813display options. 814 815Note that git log starts with the most recent commit and works 816backwards through the parents; however, since git history can contain 817multiple independent lines of development, the particular order that 818commits are listed in may be somewhat arbitrary. 819 820Generating diffs 821---------------- 822 823You can generate diffs between any two versions using 824gitlink:git-diff[1]: 825 826------------------------------------------------- 827$ git diff master..test 828------------------------------------------------- 829 830Sometimes what you want instead is a set of patches: 831 832------------------------------------------------- 833$ git format-patch master..test 834------------------------------------------------- 835 836will generate a file with a patch for each commit reachable from test 837but not from master. Note that if master also has commits which are 838not reachable from test, then the combined result of these patches 839will not be the same as the diff produced by the git-diff example. 840 841Viewing old file versions 842------------------------- 843 844You can always view an old version of a file by just checking out the 845correct revision first. But sometimes it is more convenient to be 846able to view an old version of a single file without checking 847anything out; this command does that: 848 849------------------------------------------------- 850$ git show v2.5:fs/locks.c 851------------------------------------------------- 852 853Before the colon may be anything that names a commit, and after it 854may be any path to a file tracked by git. 855 856Examples 857-------- 858 859Check whether two branches point at the same history 860~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 861 862Suppose you want to check whether two branches point at the same point 863in history. 864 865------------------------------------------------- 866$ git diff origin..master 867------------------------------------------------- 868 869will tell you whether the contents of the project are the same at the 870two branches; in theory, however, it's possible that the same project 871contents could have been arrived at by two different historical 872routes. You could compare the object names: 873 874------------------------------------------------- 875$ git rev-list origin 876e05db0fd4f31dde7005f075a84f96b360d05984b 877$ git rev-list master 878e05db0fd4f31dde7005f075a84f96b360d05984b 879------------------------------------------------- 880 881Or you could recall that the ... operator selects all commits 882contained reachable from either one reference or the other but not 883both: so 884 885------------------------------------------------- 886$ git log origin...master 887------------------------------------------------- 888 889will return no commits when the two branches are equal. 890 891Find first tagged version including a given fix 892~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 893 894Suppose you know that the commit e05db0fd fixed a certain problem. 895You'd like to find the earliest tagged release that contains that 896fix. 897 898Of course, there may be more than one answer--if the history branched 899after commit e05db0fd, then there could be multiple "earliest" tagged 900releases. 901 902You could just visually inspect the commits since e05db0fd: 903 904------------------------------------------------- 905$ gitk e05db0fd.. 906------------------------------------------------- 907 908Or you can use gitlink:git-name-rev[1], which will give the commit a 909name based on any tag it finds pointing to one of the commit's 910descendants: 911 912------------------------------------------------- 913$ git name-rev e05db0fd 914e05db0fd tags/v1.5.0-rc1^0~23 915------------------------------------------------- 916 917The gitlink:git-describe[1] command does the opposite, naming the 918revision using a tag on which the given commit is based: 919 920------------------------------------------------- 921$ git describe e05db0fd 922v1.5.0-rc0-ge05db0f 923------------------------------------------------- 924 925but that may sometimes help you guess which tags might come after the 926given commit. 927 928If you just want to verify whether a given tagged version contains a 929given commit, you could use gitlink:git-merge-base[1]: 930 931------------------------------------------------- 932$ git merge-base e05db0fd v1.5.0-rc1 933e05db0fd4f31dde7005f075a84f96b360d05984b 934------------------------------------------------- 935 936The merge-base command finds a common ancestor of the given commits, 937and always returns one or the other in the case where one is a 938descendant of the other; so the above output shows that e05db0fd 939actually is an ancestor of v1.5.0-rc1. 940 941Alternatively, note that 942 943------------------------------------------------- 944$ git log v1.5.0-rc1..e05db0fd 945------------------------------------------------- 946 947will produce empty output if and only if v1.5.0-rc1 includes e05db0fd, 948because it outputs only commits that are not reachable from v1.5.0-rc1. 949 950As yet another alternative, the gitlink:git-show-branch[1] command lists 951the commits reachable from its arguments with a display on the left-hand 952side that indicates which arguments that commit is reachable from. So, 953you can run something like 954 955------------------------------------------------- 956$ git show-branch e05db0fd v1.5.0-rc0 v1.5.0-rc1 v1.5.0-rc2 957! [e05db0fd] Fix warnings in sha1_file.c - use C99 printf format if 958available 959 ! [v1.5.0-rc0] GIT v1.5.0 preview 960 ! [v1.5.0-rc1] GIT v1.5.0-rc1 961 ! [v1.5.0-rc2] GIT v1.5.0-rc2 962... 963------------------------------------------------- 964 965then search for a line that looks like 966 967------------------------------------------------- 968+ ++ [e05db0fd] Fix warnings in sha1_file.c - use C99 printf format if 969available 970------------------------------------------------- 971 972Which shows that e05db0fd is reachable from itself, from v1.5.0-rc1, and 973from v1.5.0-rc2, but not from v1.5.0-rc0. 974 975 976Developing with git 977=================== 978 979Telling git your name 980--------------------- 981 982Before creating any commits, you should introduce yourself to git. The 983easiest way to do so is: 984 985------------------------------------------------ 986$ cat >~/.gitconfig <<\EOF 987[user] 988 name = Your Name Comes Here 989 email = you@yourdomain.example.com 990EOF 991------------------------------------------------ 992 993(See the "CONFIGURATION FILE" section of gitlink:git-config[1] for 994details on the configuration file.) 995 996 997Creating a new repository 998------------------------- 9991000Creating a new repository from scratch is very easy:10011002-------------------------------------------------1003$ mkdir project1004$ cd project1005$ git init1006-------------------------------------------------10071008If you have some initial content (say, a tarball):10091010-------------------------------------------------1011$ tar -xzvf project.tar.gz1012$ cd project1013$ git init1014$ git add . # include everything below ./ in the first commit:1015$ git commit1016-------------------------------------------------10171018[[how-to-make-a-commit]]1019how to make a commit1020--------------------10211022Creating a new commit takes three steps:10231024 1. Making some changes to the working directory using your1025 favorite editor.1026 2. Telling git about your changes.1027 3. Creating the commit using the content you told git about1028 in step 2.10291030In practice, you can interleave and repeat steps 1 and 2 as many1031times as you want: in order to keep track of what you want committed1032at step 3, git maintains a snapshot of the tree's contents in a1033special staging area called "the index."10341035At the beginning, the content of the index will be identical to1036that of the HEAD. The command "git diff --cached", which shows1037the difference between the HEAD and the index, should therefore1038produce no output at that point.10391040Modifying the index is easy:10411042To update the index with the new contents of a modified file, use10431044-------------------------------------------------1045$ git add path/to/file1046-------------------------------------------------10471048To add the contents of a new file to the index, use10491050-------------------------------------------------1051$ git add path/to/file1052-------------------------------------------------10531054To remove a file from the index and from the working tree,10551056-------------------------------------------------1057$ git rm path/to/file1058-------------------------------------------------10591060After each step you can verify that10611062-------------------------------------------------1063$ git diff --cached1064-------------------------------------------------10651066always shows the difference between the HEAD and the index file--this1067is what you'd commit if you created the commit now--and that10681069-------------------------------------------------1070$ git diff1071-------------------------------------------------10721073shows the difference between the working tree and the index file.10741075Note that "git add" always adds just the current contents of a file1076to the index; further changes to the same file will be ignored unless1077you run git-add on the file again.10781079When you're ready, just run10801081-------------------------------------------------1082$ git commit1083-------------------------------------------------10841085and git will prompt you for a commit message and then create the new1086commit. Check to make sure it looks like what you expected with10871088-------------------------------------------------1089$ git show1090-------------------------------------------------10911092As a special shortcut,10931094-------------------------------------------------1095$ git commit -a1096-------------------------------------------------10971098will update the index with any files that you've modified or removed1099and create a commit, all in one step.11001101A number of commands are useful for keeping track of what you're1102about to commit:11031104-------------------------------------------------1105$ git diff --cached # difference between HEAD and the index; what1106 # would be commited if you ran "commit" now.1107$ git diff # difference between the index file and your1108 # working directory; changes that would not1109 # be included if you ran "commit" now.1110$ git status # a brief per-file summary of the above.1111-------------------------------------------------11121113creating good commit messages1114-----------------------------11151116Though not required, it's a good idea to begin the commit message1117with a single short (less than 50 character) line summarizing the1118change, followed by a blank line and then a more thorough1119description. Tools that turn commits into email, for example, use1120the first line on the Subject line and the rest of the commit in the1121body.11221123how to merge1124------------11251126You can rejoin two diverging branches of development using1127gitlink:git-merge[1]:11281129-------------------------------------------------1130$ git merge branchname1131-------------------------------------------------11321133merges the development in the branch "branchname" into the current1134branch. If there are conflicts--for example, if the same file is1135modified in two different ways in the remote branch and the local1136branch--then you are warned; the output may look something like this:11371138-------------------------------------------------1139$ git merge next1140 100% (4/4) done1141Auto-merged file.txt1142CONFLICT (content): Merge conflict in file.txt1143Automatic merge failed; fix conflicts and then commit the result.1144-------------------------------------------------11451146Conflict markers are left in the problematic files, and after1147you resolve the conflicts manually, you can update the index1148with the contents and run git commit, as you normally would when1149creating a new file.11501151If you examine the resulting commit using gitk, you will see that it1152has two parents, one pointing to the top of the current branch, and1153one to the top of the other branch.11541155In more detail:11561157[[resolving-a-merge]]1158Resolving a merge1159-----------------11601161When a merge isn't resolved automatically, git leaves the index and1162the working tree in a special state that gives you all the1163information you need to help resolve the merge.11641165Files with conflicts are marked specially in the index, so until you1166resolve the problem and update the index, gitlink:git-commit[1] will1167fail:11681169-------------------------------------------------1170$ git commit1171file.txt: needs merge1172-------------------------------------------------11731174Also, gitlink:git-status[1] will list those files as "unmerged", and the1175files with conflicts will have conflict markers added, like this:11761177-------------------------------------------------1178<<<<<<< HEAD:file.txt1179Hello world1180=======1181Goodbye1182>>>>>>> 77976da35a11db4580b80ae27e8d65caf5208086:file.txt1183-------------------------------------------------11841185All you need to do is edit the files to resolve the conflicts, and then11861187-------------------------------------------------1188$ git add file.txt1189$ git commit1190-------------------------------------------------11911192Note that the commit message will already be filled in for you with1193some information about the merge. Normally you can just use this1194default message unchanged, but you may add additional commentary of1195your own if desired.11961197The above is all you need to know to resolve a simple merge. But git1198also provides more information to help resolve conflicts:11991200Getting conflict-resolution help during a merge1201~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~12021203All of the changes that git was able to merge automatically are1204already added to the index file, so gitlink:git-diff[1] shows only1205the conflicts. It uses an unusual syntax:12061207-------------------------------------------------1208$ git diff1209diff --cc file.txt1210index 802992c,2b60207..00000001211--- a/file.txt1212+++ b/file.txt1213@@@ -1,1 -1,1 +1,5 @@@1214++<<<<<<< HEAD:file.txt1215 +Hello world1216++=======1217+ Goodbye1218++>>>>>>> 77976da35a11db4580b80ae27e8d65caf5208086:file.txt1219-------------------------------------------------12201221Recall that the commit which will be commited after we resolve this1222conflict will have two parents instead of the usual one: one parent1223will be HEAD, the tip of the current branch; the other will be the1224tip of the other branch, which is stored temporarily in MERGE_HEAD.12251226During the merge, the index holds three versions of each file. Each of1227these three "file stages" represents a different version of the file:12281229-------------------------------------------------1230$ git show :1:file.txt # the file in a common ancestor of both branches1231$ git show :2:file.txt # the version from HEAD, but including any1232 # nonconflicting changes from MERGE_HEAD1233$ git show :3:file.txt # the version from MERGE_HEAD, but including any1234 # nonconflicting changes from HEAD.1235-------------------------------------------------12361237Since the stage 2 and stage 3 versions have already been updated with1238nonconflicting changes, the only remaining differences between them are1239the important ones; thus gitlink:git-diff[1] can use the information in1240the index to show only those conflicts.12411242The diff above shows the differences between the working-tree version of1243file.txt and the stage 2 and stage 3 versions. So instead of preceding1244each line by a single "+" or "-", it now uses two columns: the first1245column is used for differences between the first parent and the working1246directory copy, and the second for differences between the second parent1247and the working directory copy. (See the "COMBINED DIFF FORMAT" section1248of gitlink:git-diff-files[1] for a details of the format.)12491250After resolving the conflict in the obvious way (but before updating the1251index), the diff will look like:12521253-------------------------------------------------1254$ git diff1255diff --cc file.txt1256index 802992c,2b60207..00000001257--- a/file.txt1258+++ b/file.txt1259@@@ -1,1 -1,1 +1,1 @@@1260- Hello world1261 -Goodbye1262++Goodbye world1263-------------------------------------------------12641265This shows that our resolved version deleted "Hello world" from the1266first parent, deleted "Goodbye" from the second parent, and added1267"Goodbye world", which was previously absent from both.12681269Some special diff options allow diffing the working directory against1270any of these stages:12711272-------------------------------------------------1273$ git diff -1 file.txt # diff against stage 11274$ git diff --base file.txt # same as the above1275$ git diff -2 file.txt # diff against stage 21276$ git diff --ours file.txt # same as the above1277$ git diff -3 file.txt # diff against stage 31278$ git diff --theirs file.txt # same as the above.1279-------------------------------------------------12801281The gitlink:git-log[1] and gitk[1] commands also provide special help1282for merges:12831284-------------------------------------------------1285$ git log --merge1286$ gitk --merge1287-------------------------------------------------12881289These will display all commits which exist only on HEAD or on1290MERGE_HEAD, and which touch an unmerged file.12911292Each time you resolve the conflicts in a file and update the index:12931294-------------------------------------------------1295$ git add file.txt1296-------------------------------------------------12971298the different stages of that file will be "collapsed", after which1299git-diff will (by default) no longer show diffs for that file.13001301[[undoing-a-merge]]1302undoing a merge1303---------------13041305If you get stuck and decide to just give up and throw the whole mess1306away, you can always return to the pre-merge state with13071308-------------------------------------------------1309$ git reset --hard HEAD1310-------------------------------------------------13111312Or, if you've already commited the merge that you want to throw away,13131314-------------------------------------------------1315$ git reset --hard ORIG_HEAD1316-------------------------------------------------13171318However, this last command can be dangerous in some cases--never1319throw away a commit you have already committed if that commit may1320itself have been merged into another branch, as doing so may confuse1321further merges.13221323Fast-forward merges1324-------------------13251326There is one special case not mentioned above, which is treated1327differently. Normally, a merge results in a merge commit, with two1328parents, one pointing at each of the two lines of development that1329were merged.13301331However, if one of the two lines of development is completely1332contained within the other--so every commit present in the one is1333already contained in the other--then git just performs a1334<<fast-forwards,fast forward>>; the head of the current branch is1335moved forward to point at the head of the merged-in branch, without1336any new commits being created.13371338Fixing mistakes1339---------------13401341If you've messed up the working tree, but haven't yet committed your1342mistake, you can return the entire working tree to the last committed1343state with13441345-------------------------------------------------1346$ git reset --hard HEAD1347-------------------------------------------------13481349If you make a commit that you later wish you hadn't, there are two1350fundamentally different ways to fix the problem:13511352 1. You can create a new commit that undoes whatever was done1353 by the previous commit. This is the correct thing if your1354 mistake has already been made public.13551356 2. You can go back and modify the old commit. You should1357 never do this if you have already made the history public;1358 git does not normally expect the "history" of a project to1359 change, and cannot correctly perform repeated merges from1360 a branch that has had its history changed.13611362Fixing a mistake with a new commit1363~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~13641365Creating a new commit that reverts an earlier change is very easy;1366just pass the gitlink:git-revert[1] command a reference to the bad1367commit; for example, to revert the most recent commit:13681369-------------------------------------------------1370$ git revert HEAD1371-------------------------------------------------13721373This will create a new commit which undoes the change in HEAD. You1374will be given a chance to edit the commit message for the new commit.13751376You can also revert an earlier change, for example, the next-to-last:13771378-------------------------------------------------1379$ git revert HEAD^1380-------------------------------------------------13811382In this case git will attempt to undo the old change while leaving1383intact any changes made since then. If more recent changes overlap1384with the changes to be reverted, then you will be asked to fix1385conflicts manually, just as in the case of <<resolving-a-merge,1386resolving a merge>>.13871388[[fixing-a-mistake-by-editing-history]]1389Fixing a mistake by editing history1390~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~13911392If the problematic commit is the most recent commit, and you have not1393yet made that commit public, then you may just1394<<undoing-a-merge,destroy it using git-reset>>.13951396Alternatively, you1397can edit the working directory and update the index to fix your1398mistake, just as if you were going to <<how-to-make-a-commit,create a1399new commit>>, then run14001401-------------------------------------------------1402$ git commit --amend1403-------------------------------------------------14041405which will replace the old commit by a new commit incorporating your1406changes, giving you a chance to edit the old commit message first.14071408Again, you should never do this to a commit that may already have1409been merged into another branch; use gitlink:git-revert[1] instead in1410that case.14111412It is also possible to edit commits further back in the history, but1413this is an advanced topic to be left for1414<<cleaning-up-history,another chapter>>.14151416Checking out an old version of a file1417~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~14181419In the process of undoing a previous bad change, you may find it1420useful to check out an older version of a particular file using1421gitlink:git-checkout[1]. We've used git checkout before to switch1422branches, but it has quite different behavior if it is given a path1423name: the command14241425-------------------------------------------------1426$ git checkout HEAD^ path/to/file1427-------------------------------------------------14281429replaces path/to/file by the contents it had in the commit HEAD^, and1430also updates the index to match. It does not change branches.14311432If you just want to look at an old version of the file, without1433modifying the working directory, you can do that with1434gitlink:git-show[1]:14351436-------------------------------------------------1437$ git show HEAD^:path/to/file1438-------------------------------------------------14391440which will display the given version of the file.14411442Ensuring good performance1443-------------------------14441445On large repositories, git depends on compression to keep the history1446information from taking up to much space on disk or in memory.14471448This compression is not performed automatically. Therefore you1449should occasionally run gitlink:git-gc[1]:14501451-------------------------------------------------1452$ git gc1453-------------------------------------------------14541455to recompress the archive. This can be very time-consuming, so1456you may prefer to run git-gc when you are not doing other work.14571458Ensuring reliability1459--------------------14601461Checking the repository for corruption1462~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~14631464The gitlink:git-fsck[1] command runs a number of self-consistency checks1465on the repository, and reports on any problems. This may take some1466time. The most common warning by far is about "dangling" objects:14671468-------------------------------------------------1469$ git fsck1470dangling commit 7281251ddd2a61e38657c827739c57015671a6b31471dangling commit 2706a059f258c6b245f298dc4ff2ccd30ec21a631472dangling commit 13472b7c4b80851a1bc551779171dcb03655e9b51473dangling blob 218761f9d90712d37a9c5e36f406f92202db07eb1474dangling commit bf093535a34a4d35731aa2bd90fe6b176302f14f1475dangling commit 8e4bec7f2ddaa268bef999853c25755452100f8e1476dangling tree d50bb86186bf27b681d25af89d3b5b68382e40851477dangling tree b24c2473f1fd3d91352a624795be026d64c8841f1478...1479-------------------------------------------------14801481Dangling objects are objects that are harmless, but also unnecessary;1482you can remove them at any time with gitlink:git-prune[1] or the --prune1483option to gitlink:git-gc[1]:14841485-------------------------------------------------1486$ git gc --prune1487-------------------------------------------------14881489This may be time-consuming. Unlike most other git operations (including1490git-gc when run without any options), it is not safe to prune while1491other git operations are in progress in the same repository.14921493For more about dangling objects, see <<dangling-objects>>.149414951496Recovering lost changes1497~~~~~~~~~~~~~~~~~~~~~~~14981499Reflogs1500^^^^^^^15011502Say you modify a branch with gitlink:git-reset[1] --hard, and then1503realize that the branch was the only reference you had to that point in1504history.15051506Fortunately, git also keeps a log, called a "reflog", of all the1507previous values of each branch. So in this case you can still find the1508old history using, for example, 15091510-------------------------------------------------1511$ git log master@{1}1512-------------------------------------------------15131514This lists the commits reachable from the previous version of the head.1515This syntax can be used to with any git command that accepts a commit,1516not just with git log. Some other examples:15171518-------------------------------------------------1519$ git show master@{2} # See where the branch pointed 2,1520$ git show master@{3} # 3, ... changes ago.1521$ gitk master@{yesterday} # See where it pointed yesterday,1522$ gitk master@{"1 week ago"} # ... or last week1523-------------------------------------------------15241525The reflogs are kept by default for 30 days, after which they may be1526pruned. See gitlink:git-reflog[1] and gitlink:git-gc[1] to learn1527how to control this pruning, and see the "SPECIFYING REVISIONS"1528section of gitlink:git-rev-parse[1] for details.15291530Note that the reflog history is very different from normal git history.1531While normal history is shared by every repository that works on the1532same project, the reflog history is not shared: it tells you only about1533how the branches in your local repository have changed over time.15341535Examining dangling objects1536^^^^^^^^^^^^^^^^^^^^^^^^^^15371538In some situations the reflog may not be able to save you. For1539example, suppose you delete a branch, then realize you need the history1540it contained. The reflog is also deleted; however, if you have not1541yet pruned the repository, then you may still be able to find1542the lost commits; run git-fsck and watch for output that mentions1543"dangling commits":15441545-------------------------------------------------1546$ git fsck1547dangling commit 7281251ddd2a61e38657c827739c57015671a6b31548dangling commit 2706a059f258c6b245f298dc4ff2ccd30ec21a631549dangling commit 13472b7c4b80851a1bc551779171dcb03655e9b51550...1551-------------------------------------------------15521553You can examine1554one of those dangling commits with, for example,15551556------------------------------------------------1557$ gitk 7281251ddd --not --all1558------------------------------------------------15591560which does what it sounds like: it says that you want to see the commit1561history that is described by the dangling commit(s), but not the1562history that is described by all your existing branches and tags. Thus1563you get exactly the history reachable from that commit that is lost.1564(And notice that it might not be just one commit: we only report the1565"tip of the line" as being dangling, but there might be a whole deep1566and complex commit history that was dropped.)15671568If you decide you want the history back, you can always create a new1569reference pointing to it, for example, a new branch:15701571------------------------------------------------1572$ git branch recovered-branch 7281251ddd 1573------------------------------------------------157415751576Sharing development with others1577===============================15781579[[getting-updates-with-git-pull]]1580Getting updates with git pull1581-----------------------------15821583After you clone a repository and make a few changes of your own, you1584may wish to check the original repository for updates and merge them1585into your own work.15861587We have already seen <<Updating-a-repository-with-git-fetch,how to1588keep remote tracking branches up to date>> with gitlink:git-fetch[1],1589and how to merge two branches. So you can merge in changes from the1590original repository's master branch with:15911592-------------------------------------------------1593$ git fetch1594$ git merge origin/master1595-------------------------------------------------15961597However, the gitlink:git-pull[1] command provides a way to do this in1598one step:15991600-------------------------------------------------1601$ git pull origin master1602-------------------------------------------------16031604In fact, "origin" is normally the default repository to pull from,1605and the default branch is normally the HEAD of the remote repository,1606so often you can accomplish the above with just16071608-------------------------------------------------1609$ git pull1610-------------------------------------------------16111612See the descriptions of the branch.<name>.remote and1613branch.<name>.merge options in gitlink:git-config[1] to learn1614how to control these defaults depending on the current branch.16151616In addition to saving you keystrokes, "git pull" also helps you by1617producing a default commit message documenting the branch and1618repository that you pulled from.16191620(But note that no such commit will be created in the case of a1621<<fast-forwards,fast forward>>; instead, your branch will just be1622updated to point to the latest commit from the upstream branch.)16231624The git-pull command can also be given "." as the "remote" repository,1625in which case it just merges in a branch from the current repository; so1626the commands16271628-------------------------------------------------1629$ git pull . branch1630$ git merge branch1631-------------------------------------------------16321633are roughly equivalent. The former is actually very commonly used.16341635Submitting patches to a project1636-------------------------------16371638If you just have a few changes, the simplest way to submit them may1639just be to send them as patches in email:16401641First, use gitlink:git-format-patch[1]; for example:16421643-------------------------------------------------1644$ git format-patch origin1645-------------------------------------------------16461647will produce a numbered series of files in the current directory, one1648for each patch in the current branch but not in origin/HEAD.16491650You can then import these into your mail client and send them by1651hand. However, if you have a lot to send at once, you may prefer to1652use the gitlink:git-send-email[1] script to automate the process.1653Consult the mailing list for your project first to determine how they1654prefer such patches be handled.16551656Importing patches to a project1657------------------------------16581659Git also provides a tool called gitlink:git-am[1] (am stands for1660"apply mailbox"), for importing such an emailed series of patches.1661Just save all of the patch-containing messages, in order, into a1662single mailbox file, say "patches.mbox", then run16631664-------------------------------------------------1665$ git am -3 patches.mbox1666-------------------------------------------------16671668Git will apply each patch in order; if any conflicts are found, it1669will stop, and you can fix the conflicts as described in1670"<<resolving-a-merge,Resolving a merge>>". (The "-3" option tells1671git to perform a merge; if you would prefer it just to abort and1672leave your tree and index untouched, you may omit that option.)16731674Once the index is updated with the results of the conflict1675resolution, instead of creating a new commit, just run16761677-------------------------------------------------1678$ git am --resolved1679-------------------------------------------------16801681and git will create the commit for you and continue applying the1682remaining patches from the mailbox.16831684The final result will be a series of commits, one for each patch in1685the original mailbox, with authorship and commit log message each1686taken from the message containing each patch.16871688[[setting-up-a-public-repository]]1689Setting up a public repository1690------------------------------16911692Another way to submit changes to a project is to simply tell the1693maintainer of that project to pull from your repository, exactly as1694you did in the section "<<getting-updates-with-git-pull, Getting1695updates with git pull>>".16961697If you and maintainer both have accounts on the same machine, then1698then you can just pull changes from each other's repositories1699directly; note that all of the commands (gitlink:git-clone[1],1700git-fetch[1], git-pull[1], etc.) that accept a URL as an argument1701will also accept a local file patch; so, for example, you can1702use17031704-------------------------------------------------1705$ git clone /path/to/repository1706$ git pull /path/to/other/repository1707-------------------------------------------------17081709If this sort of setup is inconvenient or impossible, another (more1710common) option is to set up a public repository on a public server.1711This also allows you to cleanly separate private work in progress1712from publicly visible work.17131714You will continue to do your day-to-day work in your personal1715repository, but periodically "push" changes from your personal1716repository into your public repository, allowing other developers to1717pull from that repository. So the flow of changes, in a situation1718where there is one other developer with a public repository, looks1719like this:17201721 you push1722 your personal repo ------------------> your public repo1723 ^ |1724 | |1725 | you pull | they pull1726 | |1727 | |1728 | they push V1729 their public repo <------------------- their repo17301731Now, assume your personal repository is in the directory ~/proj. We1732first create a new clone of the repository:17331734-------------------------------------------------1735$ git clone --bare proj-clone.git1736-------------------------------------------------17371738The resulting directory proj-clone.git will contains a "bare" git1739repository--it is just the contents of the ".git" directory, without1740a checked-out copy of a working directory.17411742Next, copy proj-clone.git to the server where you plan to host the1743public repository. You can use scp, rsync, or whatever is most1744convenient.17451746If somebody else maintains the public server, they may already have1747set up a git service for you, and you may skip to the section1748"<<pushing-changes-to-a-public-repository,Pushing changes to a public1749repository>>", below.17501751Otherwise, the following sections explain how to export your newly1752created public repository:17531754[[exporting-via-http]]1755Exporting a git repository via http1756-----------------------------------17571758The git protocol gives better performance and reliability, but on a1759host with a web server set up, http exports may be simpler to set up.17601761All you need to do is place the newly created bare git repository in1762a directory that is exported by the web server, and make some1763adjustments to give web clients some extra information they need:17641765-------------------------------------------------1766$ mv proj.git /home/you/public_html/proj.git1767$ cd proj.git1768$ git update-server-info1769$ chmod a+x hooks/post-update1770-------------------------------------------------17711772(For an explanation of the last two lines, see1773gitlink:git-update-server-info[1], and the documentation1774link:hooks.txt[Hooks used by git].)17751776Advertise the url of proj.git. Anybody else should then be able to1777clone or pull from that url, for example with a commandline like:17781779-------------------------------------------------1780$ git clone http://yourserver.com/~you/proj.git1781-------------------------------------------------17821783(See also1784link:howto/setup-git-server-over-http.txt[setup-git-server-over-http]1785for a slightly more sophisticated setup using WebDAV which also1786allows pushing over http.)17871788[[exporting-via-git]]1789Exporting a git repository via the git protocol1790-----------------------------------------------17911792This is the preferred method.17931794For now, we refer you to the gitlink:git-daemon[1] man page for1795instructions. (See especially the examples section.)17961797[[pushing-changes-to-a-public-repository]]1798Pushing changes to a public repository1799--------------------------------------18001801Note that the two techniques outline above (exporting via1802<<exporting-via-http,http>> or <<exporting-via-git,git>>) allow other1803maintainers to fetch your latest changes, but they do not allow write1804access, which you will need to update the public repository with the1805latest changes created in your private repository.18061807The simplest way to do this is using gitlink:git-push[1] and ssh; to1808update the remote branch named "master" with the latest state of your1809branch named "master", run18101811-------------------------------------------------1812$ git push ssh://yourserver.com/~you/proj.git master:master1813-------------------------------------------------18141815or just18161817-------------------------------------------------1818$ git push ssh://yourserver.com/~you/proj.git master1819-------------------------------------------------18201821As with git-fetch, git-push will complain if this does not result in1822a <<fast-forwards,fast forward>>. Normally this is a sign of1823something wrong. However, if you are sure you know what you're1824doing, you may force git-push to perform the update anyway by1825proceeding the branch name by a plus sign:18261827-------------------------------------------------1828$ git push ssh://yourserver.com/~you/proj.git +master1829-------------------------------------------------18301831As with git-fetch, you may also set up configuration options to1832save typing; so, for example, after18331834-------------------------------------------------1835$ cat >.git/config <<EOF1836[remote "public-repo"]1837 url = ssh://yourserver.com/~you/proj.git1838EOF1839-------------------------------------------------18401841you should be able to perform the above push with just18421843-------------------------------------------------1844$ git push public-repo master1845-------------------------------------------------18461847See the explanations of the remote.<name>.url, branch.<name>.remote,1848and remote.<name>.push options in gitlink:git-config[1] for1849details.18501851Setting up a shared repository1852------------------------------18531854Another way to collaborate is by using a model similar to that1855commonly used in CVS, where several developers with special rights1856all push to and pull from a single shared repository. See1857link:cvs-migration.txt[git for CVS users] for instructions on how to1858set this up.18591860Allow web browsing of a repository1861----------------------------------18621863The gitweb cgi script provides users an easy way to browse your1864project's files and history without having to install git; see the file1865gitweb/README in the git source tree for instructions on setting it up.18661867Examples1868--------18691870TODO: topic branches, typical roles as in everyday.txt, ?187118721873[[cleaning-up-history]]1874Rewriting history and maintaining patch series1875==============================================18761877Normally commits are only added to a project, never taken away or1878replaced. Git is designed with this assumption, and violating it will1879cause git's merge machinery (for example) to do the wrong thing.18801881However, there is a situation in which it can be useful to violate this1882assumption.18831884Creating the perfect patch series1885---------------------------------18861887Suppose you are a contributor to a large project, and you want to add a1888complicated feature, and to present it to the other developers in a way1889that makes it easy for them to read your changes, verify that they are1890correct, and understand why you made each change.18911892If you present all of your changes as a single patch (or commit), they1893may find that it is too much to digest all at once.18941895If you present them with the entire history of your work, complete with1896mistakes, corrections, and dead ends, they may be overwhelmed.18971898So the ideal is usually to produce a series of patches such that:18991900 1. Each patch can be applied in order.19011902 2. Each patch includes a single logical change, together with a1903 message explaining the change.19041905 3. No patch introduces a regression: after applying any initial1906 part of the series, the resulting project still compiles and1907 works, and has no bugs that it didn't have before.19081909 4. The complete series produces the same end result as your own1910 (probably much messier!) development process did.19111912We will introduce some tools that can help you do this, explain how to1913use them, and then explain some of the problems that can arise because1914you are rewriting history.19151916Keeping a patch series up to date using git-rebase1917--------------------------------------------------19181919Suppose that you create a branch "mywork" on a remote-tracking branch1920"origin", and create some commits on top of it:19211922-------------------------------------------------1923$ git checkout -b mywork origin1924$ vi file.txt1925$ git commit1926$ vi otherfile.txt1927$ git commit1928...1929-------------------------------------------------19301931You have performed no merges into mywork, so it is just a simple linear1932sequence of patches on top of "origin":19331934................................................1935 o--o--o <-- origin1936 \1937 o--o--o <-- mywork1938................................................19391940Some more interesting work has been done in the upstream project, and1941"origin" has advanced:19421943................................................1944 o--o--O--o--o--o <-- origin1945 \1946 a--b--c <-- mywork1947................................................19481949At this point, you could use "pull" to merge your changes back in;1950the result would create a new merge commit, like this:19511952................................................1953 o--o--O--o--o--o <-- origin1954 \ \1955 a--b--c--m <-- mywork1956................................................19571958However, if you prefer to keep the history in mywork a simple series of1959commits without any merges, you may instead choose to use1960gitlink:git-rebase[1]:19611962-------------------------------------------------1963$ git checkout mywork1964$ git rebase origin1965-------------------------------------------------19661967This will remove each of your commits from mywork, temporarily saving1968them as patches (in a directory named ".dotest"), update mywork to1969point at the latest version of origin, then apply each of the saved1970patches to the new mywork. The result will look like:197119721973................................................1974 o--o--O--o--o--o <-- origin1975 \1976 a'--b'--c' <-- mywork1977................................................19781979In the process, it may discover conflicts. In that case it will stop1980and allow you to fix the conflicts; after fixing conflicts, use "git1981add" to update the index with those contents, and then, instead of1982running git-commit, just run19831984-------------------------------------------------1985$ git rebase --continue1986-------------------------------------------------19871988and git will continue applying the rest of the patches.19891990At any point you may use the --abort option to abort this process and1991return mywork to the state it had before you started the rebase:19921993-------------------------------------------------1994$ git rebase --abort1995-------------------------------------------------19961997Modifying a single commit1998-------------------------19992000We saw in <<fixing-a-mistake-by-editing-history>> that you can replace the2001most recent commit using20022003-------------------------------------------------2004$ git commit --amend2005-------------------------------------------------20062007which will replace the old commit by a new commit incorporating your2008changes, giving you a chance to edit the old commit message first.20092010You can also use a combination of this and gitlink:git-rebase[1] to edit2011commits further back in your history. First, tag the problematic commit with20122013-------------------------------------------------2014$ git tag bad mywork~52015-------------------------------------------------20162017(Either gitk or git-log may be useful for finding the commit.)20182019Then check out a new branch at that commit, edit it, and rebase the rest of2020the series on top of it:20212022-------------------------------------------------2023$ git checkout -b TMP bad2024$ # make changes here and update the index2025$ git commit --amend2026$ git rebase --onto TMP bad mywork2027-------------------------------------------------20282029When you're done, you'll be left with mywork checked out, with the top patches2030on mywork reapplied on top of the modified commit you created in TMP. You can2031then clean up with20322033-------------------------------------------------2034$ git branch -d TMP2035$ git tag -d bad2036-------------------------------------------------20372038Note that the immutable nature of git history means that you haven't really2039"modified" existing commits; instead, you have replaced the old commits with2040new commits having new object names.20412042Reordering or selecting from a patch series2043-------------------------------------------20442045Given one existing commit, the gitlink:git-cherry-pick[1] command2046allows you to apply the change introduced by that commit and create a2047new commit that records it. So, for example, if "mywork" points to a2048series of patches on top of "origin", you might do something like:20492050-------------------------------------------------2051$ git checkout -b mywork-new origin2052$ gitk origin..mywork &2053-------------------------------------------------20542055And browse through the list of patches in the mywork branch using gitk,2056applying them (possibly in a different order) to mywork-new using2057cherry-pick, and possibly modifying them as you go using commit2058--amend.20592060Another technique is to use git-format-patch to create a series of2061patches, then reset the state to before the patches:20622063-------------------------------------------------2064$ git format-patch origin2065$ git reset --hard origin2066-------------------------------------------------20672068Then modify, reorder, or eliminate patches as preferred before applying2069them again with gitlink:git-am[1].20702071Other tools2072-----------20732074There are numerous other tools, such as stgit, which exist for the2075purpose of maintaining a patch series. These are outside of the scope of2076this manual.20772078Problems with rewriting history2079-------------------------------20802081The primary problem with rewriting the history of a branch has to do2082with merging. Suppose somebody fetches your branch and merges it into2083their branch, with a result something like this:20842085................................................2086 o--o--O--o--o--o <-- origin2087 \ \2088 t--t--t--m <-- their branch:2089................................................20902091Then suppose you modify the last three commits:20922093................................................2094 o--o--o <-- new head of origin2095 /2096 o--o--O--o--o--o <-- old head of origin2097................................................20982099If we examined all this history together in one repository, it will2100look like:21012102................................................2103 o--o--o <-- new head of origin2104 /2105 o--o--O--o--o--o <-- old head of origin2106 \ \2107 t--t--t--m <-- their branch:2108................................................21092110Git has no way of knowing that the new head is an updated version of2111the old head; it treats this situation exactly the same as it would if2112two developers had independently done the work on the old and new heads2113in parallel. At this point, if someone attempts to merge the new head2114in to their branch, git will attempt to merge together the two (old and2115new) lines of development, instead of trying to replace the old by the2116new. The results are likely to be unexpected.21172118You may still choose to publish branches whose history is rewritten,2119and it may be useful for others to be able to fetch those branches in2120order to examine or test them, but they should not attempt to pull such2121branches into their own work.21222123For true distributed development that supports proper merging,2124published branches should never be rewritten.21252126Advanced branch management2127==========================21282129Fetching individual branches2130----------------------------21312132Instead of using gitlink:git-remote[1], you can also choose just2133to update one branch at a time, and to store it locally under an2134arbitrary name:21352136-------------------------------------------------2137$ git fetch origin todo:my-todo-work2138-------------------------------------------------21392140The first argument, "origin", just tells git to fetch from the2141repository you originally cloned from. The second argument tells git2142to fetch the branch named "todo" from the remote repository, and to2143store it locally under the name refs/heads/my-todo-work.21442145You can also fetch branches from other repositories; so21462147-------------------------------------------------2148$ git fetch git://example.com/proj.git master:example-master2149-------------------------------------------------21502151will create a new branch named "example-master" and store in it the2152branch named "master" from the repository at the given URL. If you2153already have a branch named example-master, it will attempt to2154"fast-forward" to the commit given by example.com's master branch. So2155next we explain what a fast-forward is:21562157[[fast-forwards]]2158Understanding git history: fast-forwards2159----------------------------------------21602161In the previous example, when updating an existing branch, "git2162fetch" checks to make sure that the most recent commit on the remote2163branch is a descendant of the most recent commit on your copy of the2164branch before updating your copy of the branch to point at the new2165commit. Git calls this process a "fast forward".21662167A fast forward looks something like this:21682169................................................2170 o--o--o--o <-- old head of the branch2171 \2172 o--o--o <-- new head of the branch2173................................................217421752176In some cases it is possible that the new head will *not* actually be2177a descendant of the old head. For example, the developer may have2178realized she made a serious mistake, and decided to backtrack,2179resulting in a situation like:21802181................................................2182 o--o--o--o--a--b <-- old head of the branch2183 \2184 o--o--o <-- new head of the branch2185................................................21862187In this case, "git fetch" will fail, and print out a warning.21882189In that case, you can still force git to update to the new head, as2190described in the following section. However, note that in the2191situation above this may mean losing the commits labeled "a" and "b",2192unless you've already created a reference of your own pointing to2193them.21942195Forcing git fetch to do non-fast-forward updates2196------------------------------------------------21972198If git fetch fails because the new head of a branch is not a2199descendant of the old head, you may force the update with:22002201-------------------------------------------------2202$ git fetch git://example.com/proj.git +master:refs/remotes/example/master2203-------------------------------------------------22042205Note the addition of the "+" sign. Be aware that commits that the2206old version of example/master pointed at may be lost, as we saw in2207the previous section.22082209Configuring remote branches2210---------------------------22112212We saw above that "origin" is just a shortcut to refer to the2213repository that you originally cloned from. This information is2214stored in git configuration variables, which you can see using2215gitlink:git-config[1]:22162217-------------------------------------------------2218$ git config -l2219core.repositoryformatversion=02220core.filemode=true2221core.logallrefupdates=true2222remote.origin.url=git://git.kernel.org/pub/scm/git/git.git2223remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*2224branch.master.remote=origin2225branch.master.merge=refs/heads/master2226-------------------------------------------------22272228If there are other repositories that you also use frequently, you can2229create similar configuration options to save typing; for example,2230after22312232-------------------------------------------------2233$ git config remote.example.url git://example.com/proj.git2234-------------------------------------------------22352236then the following two commands will do the same thing:22372238-------------------------------------------------2239$ git fetch git://example.com/proj.git master:refs/remotes/example/master2240$ git fetch example master:refs/remotes/example/master2241-------------------------------------------------22422243Even better, if you add one more option:22442245-------------------------------------------------2246$ git config remote.example.fetch master:refs/remotes/example/master2247-------------------------------------------------22482249then the following commands will all do the same thing:22502251-------------------------------------------------2252$ git fetch git://example.com/proj.git master:ref/remotes/example/master2253$ git fetch example master:ref/remotes/example/master2254$ git fetch example example/master2255$ git fetch example2256-------------------------------------------------22572258You can also add a "+" to force the update each time:22592260-------------------------------------------------2261$ git config remote.example.fetch +master:ref/remotes/example/master2262-------------------------------------------------22632264Don't do this unless you're sure you won't mind "git fetch" possibly2265throwing away commits on mybranch.22662267Also note that all of the above configuration can be performed by2268directly editing the file .git/config instead of using2269gitlink:git-config[1].22702271See gitlink:git-config[1] for more details on the configuration2272options mentioned above.227322742275[[git-internals]]2276Git internals2277=============22782279There are two object abstractions: the "object database", and the2280"current directory cache" aka "index".22812282The Object Database2283-------------------22842285The object database is literally just a content-addressable collection2286of objects. All objects are named by their content, which is2287approximated by the SHA1 hash of the object itself. Objects may refer2288to other objects (by referencing their SHA1 hash), and so you can2289build up a hierarchy of objects.22902291All objects have a statically determined "type" aka "tag", which is2292determined at object creation time, and which identifies the format of2293the object (i.e. how it is used, and how it can refer to other2294objects). There are currently four different object types: "blob",2295"tree", "commit" and "tag".22962297A "blob" object cannot refer to any other object, and is, like the type2298implies, a pure storage object containing some user data. It is used to2299actually store the file data, i.e. a blob object is associated with some2300particular version of some file. 23012302A "tree" object is an object that ties one or more "blob" objects into a2303directory structure. In addition, a tree object can refer to other tree2304objects, thus creating a directory hierarchy. 23052306A "commit" object ties such directory hierarchies together into2307a DAG of revisions - each "commit" is associated with exactly one tree2308(the directory hierarchy at the time of the commit). In addition, a2309"commit" refers to one or more "parent" commit objects that describe the2310history of how we arrived at that directory hierarchy.23112312As a special case, a commit object with no parents is called the "root"2313object, and is the point of an initial project commit. Each project2314must have at least one root, and while you can tie several different2315root objects together into one project by creating a commit object which2316has two or more separate roots as its ultimate parents, that's probably2317just going to confuse people. So aim for the notion of "one root object2318per project", even if git itself does not enforce that. 23192320A "tag" object symbolically identifies and can be used to sign other2321objects. It contains the identifier and type of another object, a2322symbolic name (of course!) and, optionally, a signature.23232324Regardless of object type, all objects share the following2325characteristics: they are all deflated with zlib, and have a header2326that not only specifies their type, but also provides size information2327about the data in the object. It's worth noting that the SHA1 hash2328that is used to name the object is the hash of the original data2329plus this header, so `sha1sum` 'file' does not match the object name2330for 'file'.2331(Historical note: in the dawn of the age of git the hash2332was the sha1 of the 'compressed' object.)23332334As a result, the general consistency of an object can always be tested2335independently of the contents or the type of the object: all objects can2336be validated by verifying that (a) their hashes match the content of the2337file and (b) the object successfully inflates to a stream of bytes that2338forms a sequence of <ascii type without space> + <space> + <ascii decimal2339size> + <byte\0> + <binary object data>. 23402341The structured objects can further have their structure and2342connectivity to other objects verified. This is generally done with2343the `git-fsck` program, which generates a full dependency graph2344of all objects, and verifies their internal consistency (in addition2345to just verifying their superficial consistency through the hash).23462347The object types in some more detail:23482349Blob Object2350-----------23512352A "blob" object is nothing but a binary blob of data, and doesn't2353refer to anything else. There is no signature or any other2354verification of the data, so while the object is consistent (it 'is'2355indexed by its sha1 hash, so the data itself is certainly correct), it2356has absolutely no other attributes. No name associations, no2357permissions. It is purely a blob of data (i.e. normally "file2358contents").23592360In particular, since the blob is entirely defined by its data, if two2361files in a directory tree (or in multiple different versions of the2362repository) have the same contents, they will share the same blob2363object. The object is totally independent of its location in the2364directory tree, and renaming a file does not change the object that2365file is associated with in any way.23662367A blob is typically created when gitlink:git-update-index[1]2368is run, and its data can be accessed by gitlink:git-cat-file[1].23692370Tree Object2371-----------23722373The next hierarchical object type is the "tree" object. A tree object2374is a list of mode/name/blob data, sorted by name. Alternatively, the2375mode data may specify a directory mode, in which case instead of2376naming a blob, that name is associated with another TREE object.23772378Like the "blob" object, a tree object is uniquely determined by the2379set contents, and so two separate but identical trees will always2380share the exact same object. This is true at all levels, i.e. it's2381true for a "leaf" tree (which does not refer to any other trees, only2382blobs) as well as for a whole subdirectory.23832384For that reason a "tree" object is just a pure data abstraction: it2385has no history, no signatures, no verification of validity, except2386that since the contents are again protected by the hash itself, we can2387trust that the tree is immutable and its contents never change.23882389So you can trust the contents of a tree to be valid, the same way you2390can trust the contents of a blob, but you don't know where those2391contents 'came' from.23922393Side note on trees: since a "tree" object is a sorted list of2394"filename+content", you can create a diff between two trees without2395actually having to unpack two trees. Just ignore all common parts,2396and your diff will look right. In other words, you can effectively2397(and efficiently) tell the difference between any two random trees by2398O(n) where "n" is the size of the difference, rather than the size of2399the tree.24002401Side note 2 on trees: since the name of a "blob" depends entirely and2402exclusively on its contents (i.e. there are no names or permissions2403involved), you can see trivial renames or permission changes by2404noticing that the blob stayed the same. However, renames with data2405changes need a smarter "diff" implementation.24062407A tree is created with gitlink:git-write-tree[1] and2408its data can be accessed by gitlink:git-ls-tree[1].2409Two trees can be compared with gitlink:git-diff-tree[1].24102411Commit Object2412-------------24132414The "commit" object is an object that introduces the notion of2415history into the picture. In contrast to the other objects, it2416doesn't just describe the physical state of a tree, it describes how2417we got there, and why.24182419A "commit" is defined by the tree-object that it results in, the2420parent commits (zero, one or more) that led up to that point, and a2421comment on what happened. Again, a commit is not trusted per se:2422the contents are well-defined and "safe" due to the cryptographically2423strong signatures at all levels, but there is no reason to believe2424that the tree is "good" or that the merge information makes sense.2425The parents do not have to actually have any relationship with the2426result, for example.24272428Note on commits: unlike real SCM's, commits do not contain2429rename information or file mode change information. All of that is2430implicit in the trees involved (the result tree, and the result trees2431of the parents), and describing that makes no sense in this idiotic2432file manager.24332434A commit is created with gitlink:git-commit-tree[1] and2435its data can be accessed by gitlink:git-cat-file[1].24362437Trust2438-----24392440An aside on the notion of "trust". Trust is really outside the scope2441of "git", but it's worth noting a few things. First off, since2442everything is hashed with SHA1, you 'can' trust that an object is2443intact and has not been messed with by external sources. So the name2444of an object uniquely identifies a known state - just not a state that2445you may want to trust.24462447Furthermore, since the SHA1 signature of a commit refers to the2448SHA1 signatures of the tree it is associated with and the signatures2449of the parent, a single named commit specifies uniquely a whole set2450of history, with full contents. You can't later fake any step of the2451way once you have the name of a commit.24522453So to introduce some real trust in the system, the only thing you need2454to do is to digitally sign just 'one' special note, which includes the2455name of a top-level commit. Your digital signature shows others2456that you trust that commit, and the immutability of the history of2457commits tells others that they can trust the whole history.24582459In other words, you can easily validate a whole archive by just2460sending out a single email that tells the people the name (SHA1 hash)2461of the top commit, and digitally sign that email using something2462like GPG/PGP.24632464To assist in this, git also provides the tag object...24652466Tag Object2467----------24682469Git provides the "tag" object to simplify creating, managing and2470exchanging symbolic and signed tokens. The "tag" object at its2471simplest simply symbolically identifies another object by containing2472the sha1, type and symbolic name.24732474However it can optionally contain additional signature information2475(which git doesn't care about as long as there's less than 8k of2476it). This can then be verified externally to git.24772478Note that despite the tag features, "git" itself only handles content2479integrity; the trust framework (and signature provision and2480verification) has to come from outside.24812482A tag is created with gitlink:git-mktag[1],2483its data can be accessed by gitlink:git-cat-file[1],2484and the signature can be verified by2485gitlink:git-verify-tag[1].248624872488The "index" aka "Current Directory Cache"2489-----------------------------------------24902491The index is a simple binary file, which contains an efficient2492representation of a virtual directory content at some random time. It2493does so by a simple array that associates a set of names, dates,2494permissions and content (aka "blob") objects together. The cache is2495always kept ordered by name, and names are unique (with a few very2496specific rules) at any point in time, but the cache has no long-term2497meaning, and can be partially updated at any time.24982499In particular, the index certainly does not need to be consistent with2500the current directory contents (in fact, most operations will depend on2501different ways to make the index 'not' be consistent with the directory2502hierarchy), but it has three very important attributes:25032504'(a) it can re-generate the full state it caches (not just the2505directory structure: it contains pointers to the "blob" objects so2506that it can regenerate the data too)'25072508As a special case, there is a clear and unambiguous one-way mapping2509from a current directory cache to a "tree object", which can be2510efficiently created from just the current directory cache without2511actually looking at any other data. So a directory cache at any one2512time uniquely specifies one and only one "tree" object (but has2513additional data to make it easy to match up that tree object with what2514has happened in the directory)25152516'(b) it has efficient methods for finding inconsistencies between that2517cached state ("tree object waiting to be instantiated") and the2518current state.'25192520'(c) it can additionally efficiently represent information about merge2521conflicts between different tree objects, allowing each pathname to be2522associated with sufficient information about the trees involved that2523you can create a three-way merge between them.'25242525Those are the ONLY three things that the directory cache does. It's a2526cache, and the normal operation is to re-generate it completely from a2527known tree object, or update/compare it with a live tree that is being2528developed. If you blow the directory cache away entirely, you generally2529haven't lost any information as long as you have the name of the tree2530that it described. 25312532At the same time, the index is at the same time also the2533staging area for creating new trees, and creating a new tree always2534involves a controlled modification of the index file. In particular,2535the index file can have the representation of an intermediate tree that2536has not yet been instantiated. So the index can be thought of as a2537write-back cache, which can contain dirty information that has not yet2538been written back to the backing store.2539254025412542The Workflow2543------------25442545Generally, all "git" operations work on the index file. Some operations2546work *purely* on the index file (showing the current state of the2547index), but most operations move data to and from the index file. Either2548from the database or from the working directory. Thus there are four2549main combinations: 25502551working directory -> index2552~~~~~~~~~~~~~~~~~~~~~~~~~~25532554You update the index with information from the working directory with2555the gitlink:git-update-index[1] command. You2556generally update the index information by just specifying the filename2557you want to update, like so:25582559-------------------------------------------------2560$ git-update-index filename2561-------------------------------------------------25622563but to avoid common mistakes with filename globbing etc, the command2564will not normally add totally new entries or remove old entries,2565i.e. it will normally just update existing cache entries.25662567To tell git that yes, you really do realize that certain files no2568longer exist, or that new files should be added, you2569should use the `--remove` and `--add` flags respectively.25702571NOTE! A `--remove` flag does 'not' mean that subsequent filenames will2572necessarily be removed: if the files still exist in your directory2573structure, the index will be updated with their new status, not2574removed. The only thing `--remove` means is that update-cache will be2575considering a removed file to be a valid thing, and if the file really2576does not exist any more, it will update the index accordingly.25772578As a special case, you can also do `git-update-index --refresh`, which2579will refresh the "stat" information of each index to match the current2580stat information. It will 'not' update the object status itself, and2581it will only update the fields that are used to quickly test whether2582an object still matches its old backing store object.25832584index -> object database2585~~~~~~~~~~~~~~~~~~~~~~~~25862587You write your current index file to a "tree" object with the program25882589-------------------------------------------------2590$ git-write-tree2591-------------------------------------------------25922593that doesn't come with any options - it will just write out the2594current index into the set of tree objects that describe that state,2595and it will return the name of the resulting top-level tree. You can2596use that tree to re-generate the index at any time by going in the2597other direction:25982599object database -> index2600~~~~~~~~~~~~~~~~~~~~~~~~26012602You read a "tree" file from the object database, and use that to2603populate (and overwrite - don't do this if your index contains any2604unsaved state that you might want to restore later!) your current2605index. Normal operation is just26062607-------------------------------------------------2608$ git-read-tree <sha1 of tree>2609-------------------------------------------------26102611and your index file will now be equivalent to the tree that you saved2612earlier. However, that is only your 'index' file: your working2613directory contents have not been modified.26142615index -> working directory2616~~~~~~~~~~~~~~~~~~~~~~~~~~26172618You update your working directory from the index by "checking out"2619files. This is not a very common operation, since normally you'd just2620keep your files updated, and rather than write to your working2621directory, you'd tell the index files about the changes in your2622working directory (i.e. `git-update-index`).26232624However, if you decide to jump to a new version, or check out somebody2625else's version, or just restore a previous tree, you'd populate your2626index file with read-tree, and then you need to check out the result2627with26282629-------------------------------------------------2630$ git-checkout-index filename2631-------------------------------------------------26322633or, if you want to check out all of the index, use `-a`.26342635NOTE! git-checkout-index normally refuses to overwrite old files, so2636if you have an old version of the tree already checked out, you will2637need to use the "-f" flag ('before' the "-a" flag or the filename) to2638'force' the checkout.263926402641Finally, there are a few odds and ends which are not purely moving2642from one representation to the other:26432644Tying it all together2645~~~~~~~~~~~~~~~~~~~~~26462647To commit a tree you have instantiated with "git-write-tree", you'd2648create a "commit" object that refers to that tree and the history2649behind it - most notably the "parent" commits that preceded it in2650history.26512652Normally a "commit" has one parent: the previous state of the tree2653before a certain change was made. However, sometimes it can have two2654or more parent commits, in which case we call it a "merge", due to the2655fact that such a commit brings together ("merges") two or more2656previous states represented by other commits.26572658In other words, while a "tree" represents a particular directory state2659of a working directory, a "commit" represents that state in "time",2660and explains how we got there.26612662You create a commit object by giving it the tree that describes the2663state at the time of the commit, and a list of parents:26642665-------------------------------------------------2666$ git-commit-tree <tree> -p <parent> [-p <parent2> ..]2667-------------------------------------------------26682669and then giving the reason for the commit on stdin (either through2670redirection from a pipe or file, or by just typing it at the tty).26712672git-commit-tree will return the name of the object that represents2673that commit, and you should save it away for later use. Normally,2674you'd commit a new `HEAD` state, and while git doesn't care where you2675save the note about that state, in practice we tend to just write the2676result to the file pointed at by `.git/HEAD`, so that we can always see2677what the last committed state was.26782679Here is an ASCII art by Jon Loeliger that illustrates how2680various pieces fit together.26812682------------26832684 commit-tree2685 commit obj2686 +----+2687 | |2688 | |2689 V V2690 +-----------+2691 | Object DB |2692 | Backing |2693 | Store |2694 +-----------+2695 ^2696 write-tree | |2697 tree obj | |2698 | | read-tree2699 | | tree obj2700 V2701 +-----------+2702 | Index |2703 | "cache" |2704 +-----------+2705 update-index ^2706 blob obj | |2707 | |2708 checkout-index -u | | checkout-index2709 stat | | blob obj2710 V2711 +-----------+2712 | Working |2713 | Directory |2714 +-----------+27152716------------271727182719Examining the data2720------------------27212722You can examine the data represented in the object database and the2723index with various helper tools. For every object, you can use2724gitlink:git-cat-file[1] to examine details about the2725object:27262727-------------------------------------------------2728$ git-cat-file -t <objectname>2729-------------------------------------------------27302731shows the type of the object, and once you have the type (which is2732usually implicit in where you find the object), you can use27332734-------------------------------------------------2735$ git-cat-file blob|tree|commit|tag <objectname>2736-------------------------------------------------27372738to show its contents. NOTE! Trees have binary content, and as a result2739there is a special helper for showing that content, called2740`git-ls-tree`, which turns the binary content into a more easily2741readable form.27422743It's especially instructive to look at "commit" objects, since those2744tend to be small and fairly self-explanatory. In particular, if you2745follow the convention of having the top commit name in `.git/HEAD`,2746you can do27472748-------------------------------------------------2749$ git-cat-file commit HEAD2750-------------------------------------------------27512752to see what the top commit was.27532754Merging multiple trees2755----------------------27562757Git helps you do a three-way merge, which you can expand to n-way by2758repeating the merge procedure arbitrary times until you finally2759"commit" the state. The normal situation is that you'd only do one2760three-way merge (two parents), and commit it, but if you like to, you2761can do multiple parents in one go.27622763To do a three-way merge, you need the two sets of "commit" objects2764that you want to merge, use those to find the closest common parent (a2765third "commit" object), and then use those commit objects to find the2766state of the directory ("tree" object) at these points.27672768To get the "base" for the merge, you first look up the common parent2769of two commits with27702771-------------------------------------------------2772$ git-merge-base <commit1> <commit2>2773-------------------------------------------------27742775which will return you the commit they are both based on. You should2776now look up the "tree" objects of those commits, which you can easily2777do with (for example)27782779-------------------------------------------------2780$ git-cat-file commit <commitname> | head -12781-------------------------------------------------27822783since the tree object information is always the first line in a commit2784object.27852786Once you know the three trees you are going to merge (the one "original"2787tree, aka the common case, and the two "result" trees, aka the branches2788you want to merge), you do a "merge" read into the index. This will2789complain if it has to throw away your old index contents, so you should2790make sure that you've committed those - in fact you would normally2791always do a merge against your last commit (which should thus match what2792you have in your current index anyway).27932794To do the merge, do27952796-------------------------------------------------2797$ git-read-tree -m -u <origtree> <yourtree> <targettree>2798-------------------------------------------------27992800which will do all trivial merge operations for you directly in the2801index file, and you can just write the result out with2802`git-write-tree`.280328042805Merging multiple trees, continued2806---------------------------------28072808Sadly, many merges aren't trivial. If there are files that have2809been added.moved or removed, or if both branches have modified the2810same file, you will be left with an index tree that contains "merge2811entries" in it. Such an index tree can 'NOT' be written out to a tree2812object, and you will have to resolve any such merge clashes using2813other tools before you can write out the result.28142815You can examine such index state with `git-ls-files --unmerged`2816command. An example:28172818------------------------------------------------2819$ git-read-tree -m $orig HEAD $target2820$ git-ls-files --unmerged2821100644 263414f423d0e4d70dae8fe53fa34614ff3e2860 1 hello.c2822100644 06fa6a24256dc7e560efa5687fa84b51f0263c3a 2 hello.c2823100644 cc44c73eb783565da5831b4d820c962954019b69 3 hello.c2824------------------------------------------------28252826Each line of the `git-ls-files --unmerged` output begins with2827the blob mode bits, blob SHA1, 'stage number', and the2828filename. The 'stage number' is git's way to say which tree it2829came from: stage 1 corresponds to `$orig` tree, stage 2 `HEAD`2830tree, and stage3 `$target` tree.28312832Earlier we said that trivial merges are done inside2833`git-read-tree -m`. For example, if the file did not change2834from `$orig` to `HEAD` nor `$target`, or if the file changed2835from `$orig` to `HEAD` and `$orig` to `$target` the same way,2836obviously the final outcome is what is in `HEAD`. What the2837above example shows is that file `hello.c` was changed from2838`$orig` to `HEAD` and `$orig` to `$target` in a different way.2839You could resolve this by running your favorite 3-way merge2840program, e.g. `diff3` or `merge`, on the blob objects from2841these three stages yourself, like this:28422843------------------------------------------------2844$ git-cat-file blob 263414f... >hello.c~12845$ git-cat-file blob 06fa6a2... >hello.c~22846$ git-cat-file blob cc44c73... >hello.c~32847$ merge hello.c~2 hello.c~1 hello.c~32848------------------------------------------------28492850This would leave the merge result in `hello.c~2` file, along2851with conflict markers if there are conflicts. After verifying2852the merge result makes sense, you can tell git what the final2853merge result for this file is by:28542855-------------------------------------------------2856$ mv -f hello.c~2 hello.c2857$ git-update-index hello.c2858-------------------------------------------------28592860When a path is in unmerged state, running `git-update-index` for2861that path tells git to mark the path resolved.28622863The above is the description of a git merge at the lowest level,2864to help you understand what conceptually happens under the hood.2865In practice, nobody, not even git itself, uses three `git-cat-file`2866for this. There is `git-merge-index` program that extracts the2867stages to temporary files and calls a "merge" script on it:28682869-------------------------------------------------2870$ git-merge-index git-merge-one-file hello.c2871-------------------------------------------------28722873and that is what higher level `git merge -s resolve` is implemented with.28742875How git stores objects efficiently: pack files2876----------------------------------------------28772878We've seen how git stores each object in a file named after the2879object's SHA1 hash.28802881Unfortunately this system becomes inefficient once a project has a2882lot of objects. Try this on an old project:28832884------------------------------------------------2885$ git count-objects28866930 objects, 47620 kilobytes2887------------------------------------------------28882889The first number is the number of objects which are kept in2890individual files. The second is the amount of space taken up by2891those "loose" objects.28922893You can save space and make git faster by moving these loose objects in2894to a "pack file", which stores a group of objects in an efficient2895compressed format; the details of how pack files are formatted can be2896found in link:technical/pack-format.txt[technical/pack-format.txt].28972898To put the loose objects into a pack, just run git repack:28992900------------------------------------------------2901$ git repack2902Generating pack...2903Done counting 6020 objects.2904Deltifying 6020 objects.2905 100% (6020/6020) done2906Writing 6020 objects.2907 100% (6020/6020) done2908Total 6020, written 6020 (delta 4070), reused 0 (delta 0)2909Pack pack-3e54ad29d5b2e05838c75df582c65257b8d08e1c created.2910------------------------------------------------29112912You can then run29132914------------------------------------------------2915$ git prune2916------------------------------------------------29172918to remove any of the "loose" objects that are now contained in the2919pack. This will also remove any unreferenced objects (which may be2920created when, for example, you use "git reset" to remove a commit).2921You can verify that the loose objects are gone by looking at the2922.git/objects directory or by running29232924------------------------------------------------2925$ git count-objects29260 objects, 0 kilobytes2927------------------------------------------------29282929Although the object files are gone, any commands that refer to those2930objects will work exactly as they did before.29312932The gitlink:git-gc[1] command performs packing, pruning, and more for2933you, so is normally the only high-level command you need.29342935[[dangling-objects]]2936Dangling objects2937----------------29382939The gitlink:git-fsck[1] command will sometimes complain about dangling2940objects. They are not a problem.29412942The most common cause of dangling objects is that you've rebased a2943branch, or you have pulled from somebody else who rebased a branch--see2944<<cleaning-up-history>>. In that case, the old head of the original2945branch still exists, as does obviously everything it pointed to. The2946branch pointer itself just doesn't, since you replaced it with another2947one.29482949There are also other situations too that cause dangling objects. For2950example, a "dangling blob" may arise because you did a "git add" of a2951file, but then, before you actually committed it and made it part of the2952bigger picture, you changed something else in that file and committed2953that *updated* thing - the old state that you added originally ends up2954not being pointed to by any commit or tree, so it's now a dangling blob2955object.29562957Similarly, when the "recursive" merge strategy runs, and finds that2958there are criss-cross merges and thus more than one merge base (which is2959fairly unusual, but it does happen), it will generate one temporary2960midway tree (or possibly even more, if you had lots of criss-crossing2961merges and more than two merge bases) as a temporary internal merge2962base, and again, those are real objects, but the end result will not end2963up pointing to them, so they end up "dangling" in your repository.29642965Generally, dangling objects aren't anything to worry about. They can2966even be very useful: if you screw something up, the dangling objects can2967be how you recover your old tree (say, you did a rebase, and realized2968that you really didn't want to - you can look at what dangling objects2969you have, and decide to reset your head to some old dangling state).29702971For commits, the most useful thing to do with dangling objects tends to2972be to do a simple29732974------------------------------------------------2975$ gitk <dangling-commit-sha-goes-here> --not --all2976------------------------------------------------29772978For blobs and trees, you can't do the same, but you can examine them.2979You can just do29802981------------------------------------------------2982$ git show <dangling-blob/tree-sha-goes-here>2983------------------------------------------------29842985to show what the contents of the blob were (or, for a tree, basically2986what the "ls" for that directory was), and that may give you some idea2987of what the operation was that left that dangling object.29882989Usually, dangling blobs and trees aren't very interesting. They're2990almost always the result of either being a half-way mergebase (the blob2991will often even have the conflict markers from a merge in it, if you2992have had conflicting merges that you fixed up by hand), or simply2993because you interrupted a "git fetch" with ^C or something like that,2994leaving _some_ of the new objects in the object database, but just2995dangling and useless.29962997Anyway, once you are sure that you're not interested in any dangling 2998state, you can just prune all unreachable objects:29993000------------------------------------------------3001$ git prune3002------------------------------------------------30033004and they'll be gone. But you should only run "git prune" on a quiescent3005repository - it's kind of like doing a filesystem fsck recovery: you3006don't want to do that while the filesystem is mounted.30073008(The same is true of "git-fsck" itself, btw - but since 3009git-fsck never actually *changes* the repository, it just reports 3010on what it found, git-fsck itself is never "dangerous" to run. 3011Running it while somebody is actually changing the repository can cause 3012confusing and scary messages, but it won't actually do anything bad. In 3013contrast, running "git prune" while somebody is actively changing the 3014repository is a *BAD* idea).30153016Glossary of git terms3017=====================30183019include::glossary.txt[]30203021Notes and todo list for this manual3022===================================30233024This is a work in progress.30253026The basic requirements:3027 - It must be readable in order, from beginning to end, by3028 someone intelligent with a basic grasp of the unix3029 commandline, but without any special knowledge of git. If3030 necessary, any other prerequisites should be specifically3031 mentioned as they arise.3032 - Whenever possible, section headings should clearly describe3033 the task they explain how to do, in language that requires3034 no more knowledge than necessary: for example, "importing3035 patches into a project" rather than "the git-am command"30363037Think about how to create a clear chapter dependency graph that will3038allow people to get to important topics without necessarily reading3039everything in between.30403041Say something about .gitignore.30423043Scan Documentation/ for other stuff left out; in particular:3044 howto's3045 some of technical/?3046 hooks3047 list of commands in gitlink:git[1]30483049Scan email archives for other stuff left out30503051Scan man pages to see if any assume more background than this manual3052provides.30533054Simplify beginning by suggesting disconnected head instead of3055temporary branch creation?30563057Add more good examples. Entire sections of just cookbook examples3058might be a good idea; maybe make an "advanced examples" section a3059standard end-of-chapter section?30603061Include cross-references to the glossary, where appropriate.30623063Document shallow clones? See draft 1.5.0 release notes for some3064documentation.30653066Add a section on working with other version control systems, including3067CVS, Subversion, and just imports of series of release tarballs.30683069More details on gitweb?30703071Write a chapter on using plumbing and writing scripts.