1Git User's Manual 2_________________ 3 4This manual is designed to be readable by someone with basic unix 5commandline skills, but no previous knowledge of git. 6 7Chapter 1 gives a brief overview of git commands, without any 8explanation; you can 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 137Searching 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 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 235Repositories and Branches 236========================= 237 238How to get a git repository 239--------------------------- 240 241It will be useful to have a git repository to experiment with as you 242read this manual. 243 244The best way to get one is by using the gitlink:git-clone[1] command 245to download a copy of an existing repository for a project that you 246are interested in. If you don't already have a project in mind, here 247are some interesting examples: 248 249------------------------------------------------ 250 # git itself (approx. 10MB download): 251$ git clone git://git.kernel.org/pub/scm/git/git.git 252 # the linux kernel (approx. 150MB download): 253$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 254------------------------------------------------ 255 256The initial clone may be time-consuming for a large project, but you 257will only need to clone once. 258 259The clone command creates a new directory named after the project 260("git" or "linux-2.6" in the examples above). After you cd into this 261directory, you will see that it contains a copy of the project files, 262together with a special top-level directory named ".git", which 263contains all the information about the history of the project. 264 265In most of the following, examples will be taken from one of the two 266repositories above. 267 268How to check out a different version of a project 269------------------------------------------------- 270 271Git is best thought of as a tool for storing the history of a 272collection of files. It stores the history as a compressed 273collection of interrelated snapshots (versions) of the project's 274contents. 275 276A single git repository may contain multiple branches. Each branch 277is a bookmark referencing a particular point in the project history. 278The gitlink:git-branch[1] command shows you the list of branches: 279 280------------------------------------------------ 281$ git branch 282* master 283------------------------------------------------ 284 285A freshly cloned repository contains a single branch, named "master", 286and the working directory contains the version of the project 287referred to by the master branch. 288 289Most projects also use tags. Tags, like branches, are references 290into the project's history, and can be listed using the 291gitlink:git-tag[1] command: 292 293------------------------------------------------ 294$ git tag -l 295v2.6.11 296v2.6.11-tree 297v2.6.12 298v2.6.12-rc2 299v2.6.12-rc3 300v2.6.12-rc4 301v2.6.12-rc5 302v2.6.12-rc6 303v2.6.13 304... 305------------------------------------------------ 306 307Tags are expected to always point at the same version of a project, 308while branches are expected to advance as development progresses. 309 310Create a new branch pointing to one of these versions and check it 311out using gitlink:git-checkout[1]: 312 313------------------------------------------------ 314$ git checkout -b new v2.6.13 315------------------------------------------------ 316 317The working directory then reflects the contents that the project had 318when it was tagged v2.6.13, and gitlink:git-branch[1] shows two 319branches, with an asterisk marking the currently checked-out branch: 320 321------------------------------------------------ 322$ git branch 323 master 324* new 325------------------------------------------------ 326 327If you decide that you'd rather see version 2.6.17, you can modify 328the current branch to point at v2.6.17 instead, with 329 330------------------------------------------------ 331$ git reset --hard v2.6.17 332------------------------------------------------ 333 334Note that if the current branch was your only reference to a 335particular point in history, then resetting that branch may leave you 336with no way to find the history it used to point to; so use this 337command carefully. 338 339Understanding History: Commits 340------------------------------ 341 342Every change in the history of a project is represented by a commit. 343The gitlink:git-show[1] command shows the most recent commit on the 344current branch: 345 346------------------------------------------------ 347$ git show 348commit 2b5f6dcce5bf94b9b119e9ed8d537098ec61c3d2 349Author: Jamal Hadi Salim <hadi@cyberus.ca> 350Date: Sat Dec 2 22:22:25 2006 -0800 351 352 [XFRM]: Fix aevent structuring to be more complete. 353 354 aevents can not uniquely identify an SA. We break the ABI with this 355 patch, but consensus is that since it is not yet utilized by any 356 (known) application then it is fine (better do it now than later). 357 358 Signed-off-by: Jamal Hadi Salim <hadi@cyberus.ca> 359 Signed-off-by: David S. Miller <davem@davemloft.net> 360 361diff --git a/Documentation/networking/xfrm_sync.txt b/Documentation/networking/xfrm_sync.txt 362index 8be626f..d7aac9d 100644 363--- a/Documentation/networking/xfrm_sync.txt 364+++ b/Documentation/networking/xfrm_sync.txt 365@@ -47,10 +47,13 @@ aevent_id structure looks like: 366 367 struct xfrm_aevent_id { 368 struct xfrm_usersa_id sa_id; 369+ xfrm_address_t saddr; 370 __u32 flags; 371+ __u32 reqid; 372 }; 373... 374------------------------------------------------ 375 376As you can see, a commit shows who made the latest change, what they 377did, and why. 378 379Every commit has a 40-hexdigit id, sometimes called the "SHA1 id", shown 380on the first line of the "git show" output. You can usually refer to 381a commit by a shorter name, such as a tag or a branch name, but this 382longer id can also be useful. In particular, it is a globally unique 383name for this commit: so if you tell somebody else the SHA1 id (for 384example in email), then you are guaranteed they will see the same 385commit in their repository that you do in yours. 386 387Understanding history: commits, parents, and reachability 388~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 389 390Every commit (except the very first commit in a project) also has a 391parent commit which shows what happened before this commit. 392Following the chain of parents will eventually take you back to the 393beginning of the project. 394 395However, the commits do not form a simple list; git allows lines of 396development to diverge and then reconverge, and the point where two 397lines of development reconverge is called a "merge". The commit 398representing a merge can therefore have more than one parent, with 399each parent representing the most recent commit on one of the lines 400of development leading to that point. 401 402The best way to see how this works is using the gitlink:gitk[1] 403command; running gitk now on a git repository and looking for merge 404commits will help understand how the git organizes history. 405 406In the following, we say that commit X is "reachable" from commit Y 407if commit X is an ancestor of commit Y. Equivalently, you could say 408that Y is a descendent of X, or that there is a chain of parents 409leading from commit Y to commit X. 410 411Undestanding history: History diagrams 412~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 414We will sometimes represent git history using diagrams like the one 415below. Commits are shown as "o", and the links between them with 416lines drawn with - / and \. Time goes left to right: 417 418 o--o--o <-- Branch A 419 / 420 o--o--o <-- master 421 \ 422 o--o--o <-- Branch B 423 424If we need to talk about a particular commit, the character "o" may 425be replaced with another letter or number. 426 427Understanding history: What is a branch? 428~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 429 430Though we've been using the word "branch" to mean a kind of reference 431to a particular commit, the word branch is also commonly used to 432refer to the line of commits leading up to that point. In the 433example above, git may think of the branch named "A" as just a 434pointer to one particular commit, but we may refer informally to the 435line of three commits leading up to that point as all being part of 436"branch A". 437 438If we need to make it clear that we're just talking about the most 439recent commit on the branch, we may refer to that commit as the 440"head" of the branch. 441 442Manipulating branches 443--------------------- 444 445Creating, deleting, and modifying branches is quick and easy; here's 446a summary of the commands: 447 448git branch:: 449 list all branches 450git branch <branch>:: 451 create a new branch named <branch>, referencing the same 452 point in history as the current branch 453git branch <branch> <start-point>:: 454 create a new branch named <branch>, referencing 455 <start-point>, which may be specified any way you like, 456 including using a branch name or a tag name 457git branch -d <branch>:: 458 delete the branch <branch>; if the branch you are deleting 459 points to a commit which is not reachable from this branch, 460 this command will fail with a warning. 461git branch -D <branch>:: 462 even if the branch points to a commit not reachable 463 from the current branch, you may know that that commit 464 is still reachable from some other branch or tag. In that 465 case it is safe to use this command to force git to delete 466 the branch. 467git checkout <branch>:: 468 make the current branch <branch>, updating the working 469 directory to reflect the version referenced by <branch> 470git checkout -b <new> <start-point>:: 471 create a new branch <new> referencing <start-point>, and 472 check it out. 473 474It is also useful to know that the special symbol "HEAD" can always 475be used to refer to the current branch. 476 477Examining branches from a remote repository 478------------------------------------------- 479 480The "master" branch that was created at the time you cloned is a copy 481of the HEAD in the repository that you cloned from. That repository 482may also have had other branches, though, and your local repository 483keeps branches which track each of those remote branches, which you 484can view using the "-r" option to gitlink:git-branch[1]: 485 486------------------------------------------------ 487$ git branch -r 488 origin/HEAD 489 origin/html 490 origin/maint 491 origin/man 492 origin/master 493 origin/next 494 origin/pu 495 origin/todo 496------------------------------------------------ 497 498You cannot check out these remote-tracking branches, but you can 499examine them on a branch of your own, just as you would a tag: 500 501------------------------------------------------ 502$ git checkout -b my-todo-copy origin/todo 503------------------------------------------------ 504 505Note that the name "origin" is just the name that git uses by default 506to refer to the repository that you cloned from. 507 508[[how-git-stores-references]] 509Naming branches, tags, and other references 510------------------------------------------- 511 512Branches, remote-tracking branches, and tags are all references to 513commits. All references are named with a slash-separated path name 514starting with "refs"; the names we've been using so far are actually 515shorthand: 516 517 - The branch "test" is short for "refs/heads/test". 518 - The tag "v2.6.18" is short for "refs/tags/v2.6.18". 519 - "origin/master" is short for "refs/remotes/origin/master". 520 521The full name is occasionally useful if, for example, there ever 522exists a tag and a branch with the same name. 523 524As another useful shortcut, if the repository "origin" posesses only 525a single branch, you can refer to that branch as just "origin". 526 527More generally, if you have defined a remote repository named 528"example", you can refer to the branch in that repository as 529"example". And for a repository with multiple branches, this will 530refer to the branch designated as the "HEAD" branch. 531 532For the complete list of paths which git checks for references, and 533the order it uses to decide which to choose when there are multiple 534references with the same shorthand name, see the "SPECIFYING 535REVISIONS" section of gitlink:git-rev-parse[1]. 536 537[[Updating-a-repository-with-git-fetch]] 538Updating a repository with git fetch 539------------------------------------ 540 541Eventually the developer cloned from will do additional work in her 542repository, creating new commits and advancing the branches to point 543at the new commits. 544 545The command "git fetch", with no arguments, will update all of the 546remote-tracking branches to the latest version found in her 547repository. It will not touch any of your own branches--not even the 548"master" branch that was created for you on clone. 549 550Fetching branches from other repositories 551----------------------------------------- 552 553You can also track branches from repositories other than the one you 554cloned from, using gitlink:git-remote[1]: 555 556------------------------------------------------- 557$ git remote add linux-nfs git://linux-nfs.org/pub/nfs-2.6.git 558$ git fetch 559* refs/remotes/linux-nfs/master: storing branch 'master' ... 560 commit: bf81b46 561------------------------------------------------- 562 563New remote-tracking branches will be stored under the shorthand name 564that you gave "git remote add", in this case linux-nfs: 565 566------------------------------------------------- 567$ git branch -r 568linux-nfs/master 569origin/master 570------------------------------------------------- 571 572If you run "git fetch <remote>" later, the tracking branches for the 573named <remote> will be updated. 574 575If you examine the file .git/config, you will see that git has added 576a new stanza: 577 578------------------------------------------------- 579$ cat .git/config 580... 581[remote "linux-nfs"] 582 url = git://linux-nfs.org/~bfields/git.git 583 fetch = +refs/heads/*:refs/remotes/linux-nfs-read/* 584... 585------------------------------------------------- 586 587This is what causes git to track the remote's branches; you may 588modify or delete these configuration options by editing .git/config 589with a text editor. 590 591Fetching individual branches 592---------------------------- 593 594TODO: find another home for this, later on: 595 596You can also choose to update just one branch at a time: 597 598------------------------------------------------- 599$ git fetch origin todo:refs/remotes/origin/todo 600------------------------------------------------- 601 602The first argument, "origin", just tells git to fetch from the 603repository you originally cloned from. The second argument tells git 604to fetch the branch named "todo" from the remote repository, and to 605store it locally under the name refs/remotes/origin/todo; as we saw 606above, remote-tracking branches are stored under 607refs/remotes/<name-of-repository>/<name-of-branch>. 608 609You can also fetch branches from other repositories; so 610 611------------------------------------------------- 612$ git fetch git://example.com/proj.git master:refs/remotes/example/master 613------------------------------------------------- 614 615will create a new reference named "refs/remotes/example/master" and 616store in it the branch named "master" from the repository at the 617given URL. If you already have a branch named 618"refs/remotes/example/master", it will attempt to "fast-forward" to 619the commit given by example.com's master branch. So next we explain 620what a fast-forward is: 621 622[[fast-forwards]] 623Understanding git history: fast-forwards 624---------------------------------------- 625 626In the previous example, when updating an existing branch, "git 627fetch" checks to make sure that the most recent commit on the remote 628branch is a descendant of the most recent commit on your copy of the 629branch before updating your copy of the branch to point at the new 630commit. Git calls this process a "fast forward". 631 632A fast forward looks something like this: 633 634 o--o--o--o <-- old head of the branch 635 \ 636 o--o--o <-- new head of the branch 637 638 639In some cases it is possible that the new head will *not* actually be 640a descendant of the old head. For example, the developer may have 641realized she made a serious mistake, and decided to backtrack, 642resulting in a situation like: 643 644 o--o--o--o--a--b <-- old head of the branch 645 \ 646 o--o--o <-- new head of the branch 647 648 649 650In this case, "git fetch" will fail, and print out a warning. 651 652In that case, you can still force git to update to the new head, as 653described in the following section. However, note that in the 654situation above this may mean losing the commits labeled "a" and "b", 655unless you've already created a reference of your own pointing to 656them. 657 658Forcing git fetch to do non-fast-forward updates 659------------------------------------------------ 660 661If git fetch fails because the new head of a branch is not a 662descendant of the old head, you may force the update with: 663 664------------------------------------------------- 665$ git fetch git://example.com/proj.git +master:refs/remotes/example/master 666------------------------------------------------- 667 668Note the addition of the "+" sign. Be aware that commits which the 669old version of example/master pointed at may be lost, as we saw in 670the previous section. 671 672Configuring remote branches 673--------------------------- 674 675We saw above that "origin" is just a shortcut to refer to the 676repository which you originally cloned from. This information is 677stored in git configuration variables, which you can see using 678gitlink:git-repo-config[1]: 679 680------------------------------------------------- 681$ git-repo-config -l 682core.repositoryformatversion=0 683core.filemode=true 684core.logallrefupdates=true 685remote.origin.url=git://git.kernel.org/pub/scm/git/git.git 686remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* 687branch.master.remote=origin 688branch.master.merge=refs/heads/master 689------------------------------------------------- 690 691If there are other repositories that you also use frequently, you can 692create similar configuration options to save typing; for example, 693after 694 695------------------------------------------------- 696$ git repo-config remote.example.url git://example.com/proj.git 697------------------------------------------------- 698 699then the following two commands will do the same thing: 700 701------------------------------------------------- 702$ git fetch git://example.com/proj.git master:refs/remotes/example/master 703$ git fetch example master:refs/remotes/example/master 704------------------------------------------------- 705 706Even better, if you add one more option: 707 708------------------------------------------------- 709$ git repo-config remote.example.fetch master:refs/remotes/example/master 710------------------------------------------------- 711 712then the following commands will all do the same thing: 713 714------------------------------------------------- 715$ git fetch git://example.com/proj.git master:ref/remotes/example/master 716$ git fetch example master:ref/remotes/example/master 717$ git fetch example example/master 718$ git fetch example 719------------------------------------------------- 720 721You can also add a "+" to force the update each time: 722 723------------------------------------------------- 724$ git repo-config remote.example.fetch +master:ref/remotes/example/master 725------------------------------------------------- 726 727Don't do this unless you're sure you won't mind "git fetch" possibly 728throwing away commits on mybranch. 729 730Also note that all of the above configuration can be performed by 731directly editing the file .git/config instead of using 732gitlink:git-repo-config[1]. 733 734See gitlink:git-repo-config[1] for more details on the configuration 735options mentioned above. 736 737Exploring git history 738===================== 739 740Git is best thought of as a tool for storing the history of a 741collection of files. It does this by storing compressed snapshots of 742the contents of a file heirarchy, together with "commits" which show 743the relationships between these snapshots. 744 745Git provides extremely flexible and fast tools for exploring the 746history of a project. 747 748We start with one specialized tool which is useful for finding the 749commit that introduced a bug into a project. 750 751How to use bisect to find a regression 752-------------------------------------- 753 754Suppose version 2.6.18 of your project worked, but the version at 755"master" crashes. Sometimes the best way to find the cause of such a 756regression is to perform a brute-force search through the project's 757history to find the particular commit that caused the problem. The 758gitlink:git-bisect[1] command can help you do this: 759 760------------------------------------------------- 761$ git bisect start 762$ git bisect good v2.6.18 763$ git bisect bad master 764Bisecting: 3537 revisions left to test after this 765[65934a9a028b88e83e2b0f8b36618fe503349f8e] BLOCK: Make USB storage depend on SCSI rather than selecting it [try #6] 766------------------------------------------------- 767 768If you run "git branch" at this point, you'll see that git has 769temporarily moved you to a new branch named "bisect". This branch 770points to a commit (with commit id 65934...) that is reachable from 771v2.6.19 but not from v2.6.18. Compile and test it, and see whether 772it crashes. Assume it does crash. Then: 773 774------------------------------------------------- 775$ git bisect bad 776Bisecting: 1769 revisions left to test after this 777[7eff82c8b1511017ae605f0c99ac275a7e21b867] i2c-core: Drop useless bitmaskings 778------------------------------------------------- 779 780checks out an older version. Continue like this, telling git at each 781stage whether the version it gives you is good or bad, and notice 782that the number of revisions left to test is cut approximately in 783half each time. 784 785After about 13 tests (in this case), it will output the commit id of 786the guilty commit. You can then examine the commit with 787gitlink:git-show[1], find out who wrote it, and mail them your bug 788report with the commit id. Finally, run 789 790------------------------------------------------- 791$ git bisect reset 792------------------------------------------------- 793 794to return you to the branch you were on before and delete the 795temporary "bisect" branch. 796 797Note that the version which git-bisect checks out for you at each 798point is just a suggestion, and you're free to try a different 799version if you think it would be a good idea. For example, 800occasionally you may land on a commit that broke something unrelated; 801run 802 803------------------------------------------------- 804$ git bisect-visualize 805------------------------------------------------- 806 807which will run gitk and label the commit it chose with a marker that 808says "bisect". Chose a safe-looking commit nearby, note its commit 809id, and check it out with: 810 811------------------------------------------------- 812$ git reset --hard fb47ddb2db... 813------------------------------------------------- 814 815then test, run "bisect good" or "bisect bad" as appropriate, and 816continue. 817 818Naming commits 819-------------- 820 821We have seen several ways of naming commits already: 822 823 - 40-hexdigit SHA1 id 824 - branch name: refers to the commit at the head of the given 825 branch 826 - tag name: refers to the commit pointed to by the given tag 827 (we've seen branches and tags are special cases of 828 <<how-git-stores-references,references>>). 829 - HEAD: refers to the head of the current branch 830 831There are many more; see the "SPECIFYING REVISIONS" section of the 832gitlink:git-rev-parse[1] man page for the complete list of ways to 833name revisions. Some examples: 834 835------------------------------------------------- 836$ git show fb47ddb2 # the first few characters of the SHA1 id 837 # are usually enough to specify it uniquely 838$ git show HEAD^ # the parent of the HEAD commit 839$ git show HEAD^^ # the grandparent 840$ git show HEAD~4 # the great-great-grandparent 841------------------------------------------------- 842 843Recall that merge commits may have more than one parent; by default, 844^ and ~ follow the first parent listed in the commit, but you can 845also choose: 846 847------------------------------------------------- 848$ git show HEAD^1 # show the first parent of HEAD 849$ git show HEAD^2 # show the second parent of HEAD 850------------------------------------------------- 851 852In addition to HEAD, there are several other special names for 853commits: 854 855Merges (to be discussed later), as well as operations such as 856git-reset, which change the currently checked-out commit, generally 857set ORIG_HEAD to the value HEAD had before the current operation. 858 859The git-fetch operation always stores the head of the last fetched 860branch in FETCH_HEAD. For example, if you run git fetch without 861specifying a local branch as the target of the operation 862 863------------------------------------------------- 864$ git fetch git://example.com/proj.git theirbranch 865------------------------------------------------- 866 867the fetched commits will still be available from FETCH_HEAD. 868 869When we discuss merges we'll also see the special name MERGE_HEAD, 870which refers to the other branch that we're merging in to the current 871branch. 872 873The gitlink:git-rev-parse[1] command is a low-level command that is 874occasionally useful for translating some name for a commit to the SHA1 id for 875that commit: 876 877------------------------------------------------- 878$ git rev-parse origin 879e05db0fd4f31dde7005f075a84f96b360d05984b 880------------------------------------------------- 881 882Creating tags 883------------- 884 885We can also create a tag to refer to a particular commit; after 886running 887 888------------------------------------------------- 889$ git-tag stable-1 1b2e1d63ff 890------------------------------------------------- 891 892You can use stable-1 to refer to the commit 1b2e1d63ff. 893 894This creates a "lightweight" tag. If the tag is a tag you wish to 895share with others, and possibly sign cryptographically, then you 896should create a tag object instead; see the gitlink:git-tag[1] man 897page for details. 898 899Browsing revisions 900------------------ 901 902The gitlink:git-log[1] command can show lists of commits. On its 903own, it shows all commits reachable from the parent commit; but you 904can also make more specific requests: 905 906------------------------------------------------- 907$ git log v2.5.. # commits since (not reachable from) v2.5 908$ git log test..master # commits reachable from master but not test 909$ git log master..test # ...reachable from test but not master 910$ git log master...test # ...reachable from either test or master, 911 # but not both 912$ git log --since="2 weeks ago" # commits from the last 2 weeks 913$ git log Makefile # commits which modify Makefile 914$ git log fs/ # ... which modify any file under fs/ 915$ git log -S'foo()' # commits which add or remove any file data 916 # matching the string 'foo()' 917------------------------------------------------- 918 919And of course you can combine all of these; the following finds 920commits since v2.5 which touch the Makefile or any file under fs: 921 922------------------------------------------------- 923$ git log v2.5.. Makefile fs/ 924------------------------------------------------- 925 926You can also ask git log to show patches: 927 928------------------------------------------------- 929$ git log -p 930------------------------------------------------- 931 932See the "--pretty" option in the gitlink:git-log[1] man page for more 933display options. 934 935Note that git log starts with the most recent commit and works 936backwards through the parents; however, since git history can contain 937multiple independant lines of development, the particular order that 938commits are listed in may be somewhat arbitrary. 939 940Generating diffs 941---------------- 942 943You can generate diffs between any two versions using 944gitlink:git-diff[1]: 945 946------------------------------------------------- 947$ git diff master..test 948------------------------------------------------- 949 950Sometimes what you want instead is a set of patches: 951 952------------------------------------------------- 953$ git format-patch master..test 954------------------------------------------------- 955 956will generate a file with a patch for each commit reachable from test 957but not from master. Note that if master also has commits which are 958not reachable from test, then the combined result of these patches 959will not be the same as the diff produced by the git-diff example. 960 961Viewing old file versions 962------------------------- 963 964You can always view an old version of a file by just checking out the 965correct revision first. But sometimes it is more convenient to be 966able to view an old version of a single file without checking 967anything out; this command does that: 968 969------------------------------------------------- 970$ git show v2.5:fs/locks.c 971------------------------------------------------- 972 973Before the colon may be anything that names a commit, and after it 974may be any path to a file tracked by git. 975 976Examples 977-------- 978 979Check whether two branches point at the same history 980~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 981 982Suppose you want to check whether two branches point at the same point 983in history. 984 985------------------------------------------------- 986$ git diff origin..master 987------------------------------------------------- 988 989will tell you whether the contents of the project are the same at the 990two branches; in theory, however, it's possible that the same project 991contents could have been arrived at by two different historical 992routes. You could compare the SHA1 id's: 993 994------------------------------------------------- 995$ git rev-list origin 996e05db0fd4f31dde7005f075a84f96b360d05984b 997$ git rev-list master 998e05db0fd4f31dde7005f075a84f96b360d05984b 999-------------------------------------------------10001001Or you could recall that the ... operator selects all commits1002contained reachable from either one reference or the other but not1003both: so10041005-------------------------------------------------1006$ git log origin...master1007-------------------------------------------------10081009will return no commits when the two branches are equal.10101011Check which tagged version a given fix was first included in1012~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~10131014Suppose you know that the commit e05db0fd fixed a certain problem.1015You'd like to find the earliest tagged release that contains that1016fix.10171018Of course, there may be more than one answer--if the history branched1019after commit e05db0fd, then there could be multiple "earliest" tagged1020releases.10211022You could just visually inspect the commits since e05db0fd:10231024-------------------------------------------------1025$ gitk e05db0fd..1026-------------------------------------------------10271028...10291030Developing with git1031===================10321033Telling git your name1034---------------------10351036Before creating any commits, you should introduce yourself to git. The1037easiest way to do so is:10381039------------------------------------------------1040$ cat >~/.gitconfig <<\EOF1041[user]1042 name = Your Name Comes Here1043 email = you@yourdomain.example.com1044EOF1045------------------------------------------------104610471048Creating a new repository1049-------------------------10501051Creating a new repository from scratch is very easy:10521053-------------------------------------------------1054$ mkdir project1055$ cd project1056$ git init1057-------------------------------------------------10581059If you have some initial content (say, a tarball):10601061-------------------------------------------------1062$ tar -xzvf project.tar.gz1063$ cd project1064$ git init1065$ git add . # include everything below ./ in the first commit:1066$ git commit1067-------------------------------------------------10681069[[how-to-make-a-commit]]1070how to make a commit1071--------------------10721073Creating a new commit takes three steps:10741075 1. Making some changes to the working directory using your1076 favorite editor.1077 2. Telling git about your changes.1078 3. Creating the commit using the content you told git about1079 in step 2.10801081In practice, you can interleave and repeat steps 1 and 2 as many1082times as you want: in order to keep track of what you want committed1083at step 3, git maintains a snapshot of the tree's contents in a1084special staging area called "the index."10851086At the beginning, the content of the index will be identical to1087that of the HEAD. The command "git diff --cached", which shows1088the difference between the HEAD and the index, should therefore1089produce no output at that point.10901091Modifying the index is easy:10921093To update the index with the new contents of a modified file, use10941095-------------------------------------------------1096$ git add path/to/file1097-------------------------------------------------10981099To add the contents of a new file to the index, use11001101-------------------------------------------------1102$ git add path/to/file1103-------------------------------------------------11041105To remove a file from the index and from the working tree,11061107-------------------------------------------------1108$ git rm path/to/file1109-------------------------------------------------11101111After each step you can verify that11121113-------------------------------------------------1114$ git diff --cached1115-------------------------------------------------11161117always shows the difference between the HEAD and the index file--this1118is what you'd commit if you created the commit now--and that11191120-------------------------------------------------1121$ git diff1122-------------------------------------------------11231124shows the difference between the working tree and the index file.11251126Note that "git add" always adds just the current contents of a file1127to the index; further changes to the same file will be ignored unless1128you run git-add on the file again.11291130When you're ready, just run11311132-------------------------------------------------1133$ git commit1134-------------------------------------------------11351136and git will prompt you for a commit message and then create the new1137commmit. Check to make sure it looks like what you expected with11381139-------------------------------------------------1140$ git show1141-------------------------------------------------11421143As a special shortcut,11441145-------------------------------------------------1146$ git commit -a1147-------------------------------------------------11481149will update the index with any files that you've modified or removed1150and create a commit, all in one step.11511152A number of commands are useful for keeping track of what you're1153about to commit:11541155-------------------------------------------------1156$ git diff --cached # difference between HEAD and the index; what1157 # would be commited if you ran "commit" now.1158$ git diff # difference between the index file and your1159 # working directory; changes that would not1160 # be included if you ran "commit" now.1161$ git status # a brief per-file summary of the above.1162-------------------------------------------------11631164creating good commit messages1165-----------------------------11661167Though not required, it's a good idea to begin the commit message1168with a single short (less than 50 character) line summarizing the1169change, followed by a blank line and then a more thorough1170description. Tools that turn commits into email, for example, use1171the first line on the Subject line and the rest of the commit in the1172body.11731174how to merge1175------------11761177You can rejoin two diverging branches of development using1178gitlink:git-merge[1]:11791180-------------------------------------------------1181$ git merge branchname1182-------------------------------------------------11831184merges the development in the branch "branchname" into the current1185branch. If there are conflicts--for example, if the same file is1186modified in two different ways in the remote branch and the local1187branch--then you are warned; the output may look something like this:11881189-------------------------------------------------1190$ git pull . next1191Trying really trivial in-index merge...1192fatal: Merge requires file-level merging1193Nope.1194Merging HEAD with 77976da35a11db4580b80ae27e8d65caf52080861195Merging:119615e2162 world119777976da goodbye1198found 1 common ancestor(s):1199d122ed4 initial1200Auto-merging file.txt1201CONFLICT (content): Merge conflict in file.txt1202Automatic merge failed; fix conflicts and then commit the result.1203-------------------------------------------------12041205Conflict markers are left in the problematic files, and after1206you resolve the conflicts manually, you can update the index1207with the contents and run git commit, as you normally would when1208creating a new file.12091210If you examine the resulting commit using gitk, you will see that it1211has two parents, one pointing to the top of the current branch, and1212one to the top of the other branch.12131214In more detail:12151216[[resolving-a-merge]]1217Resolving a merge1218-----------------12191220When a merge isn't resolved automatically, git leaves the index and1221the working tree in a special state that gives you all the1222information you need to help resolve the merge.12231224Files with conflicts are marked specially in the index, so until you1225resolve the problem and update the index, git commit will fail:12261227-------------------------------------------------1228$ git commit1229file.txt: needs merge1230-------------------------------------------------12311232Also, git status will list those files as "unmerged".12331234All of the changes that git was able to merge automatically are1235already added to the index file, so gitlink:git-diff[1] shows only1236the conflicts. Also, it uses a somewhat unusual syntax:12371238-------------------------------------------------1239$ git diff1240diff --cc file.txt1241index 802992c,2b60207..00000001242--- a/file.txt1243+++ b/file.txt1244@@@ -1,1 -1,1 +1,5 @@@1245++<<<<<<< HEAD:file.txt1246 +Hello world1247++=======1248+ Goodbye1249++>>>>>>> 77976da35a11db4580b80ae27e8d65caf5208086:file.txt1250-------------------------------------------------12511252Recall that the commit which will be commited after we resolve this1253conflict will have two parents instead of the usual one: one parent1254will be HEAD, the tip of the current branch; the other will be the1255tip of the other branch, which is stored temporarily in MERGE_HEAD.12561257The diff above shows the differences between the working-tree version1258of file.txt and two previous version: one version from HEAD, and one1259from MERGE_HEAD. So instead of preceding each line by a single "+"1260or "-", it now uses two columns: the first column is used for1261differences between the first parent and the working directory copy,1262and the second for differences between the second parent and the1263working directory copy. Thus after resolving the conflict in the1264obvious way, the diff will look like:12651266-------------------------------------------------1267$ git diff1268diff --cc file.txt1269index 802992c,2b60207..00000001270--- a/file.txt1271+++ b/file.txt1272@@@ -1,1 -1,1 +1,1 @@@1273- Hello world1274 -Goodbye1275++Goodbye world1276-------------------------------------------------12771278This shows that our resolved version deleted "Hello world" from the1279first parent, deleted "Goodbye" from the second parent, and added1280"Goodbye world", which was previously absent from both.12811282The gitlink:git-log[1] command also provides special help for merges:12831284-------------------------------------------------1285$ git log --merge1286-------------------------------------------------12871288This will list all commits which exist only on HEAD or on MERGE_HEAD,1289and which touch an unmerged file.12901291We can now add the resolved version to the index and commit:12921293-------------------------------------------------1294$ git add file.txt1295$ git commit1296-------------------------------------------------12971298Note that the commit message will already be filled in for you with1299some information about the merge. Normally you can just use this1300default message unchanged, but you may add additional commentary of1301your own if desired.13021303[[undoing-a-merge]]1304undoing a merge1305---------------13061307If you get stuck and decide to just give up and throw the whole mess1308away, you can always return to the pre-merge state with13091310-------------------------------------------------1311$ git reset --hard HEAD1312-------------------------------------------------13131314Or, if you've already commited the merge that you want to throw away,13151316-------------------------------------------------1317$ git reset --hard HEAD^1318-------------------------------------------------13191320However, this last command can be dangerous in some cases--never1321throw away a commit you have already committed if that commit may1322itself have been merged into another branch, as doing so may confuse1323further merges.13241325Fast-forward merges1326-------------------13271328There is one special case not mentioned above, which is treated1329differently. Normally, a merge results in a merge commit, with two1330parents, one pointing at each of the two lines of development that1331were merged.13321333However, if one of the two lines of development is completely1334contained within the other--so every commit present in the one is1335already contained in the other--then git just performs a1336<<fast-forwards,fast forward>>; the head of the current branch is1337moved forward to point at the head of the merged-in branch, without1338any new commits being created.13391340Fixing mistakes1341---------------13421343If you've messed up the working tree, but haven't yet committed your1344mistake, you can return the entire working tree to the last committed1345state with13461347-------------------------------------------------1348$ git reset --hard HEAD1349-------------------------------------------------13501351If you make a commit that you later wish you hadn't, there are two1352fundamentally different ways to fix the problem:13531354 1. You can create a new commit that undoes whatever was done1355 by the previous commit. This is the correct thing if your1356 mistake has already been made public.13571358 2. You can go back and modify the old commit. You should1359 never do this if you have already made the history public;1360 git does not normally expect the "history" of a project to1361 change, and cannot correctly perform repeated merges from1362 a branch that has had its history changed.13631364Fixing a mistake with a new commit1365~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~13661367Creating a new commit that reverts an earlier change is very easy;1368just pass the gitlink:git-revert[1] command a reference to the bad1369commit; for example, to revert the most recent commit:13701371-------------------------------------------------1372$ git revert HEAD1373-------------------------------------------------13741375This will create a new commit which undoes the change in HEAD. You1376will be given a chance to edit the commit message for the new commit.13771378You can also revert an earlier change, for example, the next-to-last:13791380-------------------------------------------------1381$ git revert HEAD^1382-------------------------------------------------13831384In this case git will attempt to undo the old change while leaving1385intact any changes made since then. If more recent changes overlap1386with the changes to be reverted, then you will be asked to fix1387conflicts manually, just as in the case of <<resolving-a-merge,1388resolving a merge>>.13891390Fixing a mistake by editing history1391~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~13921393If the problematic commit is the most recent commit, and you have not1394yet made that commit public, then you may just1395<<undoing-a-merge,destroy it using git-reset>>.13961397Alternatively, you1398can edit the working directory and update the index to fix your1399mistake, just as if you were going to <<how-to-make-a-commit,create a1400new commit>>, then run14011402-------------------------------------------------1403$ git commit --amend1404-------------------------------------------------14051406which will replace the old commit by a new commit incorporating your1407changes, giving you a chance to edit the old commit message first.14081409Again, you should never do this to a commit that may already have1410been merged into another branch; use gitlink:git-revert[1] instead in1411that case.14121413It is also possible to edit commits further back in the history, but1414this is an advanced topic to be left for1415<<cleaning-up-history,another chapter>>.14161417Checking out an old version of a file1418~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~14191420In the process of undoing a previous bad change, you may find it1421useful to check out an older version of a particular file using1422gitlink:git-checkout[1]. We've used git checkout before to switch1423branches, but it has quite different behavior if it is given a path1424name: the command14251426-------------------------------------------------1427$ git checkout HEAD^ path/to/file1428-------------------------------------------------14291430replaces path/to/file by the contents it had in the commit HEAD^, and1431also updates the index to match. It does not change branches.14321433If you just want to look at an old version of the file, without1434modifying the working directory, you can do that with1435gitlink:git-show[1]:14361437-------------------------------------------------1438$ git show HEAD^ path/to/file1439-------------------------------------------------14401441which will display the given version of the file.14421443Ensuring good performance1444-------------------------14451446On large repositories, git depends on compression to keep the history1447information from taking up to much space on disk or in memory.14481449This compression is not performed automatically. Therefore you1450should occasionally run14511452-------------------------------------------------1453$ git gc1454-------------------------------------------------14551456to recompress the archive and to prune any commits which are no1457longer referred to anywhere. This can be very time-consuming, and1458you should not modify the repository while it is working, so you1459should run it while you are not working.14601461Sharing development with others1462===============================14631464[[getting-updates-with-git-pull]]1465Getting updates with git pull1466-----------------------------14671468After you clone a repository and make a few changes of your own, you1469may wish to check the original repository for updates and merge them1470into your own work.14711472We have already seen <<Updating-a-repository-with-git-fetch,how to1473keep remote tracking branches up to date>> with gitlink:git-fetch[1],1474and how to merge two branches. So you can merge in changes from the1475original repository's master branch with:14761477-------------------------------------------------1478$ git fetch1479$ git merge origin/master1480-------------------------------------------------14811482However, the gitlink:git-pull[1] command provides a way to do this in1483one step:14841485-------------------------------------------------1486$ git pull origin master1487-------------------------------------------------14881489In fact, "origin" is normally the default repository to pull from,1490and the default branch is normally the HEAD of the remote repository,1491so often you can accomplish the above with just14921493-------------------------------------------------1494$ git pull1495-------------------------------------------------14961497See the descriptions of the branch.<name>.remote and1498branch.<name>.merge options in gitlink:git-repo-config[1] to learn1499how to control these defaults depending on the current branch.15001501In addition to saving you keystrokes, "git pull" also helps you by1502producing a default commit message documenting the branch and1503repository that you pulled from.15041505(But note that no such commit will be created in the case of a1506<<fast-forwards,fast forward>>; instead, your branch will just be1507updated to point to the latest commit from the upstream branch).15081509The git-pull command can also be given "." as the "remote" repository, in1510which case it just merges in a branch from the current repository; so1511the commands15121513-------------------------------------------------1514$ git pull . branch1515$ git merge branch1516-------------------------------------------------15171518are roughly equivalent. The former is actually very commonly used.15191520Submitting patches to a project1521-------------------------------15221523If you just have a few changes, the simplest way to submit them may1524just be to send them as patches in email:15251526First, use gitlink:git-format-patches[1]; for example:15271528-------------------------------------------------1529$ git format-patch origin1530-------------------------------------------------15311532will produce a numbered series of files in the current directory, one1533for each patch in the current branch but not in origin/HEAD.15341535You can then import these into your mail client and send them by1536hand. However, if you have a lot to send at once, you may prefer to1537use the gitlink:git-send-email[1] script to automate the process.1538Consult the mailing list for your project first to determine how they1539prefer such patches be handled.15401541Importing patches to a project1542------------------------------15431544Git also provides a tool called gitlink:git-am[1] (am stands for1545"apply mailbox"), for importing such an emailed series of patches.1546Just save all of the patch-containing messages, in order, into a1547single mailbox file, say "patches.mbox", then run15481549-------------------------------------------------1550$ git am -3 patches.mbox1551-------------------------------------------------15521553Git will apply each patch in order; if any conflicts are found, it1554will stop, and you can fix the conflicts as described in1555"<<resolving-a-merge,Resolving a merge>>". (The "-3" option tells1556git to perform a merge; if you would prefer it just to abort and1557leave your tree and index untouched, you may omit that option.)15581559Once the index is updated with the results of the conflict1560resolution, instead of creating a new commit, just run15611562-------------------------------------------------1563$ git am --resolved1564-------------------------------------------------15651566and git will create the commit for you and continue applying the1567remaining patches from the mailbox.15681569The final result will be a series of commits, one for each patch in1570the original mailbox, with authorship and commit log message each1571taken from the message containing each patch.15721573[[setting-up-a-public-repository]]1574Setting up a public repository1575------------------------------15761577Another way to submit changes to a project is to simply tell the1578maintainer of that project to pull from your repository, exactly as1579you did in the section "<<getting-updates-with-git-pull, Getting1580updates with git pull>>".15811582If you and maintainer both have accounts on the same machine, then1583then you can just pull changes from each other's repositories1584directly; note that all of the command (gitlink:git-clone[1],1585git-fetch[1], git-pull[1], etc.) which accept a URL as an argument1586will also accept a local file patch; so, for example, you can1587use15881589-------------------------------------------------1590$ git clone /path/to/repository1591$ git pull /path/to/other/repository1592-------------------------------------------------15931594If this sort of setup is inconvenient or impossible, another (more1595common) option is to set up a public repository on a public server.1596This also allows you to cleanly separate private work in progress1597from publicly visible work.15981599You will continue to do your day-to-day work in your personal1600repository, but periodically "push" changes from your personal1601repository into your public repository, allowing other developers to1602pull from that repository. So the flow of changes, in a situation1603where there is one other developer with a public repository, looks1604like this:16051606 you push1607 your personal repo ------------------> your public repo1608 ^ |1609 | |1610 | you pull | they pull1611 | |1612 | |1613 | they push V1614 their public repo <------------------- their repo16151616Now, assume your personal repository is in the directory ~/proj. We1617first create a new clone of the repository:16181619-------------------------------------------------1620$ git clone --bare proj-clone.git1621-------------------------------------------------16221623The resulting directory proj-clone.git will contains a "bare" git1624repository--it is just the contents of the ".git" directory, without1625a checked-out copy of a working directory.16261627Next, copy proj-clone.git to the server where you plan to host the1628public repository. You can use scp, rsync, or whatever is most1629convenient.16301631If somebody else maintains the public server, they may already have1632set up a git service for you, and you may skip to the section1633"<<pushing-changes-to-a-public-repository,Pushing changes to a public1634repository>>", below.16351636Otherwise, the following sections explain how to export your newly1637created public repository:16381639[[exporting-via-http]]1640Exporting a git repository via http1641-----------------------------------16421643The git protocol gives better performance and reliability, but on a1644host with a web server set up, http exports may be simpler to set up.16451646All you need to do is place the newly created bare git repository in1647a directory that is exported by the web server, and make some1648adjustments to give web clients some extra information they need:16491650-------------------------------------------------1651$ mv proj.git /home/you/public_html/proj.git1652$ cd proj.git1653$ git update-server-info1654$ chmod a+x hooks/post-update1655-------------------------------------------------16561657(For an explanation of the last two lines, see1658gitlink:git-update-server-info[1], and the documentation1659link:hooks.txt[Hooks used by git].)16601661Advertise the url of proj.git. Anybody else should then be able to1662clone or pull from that url, for example with a commandline like:16631664-------------------------------------------------1665$ git clone http://yourserver.com/~you/proj.git1666-------------------------------------------------16671668(See also1669link:howto/setup-git-server-over-http.txt[setup-git-server-over-http]1670for a slightly more sophisticated setup using WebDAV which also1671allows pushing over http.)16721673[[exporting-via-git]]1674Exporting a git repository via the git protocol1675-----------------------------------------------16761677This is the preferred method.16781679For now, we refer you to the gitlink:git-daemon[1] man page for1680instructions. (See especially the examples section.)16811682[[pushing-changes-to-a-public-repository]]1683Pushing changes to a public repository1684--------------------------------------16851686Note that the two techniques outline above (exporting via1687<<exporting-via-http,http>> or <<exporting-via-git,git>>) allow other1688maintainers to fetch your latest changes, but they do not allow write1689access, which you will need to update the public repository with the1690latest changes created in your private repository.16911692The simplest way to do this is using gitlink:git-push[1] and ssh; to1693update the remote branch named "master" with the latest state of your1694branch named "master", run16951696-------------------------------------------------1697$ git push ssh://yourserver.com/~you/proj.git master:master1698-------------------------------------------------16991700or just17011702-------------------------------------------------1703$ git push ssh://yourserver.com/~you/proj.git master1704-------------------------------------------------17051706As with git-fetch, git-push will complain if this does not result in1707a <<fast-forwards,fast forward>>. Normally this is a sign of1708something wrong. However, if you are sure you know what you're1709doing, you may force git-push to perform the update anyway by1710proceeding the branch name by a plus sign:17111712-------------------------------------------------1713$ git push ssh://yourserver.com/~you/proj.git +master1714-------------------------------------------------17151716As with git-fetch, you may also set up configuration options to1717save typing; so, for example, after17181719-------------------------------------------------1720$ cat >.git/config <<EOF1721[remote "public-repo"]1722 url = ssh://yourserver.com/~you/proj.git1723EOF1724-------------------------------------------------17251726you should be able to perform the above push with just17271728-------------------------------------------------1729$ git push public-repo master1730-------------------------------------------------17311732See the explanations of the remote.<name>.url, branch.<name>.remote,1733and remote.<name>.push options in gitlink:git-repo-config[1] for1734details.17351736Setting up a shared repository1737------------------------------17381739Another way to collaborate is by using a model similar to that1740commonly used in CVS, where several developers with special rights1741all push to and pull from a single shared repository. See1742link:cvs-migration.txt[git for CVS users] for instructions on how to1743set this up.17441745Allow web browsing of a repository1746----------------------------------17471748TODO: Brief setup-instructions for gitweb17491750Examples1751--------17521753TODO: topic branches, typical roles as in everyday.txt, ?175417551756Working with other version control systems1757==========================================17581759TODO: CVS, Subversion, series-of-release-tarballs, ?17601761[[cleaning-up-history]]1762Rewriting history and maintaining patch series1763==============================================17641765Normally commits are only added to a project, never taken away or1766replaced. Git is designed with this assumption, and violating it will1767cause git's merge machinery (for example) to do the wrong thing.17681769However, there is a situation in which it can be useful to violate this1770assumption.17711772Creating the perfect patch series1773---------------------------------17741775Suppose you are a contributor to a large project, and you want to add a1776complicated feature, and to present it to the other developers in a way1777that makes it easy for them to read your changes, verify that they are1778correct, and understand why you made each change.17791780If you present all of your changes as a single patch (or commit), they may1781find it is too much to digest all at once.17821783If you present them with the entire history of your work, complete with1784mistakes, corrections, and dead ends, they may be overwhelmed.17851786So the ideal is usually to produce a series of patches such that:17871788 1. Each patch can be applied in order.17891790 2. Each patch includes a single logical change, together with a1791 message explaining the change.17921793 3. No patch introduces a regression: after applying any initial1794 part of the series, the resulting project still compiles and1795 works, and has no bugs that it didn't have before.17961797 4. The complete series produces the same end result as your own1798 (probably much messier!) development process did.17991800We will introduce some tools that can help you do this, explain how to use1801them, and then explain some of the problems that can arise because you are1802rewriting history.18031804Keeping a patch series up to date using git-rebase1805--------------------------------------------------18061807Suppose you have a series of commits in a branch "mywork", which1808originally branched off from "origin".18091810Suppose you create a branch "mywork" on a remote-tracking branch "origin",1811and created some commits on top of it:18121813-------------------------------------------------1814$ git checkout -b mywork origin1815$ vi file.txt1816$ git commit1817$ vi otherfile.txt1818$ git commit1819...1820-------------------------------------------------18211822You have performed no merges into mywork, so it is just a simple linear1823sequence of patches on top of "origin":182418251826 o--o--o <-- origin1827 \1828 o--o--o <-- mywork18291830Some more interesting work has been done in the upstream project, and1831"origin" has advanced:18321833 o--o--O--o--o--o <-- origin1834 \1835 a--b--c <-- mywork18361837At this point, you could use "pull" to merge your changes back in;1838the result would create a new merge commit, like this:183918401841 o--o--O--o--o--o <-- origin1842 \ \1843 a--b--c--m <-- mywork18441845However, if you prefer to keep the history in mywork a simple series of1846commits without any merges, you may instead choose to use1847gitlink:git-rebase[1]:18481849-------------------------------------------------1850$ git checkout mywork1851$ git rebase origin1852-------------------------------------------------18531854This will remove each of your commits from mywork, temporarily saving them1855as patches (in a directory named ".dotest"), update mywork to point at the1856latest version of origin, then apply each of the saved patches to the new1857mywork. The result will look like:185818591860 o--o--O--o--o--o <-- origin1861 \1862 a'--b'--c' <-- mywork18631864In the process, it may discover conflicts. In that case it will stop and1865allow you to fix the conflicts as described in1866"<<resolving-a-merge,Resolving a merge>>".18671868XXX: no, maybe not: git diff doesn't produce very useful results, and there's1869no MERGE_HEAD.18701871Once the index is updated with1872the results of the conflict resolution, instead of creating a new commit,1873just run18741875-------------------------------------------------1876$ git rebase --continue1877-------------------------------------------------18781879and git will continue applying the rest of the patches.18801881At any point you may use the --abort option to abort this process and1882return mywork to the state it had before you started the rebase:18831884-------------------------------------------------1885$ git rebase --abort1886-------------------------------------------------18871888Reordering or selecting from a patch series1889-------------------------------------------18901891Given one existing commit, the gitlink:git-cherry-pick[1] command allows1892you to apply the change introduced by that commit and create a new commit1893that records it.18941895This can be useful for modifying a patch series.18961897TODO: elaborate18981899Other tools1900-----------19011902There are numerous other tools, such as stgit, which exist for the purpose1903of maintianing a patch series. These are out of the scope of this manual.19041905Problems with rewriting history1906-------------------------------19071908The primary problem with rewriting the history of a branch has to do with1909merging.19101911TODO: elaborate191219131914Git internals1915=============19161917Architectural overview1918----------------------19191920TODO: Sources, README, core-tutorial, tutorial-2.txt, technical/19211922Glossary of git terms1923=====================19241925include::glossary.txt[]19261927Notes and todo list for this manual1928===================================19291930This is a work in progress.19311932The basic requirements:1933 - It must be readable in order, from beginning to end, by1934 someone intelligent with a basic grasp of the unix1935 commandline, but without any special knowledge of git. If1936 necessary, any other prerequisites should be specifically1937 mentioned as they arise.1938 - Whenever possible, section headings should clearly describe1939 the task they explain how to do, in language that requires1940 no more knowledge than necessary: for example, "importing1941 patches into a project" rather than "the git-am command"19421943Think about how to create a clear chapter dependency graph that will1944allow people to get to important topics without necessarily reading1945everything in between.19461947Scan Documentation/ for other stuff left out; in particular:1948 howto's1949 README1950 some of technical/?1951 hooks1952 etc.19531954Scan email archives for other stuff left out19551956Scan man pages to see if any assume more background than this manual1957provides.19581959Simplify beginning by suggesting disconnected head instead of1960temporary branch creation.19611962Explain how to refer to file stages in the "how to resolve a merge"1963section: diff -1, -2, -3, --ours, --theirs :1:/path notation. The1964"git ls-files --unmerged --stage" thing is sorta useful too,1965actually. And note gitk --merge. Also what's easiest way to see1966common merge base? Note also text where I claim rebase and am1967conflicts are resolved like merges isn't generally true, at least by1968default--fix.19691970Add more good examples. Entire sections of just cookbook examples1971might be a good idea; maybe make an "advanced examples" section a1972standard end-of-chapter section?19731974Include cross-references to the glossary, where appropriate.19751976Add quickstart as first chapter.19771978To document:1979 reflogs, git reflog expire1980 shallow clones?? See draft 1.5.0 release notes for some documentation.