Home
        The GIT Book - Liferay Issues
         Contents
1.            39    Git Community Book    40    text  5_InstalLing_Git 1_Linux markdown 17            l  text 05_Installing_Git 2_Mac_104 markdown l 11        text 05_Installing_Git 3_Mac_105  markdown l 8       text 05_Installing_Git 4_Windows  markdown l 7          1_Getting_a_Git_Repo markdown   7        l        0_ Comparing_Commits_Git_Diff  markdown 45 HHHHHH H H H H H H H H H H  H         _ Hosting_Git_gitweb_repoorcz_github markdown   4     9 files changed  115 insertions     6 deletions       Sometimes that makes it easier to see overall what has changed  to jog your memory     DISTRIBUTED WORKFLOWS    Suppose that Alice has started a new project with a git repository in  home alice project  and that Bob  who has a home  directory on the same machine  wants to contribute     Bob begins with     git clone  home alice project myrepo    This creates a new directory  myrepo  containing a clone of Alice s repository  The clone is on an equal footing with the  original project  possessing its own copy of the original project s history     Bob then makes some changes and commits them   Cedit files     git commit  a    Crepeat as necessary     When he s ready  he tells Alice to pull changes from the repository at  home bob myrepo  She does this with     Chapter 3  Basic Usage      cd  home alice project    git pull  home bob myrepo master    This merges the changes from Bob s  master  branch into Alice s current branch  If Alice has made her own changes in the  meantime  then s
2.       Q 02b 002Compressing   Q 02c 002Compressing   Q02c 002Compressing   Q02c 002Compressing   Q02c 002Compressing   Q02c  02Compressing   Q02c 002Compressing   Q053 002Compressing     Q05b 002Compressing    objects   objects   objects   objects   objects   objects   objects   objects     objects     0   1 1177   1   12 1177   2   24 1177   3   36 1177   4   48 1177   5   59 1177   6   71 1177   7   83 1177     100   1177 1177     Xn  BN  Np     Ar      r   Nps   r    rCompressing objects  8   95 1177   r      rCompressing objects  100   1177 1177   done  n      2004 001PACK Q00 000 000 002 000 000 n 355 225 017x 234 235 216K n 302      2005 001 360 204   225 376 330 345 z2673         Q037 002Total 2797  delta 1799   reused 2360  delta 1529  n     Chapter 7  Internals and Plumbing      lt  276 255L 273sS 005 001w0006 001 0000     See the Packfile chapter previously for the actual format of the packfile data in the response     Pushing Data    Pushing data over the git and ssh protocols is similar  but simpler  Basically what happens is the client requests a receive   pack instance  which is started up if the client has access  then the server returns all the ref head shas it has again and the  client generates a packfile of everything the server needs  generally only if what is on the server is a direct ancestor of  what it is pushing  and sends that packfile upstream  where the server either stores it on disk and builds an index for it  or  unpacks it  if there aren t many 
3.     git checkout master  or     git checkout  b fix up  then      echo  adding a line again   gt  gt  a txt     git commit  a  m  Updated the submodule from within the superproject      git push    cd       git diff   diff   git a a b a   index d266b98  261dfac 160000        a a      b a      1  1        Subproject commit d266b9873ad50488163457f025db7cdd9683d88b   Subproject commit 261dfac35cb99d380eb966e102c1197139F7Ffa24    Chapter 5  Advanced Git      git add a    git commit  m  Updated submodule a      git push    You have to run git submodule update after git pull if you want to update submodules  too     Pitfalls with submodules    Always publish the submodule change before publishing the change to the superproject that references it  If you forget to  publish the submodule change  others won t be able to clone the repository       cd   git super a     echo i added another line to this file  gt  gt  a txt    git commit  a  m  doing it wrong this time    GS cd       git add a     git commit  m  Updated submodule a again       git push     cd   git cloned     git pull     git submodule update    error  pathspec  261dfac35cb99d380eb966e102c1197139f7fa24   did not match any file s  known to git   Did you forget to  git add    Unable to checkout  261dfac35cb99d380eb966e102c1197139f7fa24  in submodule path  a     You also should not rewind branches in a submodule beyond commits that were ever recorded in any superproject     It s not safe to run git submodule update if you ve
4.     gt git grep   name only xmmap  config c   ditt c   git compat util h  read cache c   refs c   shal_file c   wrapper c    We could also see how many line matches we have in each file with the   c  option     69    Git Community Book      gt git grep  c xmmap  config c 1   ditt  lt i  git compat util h 1  read cache c 1  refs c 1  sha1_file c 5  wrapper c 1    Now  if   wanted to see where that was used in a specific version of git    could add the tag reference to the end  like this       git grep xmmap v1 5 0    v1 5   config c  contents   xmmapCNULL  st st_size  PROT_READ   v1 5 0 diff c  s  gt data   xmmap NULL  s  gt size  PROT_READ  MAP_PRIVATE  fd   v1 5   git compat util h static inline void  xmmapC void  start  size_t length   v1 5   read cache c  cache_mmap   xmmapCNULL  cache_mmap_size   v1 5   refs c  log_mapped   xmmapCNULL  st st_size  PROT_READ  MAP_PRIVATE  logfd  v1 5   shal_file c  map   xmmapCNULL  st st_size  PROT_READ  MAP_PRIVATE  fd   v1 5   shal_file c  idx_map   xmmapCNULL  idx_size  PROT_READ  MAP_PRIVATE  fd  v1 5   shal_file c  win  gt base   xmmap NULL  win  gt lLen   v1 5   shai_file c  map   xmmapCNULL  st st_size  PROT_READ  MAP_PRIVATE  fd   v1 5 0 sha1_file c buf   xmmap NULL  size  PROT_READ  MAP_PRIVATE  fd    We can see that there are some differences between the current lines and these lines in version 1 5 0  one of which is that  xmmap is now used in wrapper c where it was not back in v1 5 0     We can also combine search terms in grep
5.    error  remote  refs heads master  is not an ancestor of  local  refs heads master     Maybe you are not up to date and need to pull first    error  failed to push to  ssh   yourserver com  you proj git     This can happen  for example  if you       use    git reset   hard  gt  to remove already published commits  or    use    git commit   amend  gt  to replace already published commits    45    Git Community Book    46    Cas in  lt  lt fixing a mistake by rewriting history gt  gt    or    use    git rebase    to rebase any already published commits  as  in  lt  lt using git rebase gt  gt     You may force git push to perform the update anyway by preceding the branch name with a plus sign       git push ssh   yourserver com  you proj git  master    Normally whenever a branch head in a public repository is modified  it is modified to point to a descendant of the commit  that it pointed to before  By forcing a push in this situation  you break that convention   See  lt  lt problems with rewriting   history gt  gt       Nevertheless  this is a common practice for people that need a simple way to publish a work in progress patch series  and  it is an acceptable compromise as long as you warn other developers that this is how you intend to manage the branch     It s also possible for a push to fail in this way when other people have the right to push to the same repository  In that    case  the correct solution is to retry the push after first updating your work  either by a pu
6.   Chapter 7    Internals and Plumbing    HOW GIT STORES OBJECTS    This chapter goes into detail about how Git physically stores objects     All objects are stored as compressed contents by their sha values  They contain the object type  size and contents in a  gzipped format     There are two formats that Git keeps objects in   loose objects and packed objects     Loose Objects    Loose objects are the simpler format  It is simply the compressed data stored in a single file on disk  Every object written    to a seperate file     105    Git Community Book    If the sha of your object is ab04d884140f 7bOcf8bbf86d6883869F16a46f65  then the file will be stored in the following path   GIT_DIR objects ab 04d884140f 7bOcf 8bbf86d6883869F16a46f65    It pulls the first two characters off and uses that as the subdirectory  so that there are never too many objects in one  directory  The actual file name is the remaining 38 characters     The easiest way to describe exactly how the object data is stored is this Ruby implementation of object storage     def put_raw_object content  type   size   content  Length to_s    header      type    size  body   store   header   content    shal  path    Digest   SHA1 hexdigest store    git_dir         sha1 0   2          shai 2  40     if  File exists  path   content   Zlib  Deflate deflateCstore     FileUtils mkdir_p  directory     sha1     2    File open path   w   do IfI  f write content  end  end  return shal  end    106    Chapter 7  Internals 
7.   Git Community Book    60    INTERACTIVE ADDING    Interactive Adding is a really nice way of working with and visualizing the Git index  To start it up  simply type    git add  i      Git will show you all the modified files you have and their status       gt git add  i  staged  unchanged  unchanged  unchanged  unchanged  unchanged    UWUBBWNPR        Commands      1  status 2     What now gt     unstaged   4  0   23  11   7  7   3  3   121  0    path   assets styLesheets style css   Layout book_index_template  html   Layout chapter_tempLate  html   script pdf  rb   text 14_Interactive_Rebasing  _ Interactive_Rebasing markdown    update 3  revert 4  add untracked  5  patch 6  diff    7  quit 8  help    In this case  we can see that there are 5 modified files that have not been added to our index yet  unstaged   and even how  many lines have been added to or removed from each  It then shows us an interactive menu of what we can do in this    mode     If we want to stage the files  we can type  2  or  u  for the update mode  Then I can specify which files   want to stage  add  to the index  by typing in the numbers of the files  in this case  1 4     What now gt  2  staged  unchanged  unchanged  unchanged  unchanged  unchanged    UAWN    unstaged   4  0   23  11   7  7   3  3   121  0    path   assets stylesheets style css   Layout book_index_template  html   Layout chapter_tempLate  html   script pdf  rb   text 14_Interactive_Rebasing  _ Interactive_Rebasing markdown    Chap
8.   Say we wanted to search for where SORT_DIRENT is defined in our  repository     git grep  e   define    and  e SORT_DIRENT    builtin fsck c  define SORT_DIRENT    builtin fsck c  define SORT_DIRENT 1    70    Chapter 4  Intermediate Usage    We can also search for every file that has both search terms  but display each line that has either of the terms in those files       git grep   all match  e   define   e SORT_DIRENT    builtin fsck   builtin fsck   builtin fsck   builtin fsck   builtin fsck   builtin fsck   builtin fsck   builtin fsck   builtin fsck   builtin fsck     Ci  c  define SEEN Qx0002  c  define ERROR_OBJECT Q1  c  define ERROR_REACHABLE 02  c  define SORT_DIRENT Q  Cc   c  C      c     define REACHABLE 0x0001     define DIRENT_SORT_HINTCde          define SORT_DIRENT 1    define DIRENT_SORT_HINTCde  CCde   gt d_ino     define MAX_SHA1_ENTRIES    if CSORT_DIRENT      1024     We can also search for lines that have one term and either of two other terms  for example  if we wanted to see where  we defined constants that had either PATH or MAX in the name       git grep  e   define    and  C  e PATH  e MAX     abspath c  define MAXDEPTH 5  builtin blame c  define MORE_THAN_ONE_PATH Clu lt  lt 13   builtin blame c  define MAXSG 16  builtin describe c  define MAX_TAGS  builtin fetch pack c  define MAX_IN_VAIN 256  builtin fsck c  define MAX_SHA1_ENTRIES  1024      FLAG_BITS   1     71    Git Community Book    72    UNDOING IN GIT   RESET  CHECKOUT AND REVERT    Gi
9.   hopefully amicably  IN    i ba23640   Fix CommitDb errors in test  was this the right fix   i 4d8873e   test_commit no longer fails if you re not in PDT    b3285ad   Use the appropriate method to find a first occurrenc    44dda6c   more cleanly accept separate options for initializin  i 839ba9f   needed to be able to ask Repo new to work with a bar        d 65e76   empty commit to push project to runcoderun  wl 791ec6b   updated grit gemspec  ial 7560947   including code from github updates    3fa3284   whitespace    d 1cffd   whitespace    aQe4a3d   updated grit gemspec    7569d  d   including code from github updates          37    Git Community Book    38    Lastly  you can reverse the order of the log with the    reverse    option     COMPARING COMMITS   GIT DIFF    You can generate diffs between any two versions of your project using git diff     git diff master  test    That will produce the diff between the tips of the two branches  If you d prefer to find the diff from their common  ancestor to test  you can use three dots instead of two       git diff master   test  git diff is an incredibly useful tool for figuring out what has changed between any two points in your project s history  or to  see what people are trying to introduce in new branches  etc   What you will commit    You will commonly use git diff for figuring out differences between your last commit  your index  and your current working  directory  A common use is to simply run      git diff    which wi
10.  15 44 11 2008  0700  Start 1 6   X maintenance series  Documentation RelNotes 1 6 0 1 txt   15 FEEE EEE Ett ttt t     ReLNotes   2     2 files changed  16 insertions     1 deletions       Formatting the Log    You can also format the log output almost however you want  The    pretty    option can take a number of preset formats   such as  oneline      33    Git Community Book    34      git log   pretty oneline   a6b444f570558a5f31ab508dc2a24dc34773825f dammit  this is the second time this has reverted  49d77f72783e4e9f12d1bbcacc45e7a15c80024  modified index to create refs heads if it is not  9764edd90cf9a423c9698a2f1e814F16F0111238 Add diff lcs dependency  e1ba1e3ca83d53a2f16b39c453fad33380f8d1icc Add dependency for Open4  OF87b4d9020f F F756c18323106b3fd4e2f422135 merged recent changes    accepts relative alt pat  f ce7d5979dfbOF415799d086e14a8d2F9653300 updated the Manifest file    or you can do  short  format   y      git log   pretty short  commit a6b444f570558a5f31ab508dc2a24dc34773825f  Author  Scott Chacon  lt schacon gmail  com gt    dammit  this is the second time this has reverted    commit 49d77f72783e4e9f12d1bbcacc45e7a15c800240  Author  Scott Chacon  lt schacon gmail   com gt     modified index to create refs heads if it is not there    commit 9764edd90cf9a423c9698a2f1e814F16F0111238  Author  Hans Engel  lt engel engel  uk to gt     Add diff lcs dependency    You can also use    medium        full        fuller        email    or  raw   If those formats aren t 
11.  Untracked files   Cuse  git add  lt file gt        to include in what will be committed     bLlametree  blametree init  git gui git citool    FRR RR HH HR HH    If you blow the index away entirely  you generally haven t lost any information as long as you have the name of the tree  that it described     And with that  you should have a pretty good understanding of the basics of what Git is doing behind the scenes  and why  it is a bit different than most other SCM systems  Don t worry if you don t totally understand it all right now  we ll revisit  all of these topics in the next sections  Now we re ready to move on to installing  configuring and using Git     Chapter 2    Chapter 2  First Time    First Time    INSTALLING GIT    Installing from Source    In short  on a Unix based system  you can download the Git source code from the Git Download Page  and then run    something along the lines of        make prefix  usr all    as yourself    make prefix  usr install    as root    You will need the expat  curl  zlib  and openssl libraries installed   though with the possible exception of expat  these will  normally already be there     Git Community Book    Linux   If you are running Linux  you can likely install Git easily via your native package management system     yum install git core    apt get install git core   If that doesn t work  you can download the  deb or  rpm packages from here    RPM Packages   Stable Debs   If you prefer to install from source on a Linux syste
12.  anything else or have attributes of any kind  not  even a file name     Since the blob is entirely defined by its data  if two files in a directory tree  or in multiple different versions of the  repository  have the same contents  they will share the same blob object  The object is totally independent of its location  in the directory tree  and renaming a file does not change the object that file is associated with     Git Community Book    Tree Object    A tree is a simple object that has a bunch of pointers to blobs and other trees   it generally represents the contents of a  directory or subdirectory     blob   5b1d3   README    wee   ree  eacop   test  blob   cbada   test zb   blob lorier raite       The ever versatile git show command can also be used to examine tree objects  but git Is tree will give you more details   Assuming we have the SHA for a tree  we can examine it like this       git ls tree fb3a8bdd  ce   100644 blob 63c918c667fa005ff12ad89437f2fdc80926e21c  gitignore  100644 blob 5529b198e8d14decbe4ad99db3f7fb632de0439d  mailmap   100644 blob 6ff87c4664981e4397625791c8ea3bbb5f2279a3 COPYING   040000 tree 2fb783e477100ce076f6bf57e4a6FO26013dc745 Documentation  100755 blob 3c 032cec592a765692234f1cba47dfdcc3a9200 GIT VERSION GEN  100644 blob 289b0460443c0647624607d471289b2c7dcd470b INSTALL   100644 blob 4eb463797adc693dc168b926b6932F f53F17d0b1 Makefile   100644 blob 548142c327a6790f f8821d67c2eeleff7a656b52 README    As you can see  a tree object contains a 
13.  d      Now clone the superproject     94    Chapter 5  Advanced Git      ed    git clone super cloned    cd cloned    The submodule directories are there  but they re empty     Is  a a      git submodule status    d266b9873ad50488163457f025db7cdd9683d88b a   e81d457da15309b4fef4249aba9b50187999670d b   c1536a972b9af feaQf16e0680ba87332dc059146 c   d96249f f5d57de5de093e6baf f9eQaafa5276a74 d    NOTE  The commit object names shown above would be different for you  but they should match the HEAD commit  object names of your repositories  You can check it by running git 1s remote    a     Pulling down the submodules is a two step process  First run git submodule init to add the submodule repository URLs  to  git config      git submodule init  Now use git submodule update to clone the repositories and check out the commits specified in the superproject       git submodule update    cd a    Is  a   agit  atXE    95    Git Community Book    96    One major difference between git submodule update and git submodule add is that git submodule update checks out  a specific commit  rather than the tip of a branch  It s like checking out a tag  the head is detached  so you re not working  on a branch       git branch     no branch   master    If you want to make a change within a submodule and you have a detached head  then you should create or checkout a  branch  make your changes  publish the change within the submodule  and then update the superproject to reference the  new commit   
14.  from is in the webserver path     In order for this to work  you do need to run a single command on the server repo everytime anything is updated  though    git update server info  which updates the objects info packs and info refs files to list which refs and packfiles are available   since you can t do a listing over http  When that command is run  the objects info packs file looks something like this     P pack ce2bd34abc3d8ebc5922dc81b2e1f30bf17c10cc  pack  P pack 7ad5f5d05f5e20025898c95296f e4b9c 8612468   pack    So that if the fetch can t find a loose file  it can try these packfiles  The info refs file will look something like this     184063c9b594f8968d61a686b2f6052779551613 refs heads deveLopment  32aae7aef 7a412d62192F710F2130302997ec883 refs heads master    Then when you fetch from this repo  it will start with these refs and walk the commit objects until the client has all the  objects that it needs     Chapter 7  Internals and Plumbing    For instance  if you ask to fetch the master branch  it will see that master is pointing to 32aae7ae and that your master is  pointing to ab04d88  so you need 32aae7ae  You fetch that object    CONNECT http   myserver com  GET  git myproject git objects 32 aae aef7a412d62192F710F2130302997ec883   200    and it looks like this   tree aal76fb83a47d00386be237b450fb9dfb5be251a  parent bd71cad2d597d0f1827d4a3f67bb96a646F02889  author Scott Chacon  lt schacon gmail com gt  1220463037  0700  committer Scott Chacon  lt schacon gmail c
15.  git commit  file txt  needs merge    Also  git status will list those files as  unmerged   and the files with conflicts will have conflict markers added  like this     29    Git Community Book    30     lt  lt  lt  lt  lt  lt  lt  HEAD  file txt  Hello world    Goodbye   gt  gt  gt  gt  gt  gt  gt _77976da35a11db4580b80ae27e8d65caf5208086  file  txt    All you need to do is edit the files to resolve the conflicts  and then      git add file txt    git commit    Note that the commit message will already be filled in for you with some information about the merge  Normally you can  just use this default message unchanged  but you may add additional commentary of your own if desired     The above is all you need to know to resolve a simple merge  But git also provides more information to help resolve  conflicts     Undoing a merge    If you get stuck and decide to just give up and throw the whole mess away  you can always return to the pre merge state  with      git reset   hard HEAD  Or  if you ve already committed the merge that you want to throw away     git reset   hard ORIG_HEAD    However  this last command can be dangerous in some cases  never throw away a commit if that commit may itself have  been merged into another branch  as doing so may confuse further merges     Chapter 3  Basic Usage    Fast forward merges    There is one special case not mentioned above  which is treated differently  Normally  a merge results in a merge commit  with two parents  one for each of t
16.  made and committed changes within a submodule without checking  out a branch first  They will be silently overwritten     97    Git Community Book    98      cat a txt   module a     echo line added from private2  gt  gt  a txt     git commit  a  m  line added inside private2      cd a      git submodule update   Submodule path  a   checked out  d266b9873ad50488163457f025db7cdd9683d88b      cda     cat a txt   module a    NOTE  The changes are still visible in the submodule s reflog     This is not the case if you did not commit your changes     Chapter 6    Working with Git    GIT ON WINDOWS     mSysGit     DEPLOYING WITH GIT    Capistrano and Git  GitHub Guide on Deploying with Cap    Git and Capistrano Screencast    Chapter 6  Working with Git    99    Git Community Book    100    SUBVERSION INTEGRATION    SCM MIGRATION    So you ve made the decision to move away from your existing system and convert your whole project to Git  How can  you do that easily     Importing Subversion    Git comes with a script called git svn that has a clone command that will import a subversion repository into a new git  repository  There is also a free tool on the GitHub service that will do this for you       git svn clone http   my project googlecode com svn trunk new project    This will give you a new Git repository with all the history of the original Subversion repo  This takes a pretty good  amount of time  generally  since it starts with version   and checks out and commits locally e
17.  new branch  and if you don t want to use  git pull    explicitly     The    git clone    command automatically sets up a  master    branch that is a tracking branch for    origin master    the master  branch on the cloned repository     67    Git Community Book    68    You can create a tracking branch manually by adding the    track    option to the  branch  command in Git   git branch   track experimental origin experimental   Then when you run     git pull experimental   It will automatically fetch from  origin  and merge  origin experimental    into your local    experimental    branch     Likewise  when you push to origin  it will push what your    experimental    points to to origins  experimental     without having  to specify it     FINDING WITH GIT GREP    Finding files with words or phrases in Git is really easy with the git grep command  It is possible to do this with the normal  unix  grep  command  but with    git grep    you can also search through previous versions of the project without having to  check them out     For example  if   wanted to see eve lace that used the  xmmap  call in my git git repository    could run this   P ry P P y git g P y       git grep xmmap   config c  contents   xmmapCNULL  contents_sz  PROT_READ    ditt c  s  gt data   xmmapC NULL  s  gt size  PROT_READ  MAP_PRIVATE  fd       git compat util h extern void  xmmap void  start  size_t length  int prot  int fla  read cache c  mmap   xmmapCNULL  mmap_size  PROT_READ   PROT_WRITE  MAP_
18.  of the line  including 4 byte line length and trailing newline if present   Following  are the command and arguments  This is followed by a null byte and then the host information  The request is terminated  by a null byte     The request is processed and turned into a call to git upload pack     git upload pack  path to repos project git  This immediately returns information of the repo     007c74730d410f cb6603ace96f1dc55ea6196122532d HEAD   Qmulti_ack thin pack side band side band 64k ofs delta shall  003e7d1665144a3a975cO5F1F43902ddaf084e784dbe refs heads debug   003d5a3f6be755bbb7deae50065988cbfalffa9ab68a refs heads dist   003e7e47fe2bd8d01d481f44d7af0531bd93d3b21c01 refs heads Local    127    Git Community Book    128    Q03f74730d410f cb6603ace96f1dc55ea6196122532d refs heads master    0000    Each line starts with a four byte line length declaration in hex  The section is terminated by a line length declaration of    0000     This is sent back to the client verbatim  The client responds with another request     Q0054want 74730d410f cb6603ace96F1dc55ea6196122532d multi_ack side band 64k ofs delta  0032want 7d166514403a975cO5f1F43902ddaf084e784dbe  Q 32want S5a3f6be755bbb7deae50065988cbfalf fa9ab68a  Q 32want 7e47fe2bd8d01d481f44d7af0531bd93d3b21c01  Q 32want 74730d410f cb6603ace96f1dc55ea6196122532d     0000009done    The is sent to the open git upload pack process which then streams out the final response      QQ 08NAK n      Q 023 002Counting objects  2797  done  n
19.  other s  repositories directly  commands that accept repository URLs as arguments will also accept a local directory name       git clone  path to repository    git pull  path to other repository    or an ssh URL     git clone ssh   yourhost  you repository  For projects with few developers  or for synchronizing a few private repositories  this may be all you need     However  the more common way to do this is to maintain a separate public repository  usually on a different host  for  others to pull changes from  This is usually more convenient  and allows you to cleanly separate private work in progress  from publicly visible work     You will continue to do your day to day work in your personal repository  but periodically  push  changes from your  personal repository into your public repository  allowing other developers to pull from that repository  So the flow of  changes  in a situation where there is one other developer with a public repository  looks like this     43    Git Community Book    you push  your personal repo                     gt  your public repo  A l  l l    you pull   they pull    l       l they push V  their public repo  lt                     their repo    Pushing changes to a public repository    Note that the two techniques outlined above  exporting via  lt  lt exporting via http http gt  gt  or  lt  lt exporting via git git gt  gt    allow other maintainers to fetch your latest changes  but they do not allow write access  which you will need to u
20.  share the same build scripts     With centralized revision control systems this is often accomplished by including every module in one single repository   Developers can check out all modules or only the modules they need to work with  They can even modify files across  several modules in a single commit while moving things around or updating APIs and translations     Chapter 5  Advanced Git    Git does not allow partial checkouts  so duplicating this approach in Git would force developers to keep a local copy of  modules they are not interested in touching  Commits in an enormous checkout would be slower than you d expect as Git  would have to scan every directory for changes  If modules have a lot of local history  clones would take forever     On the plus side  distributed revision control systems can much better integrate with external sources  In a centralized  model  a single arbitrary snapshot of the external project is exported from its own revision control and then imported into  the local revision control on a vendor branch  All the history is hidden  With distributed revision control you can clone the  entire external history and much more easily follow development and re merge local changes     Git s submodule support allows a repository to contain  as a subdirectory  a checkout of an external project  Submodules  maintain their own identity  the submodule support just stores the submodule repository location and commit ID  so  other developers who clone the cont
21.  some other files directories in there as well  but they are not important for now     Chapter    Introduction    The Working Directory    The Git    working directory    is the directory that holds the current checkout of the files you are working on  Files in this  directory are often removed or replaced by Git as you switch branches   this is normal  All your history is stored in the  Git Directory  the working directory is simply a temporary checkout place where you can modify the files until your next  commit     THE GIT INDEX    The Git index is used as a staging area between your working directory and your repository  You can use the index to  build up a set of changes that you want to commit together  When you create a commit  what is committed is what is  currently in the index  not what is in your working directory     Looking at the Index    The easiest way to see what is in the index is with the git status command  When you run git status  you can see which  files are staged  currently in your index   which are modified but not yet staged  and which are completely untracked       gt git status    On branch master    Your branch is behind  origin master  by 11 commits  and can be fast forwarded        Changes to be committed   Cuse  git reset HEAD  lt file gt      to unstage             modified  daemon c          Changed but not updated     Git Community Book    Cuse  git add  lt file gt      to update what will be committed   modified  grep c  modified  grep h   
22.  special in some way  It is normally used to tag certain commits as  specific releases or something along those lines     Almost all of Git is built around manipulating this simple structure of four different object types  It is sort of its own little  filesystem that sits on top of your machine s filesystem     Different from SVN  It is important to note that this is very different from most SCM systems that you may be familiar with  Subversion  CVS   Perforce  Mercurial and the like all use Delta Storage systems   they store the differences between one commit and the    next  Git does not do this   it stores a snapshot of what all the files in your project look like in this tree structure each  time you commit  This is a very important concept to understand when using Git     Blob Object    A blob generally stores the contents of a file     Chapter    Introduction    5b1d3      ifndef REVISION_H   define REVISION_H     include    parse options h         define SEEN  lu lt  lt     define UNINTERESTING  lu  define TREESAME  lu lt  lt 2        You can use git show to examine the contents of any blob  Assuming we have the SHA for a blob  we can examine its  contents like this       git show 6ff87c4664    Note that the only valid version of the GPL as far as this project  is concerned is _this_ particular version of the license  ie v2  not  v2 2 or v3 x or whatever   unless explicitly otherwise stated     A  blob  object is nothing but a chunk of binary data  It doesn t refer to
23.  then have a new directory named    git    that contains all the Git source code  and history   it is basically a complete copy of what was on the server     By default  Git will name the new directory it has checked out your cloned code into after whatever comes directly before  the   git  in the path of the cloned project   ie  git clone http   git kernel org linux kernel git torvalds linux 2 6 git will result in a  new directory named    linux 2 6      Initializing a New Repository    Assume you have a tarball named project tar gz with your initial work  You can place it under git revision control as  follows       tar xzf project tar gz    cd project    git init    Git will reply  Initialized empty Git repository in  git     You ve now initialized the working directory  you may notice a new directory created  named  git      Chapter 3  Basic Usage    NORMAL WORKFLOW    Modify some files  then add their updated contents to the index     git add filel file2 file3   You are now ready to commit  You can see what is about to be committed using git diff with the   cached option     git diff   cached     Without   cached  git diff will show you any changes that you ve made but not yet added to the index   You can also get a  brief summary of the situation with git status       git status     On branch master     Changes to be committed    Cuse  git reset HEAD  lt file gt        to unstage     modified  filel  modified  file2  modified  file3    OR HE HR FEE    If you need to mak
24.  will look like this      user   name   Scott Chacon  email   schacon gmail com    If you want to override those values for a specific project  to use a work email address  for example   you can run the git  config command without the  global option while in that project  This will add a  user  section like the one shown above to  the  git config file in your project s root directory     22    Chapter 3    Chapter 3  Basic Usage    Basic Usage    GETTING A GIT REPOSITORY    So now that we re all set up  we need a Git repository  We can do this one of two ways   we can clone one that already  exists  or we can initialize one either from existing files that aren t in source control yet  or from an empty directory     Cloning a Repository    In order to get a copy of a project  you will need to know the project s Git URL   the location of the repository  Git can  operate over many different protocols  so it may begin with ssh     http s      git     or just a username  in which case git will  assume ssh   Some repositories may be accessed over more than one protocol  For example  the source code to Git itself  can be cloned either over the git    protocol     git clone git   git kernel org pub scm git git git    23    Git Community Book    24    or over http   git clone http   ww kernel org pub scm git git git    The git    protocol is faster and more efficient  but sometimes it is necessary to use http when behind corporate firewalls  or what have you  In either case you should
25.  you find a mistake in an older commit  but still one that you have not yet published to the world  you use git rebase in  interactive mode  with  git rebase  i  marking the change that requires correction with edit  This will allow you to amend  the commit during the rebasing process     MAINTAINING GIT    Ensuring good performance    On large repositories  git depends on compression to keep the history information from taking up too much space on disk  or in memory     This compression is not performed automatically  Therefore you should occasionally run git gc     git gc    to recompress the archive  This can be very time consuming  so you may prefer to run git gc when you are not doing  other work     Ensuring reliability    Chapter 4  Intermediate Usage    The git fsck command runs a number of self consistency checks on the repository  and reports on any problems  This may    take some time  The most common warning by far is about  dangling  objects       git fsck    dangling  dangling  dangling  dangling  dangling  dangling  dangling  dangling    commit 7281251ddd2a61e38657c827739c57015671a6b3  commit 2706a059f258c6b245f298dc4f f2ccd30ec21a63  commit 13472b7c4b80851a1bc551779171dcb03655e9b5  blob 218761f9d90712d37a9c5e36f406f92202db07eb  commit bf093535a34a4d35731aa2bd90fe6b176302F14F  commit 8e4bec7f2ddaa268bef999853c25755452100F8e  tree d5Qbb86186bf27b681d25af89d3b5b68382e4085  tree b24c2473f1fd3d91352a624795be026d64c8841F    Dangling objects are not a problem  At wor
26. 185ee32266c860714980dbed7    Chapter 7  Internals and Plumbing    The STDOUT output of the command will the the SHA of the blob that was created     Creating Trees    Now lets say you want to create a tree from your new objects  The git mktree command makes it pretty simple to  generate new tree objects from git Is tree formatted output  For example  if you write the following to a file named   tmp   tree txt       100644 blob 6ff87c4664981e4397625791c8ea3bbb5f2279a3 file1  100644 blob 3bb0e8592a41ae3185ee32266c860714980dbed7 file2    and then piped that through the git mktree command  Git will write a new tree to the object database and give you back  the new sha of that tree       cat  tmp tree txt   git mk tree  f66a66ab6a7bfe86d52a66516ace212efa0  0fe1f    Then  we can take that and make it a subdirectory of yet another tree  and so on  If we wanted to create a new tree with  that one as a subtree  we just create a new file   tmp newtree txt  with our new SHA as a tree in it     100644 blob 6ff87c4664981e4397625791c8ea3bbb5f2279a3 filel copy  040000 tree fe6a66ab6a7bfe86d52a66516ace212efadOfelf our_files    and then use git mk tree again       cat  tmp newtree txt   git mk tree  5bac6559179bd543a024d6d187692343e2d8ae83    And we now have an artificial directory structure in Git that looks like this     121    Git Community Book        filel copy       our_files      filel      file2    1 directory  3 files    without that structure ever having actually existed on disk  Pl
27. 2    git objects 92 b8b694Ff fb1675e5975148e1121810081dbdf fe   git objects 54   git objects 54 196cc2703dc165cbd373a65a4dcf22d50ae7f7   git objects aQ   git objects aQ 423896973644771497bdc03eb99d5281615b51   git objects dQ   git objects d0 492b368b66bdabf2ac1fd8c92b39d3db916e59   git objects c4   git objects c4 d59f390b9cfd4318117afde11d601c1085f241    and the contents of these files is just the compressed data plus a header identifying their length and their type  The type is  either a blob  a tree  a commit  or a tag     The simplest commit to find is the HEAD commit  which we can find from  git HEAD       cat  git HEAD  ref  refs heads master    As you can see  this tells us which branch we re currently on  and it tells us this by naming a file under the  git directory   which itself contains a SHAI name referring to a commit object  which we can examine with cat file       cat  git refs heads master   c4d59f390b9cfd4318117afde11d601c1085f241     git cat file  t c4d59f39   commit     git cat file commit c4d59f39   tree dQ0492b368b66bdabf2ac1fd8c92b39d3db916e59   parent 54196cc2703dc165cbd373a65a4dcf22d50ae7Ff7   author J  Bruce Fields  lt bfields puzzle fieldses org gt  1143418702  0500    109    Git Community Book    110    committer J  Bruce Fields  lt bfields puzzle fieldses org gt  1143418702  0500    add emphasis  The  tree  object here refers to the new state of the tree       git ls tree d0492b36   100644 blob a0423896973644771497bdc 3eb99d5281615b51 file txt    g
28. 2005 04 18 13 04 43  0700 162      Ofcfd160  Linus Torvalds 2005 04 18 13 04 43  0700 163    NOTE  This returns a statically allocate  790296fd  Jim Meyering 2008 01 03 15 18 07  0100 164    careful about using it  Do an  xstrdupC   Ofcfd160  Linus Torvalds 2005 04 18 13 04 43  0700 165    filename    ace1534d  Junio C Hamano 2005 05 07 00 38 04  0700 166      ace1534d  Junio C Hamano 2005 05 07 00 38 04  0700 167    Also note that this returns the location  ace1534d  Junio C Hamano 2005 05 07 00 38 04  0700 168    SHA1 file can happen from any alternate  d19938ab  Junio C Hamano 2005 05 09 17 57 56  0700 169    DB_ENVIRONMENT environment variable if i    86    Chapter 5  Advanced Git    GIT AND EMAIL    Submitting patches to a project  If you just have a few changes  the simplest way to submit them may just be to send them as patches in email   First  use git format patch  for example      git format patch origin    will produce a numbered series of files in the current directory  one for each patch in the current branch but not in origin   HEAD     You can then import these into your mail client and send them by hand  However  if you have a lot to send at once  you  may prefer to use the git send email script to automate the process  Consult the mailing list for your project first to  determine how they prefer such patches be handled     Importing patches to a project    Git also provides a tool called git am  am stands for  apply mailbox    for importing such an emailed se
29. 8173b6ba4acaQ0eb34f5aabb39980735   author Scott Chacon  lt schacon gmail com gt  1220473867  0700  committer Scott Chacon  lt schacon gmail com gt  1220473867  0700    fixed a weird formatting problem    Adding Color  See all color   options in the git config docs      git config color branch auto     git config color diff auto     git config color interactive auto    git config color status auto    Or  you can set all of them on with the color ui option       git config color ui true    Commit Template      git config commit template   etc git commit template     Log Format      git config format pretty oneline    Chapter 5  Advanced Git    89    Git Community Book    90    Other Config Options    There are also a number of interesting options for packing  gc ing  merging  remotes  branches  http transport  diffs  paging   whitespace and more  If you want to tweak these  check out the git config docs     GIT HOOKS    Git Hooks    Server Side Hooks    Post Receive    GIT_DIR hooks post receive  If you wrote it in Ruby  you might get the args this way   rev_old  rev_new  ref   STDIN read splitC      Or in a bash script  something like this would work        bin sh     lt oldrev gt   lt newrev gt   lt refname gt     update a blame tree  while read oldrev newrev ref  do  echo  STARTING   oldrev  newrev  ref      Chapter 5  Advanced Git    15    for path in  git diff tree  r  oldrev   newrev   awk   print  6   do  echo  git update ref refs blametree  ref  path  newrev    git upda
30. B  jar  sbejar gmail com   Scott Chacon  schacon gmail com   Sergei Organov  osv javad com   Shawn Bohrer   shawn bohrer gmail com   Shawn O  Pearce  spearce spearce org   Steffen Prohaska  prohaska zib de   Tom Prince   tom prince ualberta net   William Pursell  bill pursell gmail com   Yasushi SHOJI  yashi atmark techno com     MAINTAINER   EDITOR  Bug this guy     Scott Chacon  schacon gmail com     Chapter    Introduction    Chapter      Introduction    WELCOME TO GIT  Welcome to Git   the fast  distributed version control system   This book is meant to be a starting point for people new to Git to learn it as quickly and easily as possible     This book will start out by introducing you to the way Git stores data  to give you the context for why it is different than  other VCS tools  This is meant to take you about 20 minutes     Next we will cover Basic Git Usage   the commands you will be using 90  of the time  These should give you a good  basis to use Git comfortably for most of what you re going to use it for  This section should take you about 30 minutes to  read through     Git Community Book    Next we will go over Intermediate Git Usage   things that are slightly more complex  but may replace some of the  basic commands you learned in the first section  This will mostly be tricks and commands that will feel more comfortable  after you know the basic commands     After you have all of that mastered  we will cover Advanced Git   commands that most people probably d
31. Chapter 4  Intermediate Usage    However  if you prefer to keep the history in mywork a simple series of commits without any merges  you may instead  choose to use git rebase       git checkout mywork    git rebase origin    This will remove each of your commits from mywork  temporarily saving them as patches  in a directory named   git   rebase    update mywork to point at the latest version of origin  then apply each of the saved patches to the new mywork     git rebase    o a a a          2 6 8    Once the ref     mywork     is updated to point to the newly created commit objects  your older commits will be abandoned   They will likely be removed if you run a pruning garbage collection   see git gc     53    Git Community Book       So now we can look at the difference in our history between running a merge and running a rebase     54    Chapter 4  Intermediate Usage    git rebase          git merge    Gu        In the process of the rebase  it may discover conflicts  In that case it will stop and allow you to fix the conflicts  after fixing  conflicts  use  git add  to update the index with those contents  and then  instead of running git commit  just run    55    Git Community Book    56      git rebase   continue  and git will continue applying the rest of the patches     At any point you may use the   abort option to abort this process and return mywork to the state it had before you  started the rebase       git rebase   abort    INTERACTIVE REBASING    You can also r
32. Git Community Book    The open Git resource pulled together by the whole community    AUTHORS  Thank these guys     Alecs King  alecsk gmail com   Amos Waterland  apw rossby metr ou edu   Andrew Ruder  andy aeruder net   Andy  Parkins  andyparkins gmail com   Arjen Laarhoven  arjen yaph org   Brian Hetro  whee smaertness net   Carl Worth   cworth cworth org   Christian Meder  chris absolutegiganten org   Dan McGee  dpmcgee gmail com   David Kastrup   dak gnu org   Dmitry V  Levin  Idv altlinux org   Francis Daly  francis daoine org   Gerrit Pape  pape smarden org    Greg Louis  glouis dynamicro ca   Gustaf Hendeby  hendeby isy liu se   Horst H  von Brand  vonbrand inf utfsm cl   J   Bruce Fields  bfields fieldses org   Jakub Narebski  jnareb gmail com   Jim Meyering  jim meyering net   Johan Herland   johan herland net   Johannes Schindelin  Johannes Schindelin gmx de   Jon Loeliger  jdl  freescale org   Josh Triplett   josh freedesktop org   Junio C Hamano  gitster pobox com   Linus Torvalds  torvalds osdl org   Lukas Sandstr  m   lukass etek chalmers se   Marcus Fritzsch  m fritschy de   Michael Coleman  tutufan gmail com   Michael Smith   msmith cbnco com   Mike Coleman  tutufan gmail com   Miklos Vajna  vmiklos frugalware org   Nicolas Pitre   nico cam org   Oliver Steele  steele osteele com   Paolo Ciarrocchi  paolo ciarrocchi gmail com   Pavel Roskin   proski gnu org   Ralf Wildenhues  Ralf  Wildenhues gmx de   Robin Rosenberg  robin rosenberg lists dewire com    Santi 
33. PRIVATE   refs c  Log_mapped   xmmapCNULL  mapsz  PROT_READ  MAP_PRIVATE  logfd       shai_file c  map   xmmapCNULL  mapsz  PROT_READ  MAP_PRIVATE  fd  Q    shai_file c  idx_map   xmmapCNULL  idx_size  PROT_READ  MAP_PRIVATE  fd  Q      Chapter 4  Intermediate Usage    shai_file c  win  gt base   xmmapC NULL  win  gt Len   shai_file c  map   xmmapCNULL   size  PROT_READ  MAP_PRIVATE  f  shai_file c  buf   xmmapCNULL  size  PROT_READ  MAP_PRIVATE  fd  Q      wrapper c void  xmmap void  start  size_t length   If   wanted to see the line number of each match as well    can add the   n  option       gt git grep  n xmmap    config c 1016  contents   xmmapCNULL  contents_sz  PROT_READ    diff  c 1833  s  gt data   xmmapC NULL  s  gt size  PROT_READ  MAP_PRIVATE  fd   git compat util h 291 extern void  xmmap void  start  size_t length  int prot  int  read cache c 1178  mmap   xmmapCNULL  mmap_size  PROT_READ   PROT_WRITE  MAP_  refs c 1345  log_mapped   xmmapC NULL  mapsz  PROT_READ  MAP_PRIVATE  logfd       shail_file c 377  map   xmmapCNULL  mapsz  PROT_READ  MAP_PRIVATE  fd  Q    shal_file c 479  idx_map   xmmapCNULL  idx_size  PROT_READ  MAP_PRIVATE  fd  shal_file c 780  win  gt base   xmmap NULL  win  gt lLen   shal_file c 1076  map   xmmapCNULL   size  PROT_READ  MAP_PR  sha1_file c 2393  buf   xmmap NULL  size  PROT_READ  MAP_PRIVATE  fd  wrapper c 89 void  xmmap void  start  size_t length     If we re only interested in the filename  we can pass the    name only    option   
34. T INDEX    The index is a binary file  generally kept in  git index  containing a sorted list of path names  each with permissions and the  SHAI of a blob object  git Is files can show you the contents of the index       git ls files   stage    100644  100644  100644  100644  100644  100644  100644  100644    63c918c667 fa0O5f F12ad89437F2Fdc80926e21  c  5529b198e8d14decbe4ad99db3f7fb632de0439d  6ff87c4664981e4397625791c8ea3bbb5F2279a3  a37b2152bd26be2c2289e1f57a292534a51093c7  fbefe9a45b00a54b58d94d06eca48b03d40a50e0    2511aef8d89ab52be5ec6a5e46236b4b6bcd07ea  2ade97b2574a9F77e7ae4002a4e07a6a38e46d07  d5de8292e05e7c36c4b68857c1cf9855e3d2f70a     gitignore    mailmap   COPYING  Documentation  gitignore  Documentation Makefile    xdiff xtypes h  xdiff xutils c  xdiff xutils h    Chapter 7  Internals and Plumbing    Note that in older documentation you may see the index called the  current directory cache  or just the  cache   It has  three important properties     The index contains all the information necessary to generate a single  uniquely determined  tree object     For example  running git commit generates this tree object from the index  stores it in the object database  and  uses it as the tree object associated with the new commit     The index enables fast comparisons between the tree object it defines and the working tree     It does this by storing some additional data for each entry  such as the last modified time   This data is not  displayed above  and is not st
35. UTHOR_DATE  GIT_COMMITTER_NAME  GIT_COMMITTER_EMAIL  GIT_COMMITTER_DATE    Then you will need to write your commit message to a file or somehow pipe it into the command through STDIN  Then   you can create your commit object based on the tree sha we have       git commit tree bb2fa  lt   tmp message  a5f85ba5875917319471dfd98dfc636c1dc65650    If you want to specify one or more parent commits  simply add the shas on the command line with a   p  option before  each  The SHA of the new commit object will be returned via STDOUT   Updating a Branch Ref    Now that we have a new commit object SHA  we can update a branch to point to it if we want to  Lets say we want to  update our  master  branch to point to the new commit we just created   we would use the git update ref command   Technically  you can just do something like this       echo  a5f85ba5875917319471dfd98dfc636c1dc65650   gt   git refs heads master    123    Git Community Book    124    But a safer way of doing that is to use the update ref command       git update ref refs heads master a5f85ba5875917319471dfd98dfc636c1dc65650    TRANSFER PROTOCOLS    Here we will go over how clients and servers talk to each other to transfer Git data around     Fetching Data over HTTP    Fetching over an http s URL will make Git use a slightly dumber protocol  In this case  all of the logic is entirely on the  client side  The server requires no special setup   any static webserver will work fine if the git directory you are fetching 
36. ability  but on a host with a web server set up  http exports may be  simpler to set up     All you need to do is place the newly created bare git repository in a directory that is exported by the web server  and  make some adjustments to give web clients some extra information they need       mv proj git  home you public_html proj git    cd proj git    Chapter 4  Intermediate Usage      git   bare update server info    chmod a x hooks post update     For an explanation of the last two lines  see git update server info and githooks      Advertise the URL of proj git  Anybody else should then be able to clone or pull from that URL  for example with a  command line like       git clone http   yourserver com  you proj git    SETTING UP A PRIVATE REPOSITORY    If you need to setup a private repository and want to do so locally  rather than using a hosted solution  you have a number  of options     Repo Access over SSH    Generally  the easiest solution is to simply use Git over SSH  If users already have ssh accounts on a machine  you can put  the git repository anywhere on the box that they have access to and let them access it over normal ssh logins  For  example  say you have a repository you want to host  You can export it as a bare repo and then scp it onto your server  like so       git clone   bare  home user myrepo  git  tmp myrepo git    scp  r  tmp myrepo git myserver com  opt git myrepo git    Then someone else with an ssh account on myserver com can clone via       gi
37. ac54a0d4de358f3fe5d718027d96aae      git will recognize any of the following identically     98 e3ccdaac54a0d4de358f3fe5d718027d96aae  980e3ccdaac54a0d4  98 e3cc    As long as the partial sha is unique   it can t be confused with another  which is incredibly unlikely if you use at least 5  characters   git will expand a partial sha for you     Branch  Remote or Tag Name    You can always use a branch  remote or tag name instead of a sha  since they are simply pointers anyhow  If your master  branch is on the 980e3 commit and you ve pushed it to origin and have tagged it  v1 0   then all of the following are  equivalent     980e3ccdaac54a0d4de358f3fe5d718027d96aae  origin master   refs remotes origin master   master   refs heads master   v1 0   refs tags v1 0    Chapter 4  Intermediate Usage    Which means the following will give you identical output       git log master      git log refs tags v1 0    Date Spec    The Ref Log that git keeps will allow you to do some relative stuff locally  such as     master  yesterday     master  1 month ago     Which is shorthand for  where the master branch head was yesterday     etc  Note that this format can result in different  shas on different computers  even if the master branch is currently pointing to the same place     Ordinal Spec    This format will give you the Nth previous value of a particular reference  For example   master  5     will give you the 5th prior value of the master head ref     65    Git Community Book    66    C
38. aining project   superproject   can easily clone all the submodules at the same  revision  Partial checkouts of the superproject are possible  you can tell Git to clone none  some or all of the submodules     The git submodule command is available since Git 1 5 3  Users with Git 1 5 2 can look up the submodule commits in the  repository and manually check them out  earlier versions won t recognize the submodules at all     To see how submodule support works  create  for example  four example repositories that can be used later as a  submodule       mkdir   git    cd   git    foriinabcd  do  mkdir  i  cd  i  git init  echo  module  i   gt   i txt  git add  i txt  git commit  m  Initial commit  submodule  i     93    Git Community Book    cd   i   done    Now create the superproject and add all the submodules       mkdir super    cd super    git init    foriinabcd  do  git submodule add   git  i  done    NOTE  Do not use local URLs here if you plan to publish your superproject     See what files git submodule created       ls  a   git  gitmodules a b c d    The git submodule add command does a couple of things     e It clones the submodule under the current directory and by default checks out the master branch   e It adds the submodule s clone path to the gitmodules file and adds this file to the index  ready to be committed   e It adds the submodule s current commit ID to the index  ready to be committed     Commit the superproject     git commit  m  Add submodules a  b  c and
39. and Plumbing    Packed Objects    The other format for object storage is the packfile  Since Git stores each version of each file as a seperate object  it can get  pretty inefficient  Imagine having a file several thousand lines long and changing a single line  Git will store the second file in  it s entirety  which is a great big waste of space     In order to save that space  Git utilizes the packfile  This is a format where Git will only save the part that has changed in  the second file  with a pointer to the file it is similar to     When objects are written to disk  it is often in the loose format  since that format is less expensive to access  However   eventually you ll want to save the space by packing up the objects   this is done with the git gc command  It will use a  rather complicated heuristic to determine which files are likely most similar and base the deltas off that analysis  There can  be multiple packfiles  they can be repacked if neccesary  git repack  or unpacked back into loose files  git unpack objects   relatively easily     Git will also write out an index file for each packfile that is much smaller and contains offsets into the packfile to more  quickly find specific objects by sha     The actual details of the packfile implementation are found in the Packfile chapter a little later on     BROWSING GIT OBJECTS    We can ask git about particular objects with the cat file command  Note that you can shorten the shas to only a few  characters to save y
40. apter 4  Intermediate Usage    STASHING    While you are in the middle of working on something complicated  you find an unrelated but obvious and trivial bug  You  would like to fix it before continuing  You can use git stash to save the current state of your work  and after fixing the bug   or  optionally after doing so on a different branch and then coming back   unstash the work in progress changes       git stash  work in progress for foo feature     This command will save your changes away to the stash  and reset your working tree and the index to match the tip of  your current branch  Then you can make your fix as usual       edit and test        git commit  a  m  blorpl  typofix     After that  you can go back to what you were working on with git stash apply       git stash apply    Stash Queue    You can also use stashing to queue up stashed changes   If you run  git stash list    you can see which stashes you have saved       gt git stash list  stash      WIP on book  51ibeald    fixed images  stash  1   WIP on master  9705ae6    changed the browse code to the official repo    Then you can apply them individually with  git stash apply stash  1    You can clear out the list with  git stash clear        63    Git Community Book    64    GIT TREEISHES    There are a number of ways to refer to a particular commit or tree other than spelling out the entire 40 character sha  In  Git  these are referred to as a  treeish        Partial Sha    If your commit sha is  98Qe3ccda
41. are a number of useful things we can do  including unstaging files  3  revert   adding untracked files  4  add  untracked   and viewing diffs  6  diff   Those are all pretty straightforward  However  there is one command that is pretty  cool here  which is staging patches  5  patch      If you type  5  or  p  in the menu  git will show you your diff patch by patch  or hunk by hunk  and ask if you want to stage  each one  That way you can actually stage for a commit a part of a file edit  If you ve edited a file and want to only commit  part of it and not an unfinished part  or commit documentation or whitespace changes seperate from substantive changes   you can use  git add  i  to do so relatively easily     Here I ve staged some changes to the bookindextemplate html file  but not all of them     1  2  3   4   5  6    staged   4  0   20  7   7  7   3  3  unchanged  unchanged    unstaged  nothing   3  4  nothing  nothing   121  0   85  0    path   assets styLesheets style css   Layout book_index_template  html   Layout chapter_tempLate  html   script pdf rb   text 14_Interactive_Rebasing Q _ Interactive_Rebasing markdown  text 15_Interactive_Adding  _ Interactive_Adding markdown    When you are done making changes to your index through    git add  i   you simply quit  7  quit  and then run  git commit    to  commit the staged changes  Remember not to run  git commit  a   which will blow away all the careful changes you ve just    made and simply commit everything     62    Ch
42. arrot Parent    This will give you the Nth parent of a particular commit  This format is only useful on merge commits   commit objects  that have more than one direct parent     masterA2    Tilde Spec   The tilde spec will give you the Nth grandparent of a commit object  For example   master 2   will give us the first parent of the first parent of the commit that master points to  It is equivalent to   masterAA   You can keep doing this  too  The following specs will point to the same commit     masterAAAAAA  master 3A 2  master 6    Tree Pointer    This disambiguates a commit from the tree that it points to  If you want the sha that a commit points to  you can add the     Af tree   spec to the end of it     masterA tree     Chapter 4  Intermediate Usage    Blob Spec  If you want the sha of a particular blob  you can add the blob path at the end of the treeish  like so     master   path to file    Range    Finally  you can specify a range of commits with the range spec  This will give you all the commits between 7b593b5 and  5lbeal  where 5 beal is most recent   excluding 7b593b5 but including 5 beal     7b593b5   51bea1  This will include every commit since 7b593b     7b593b       TRACKING BRANCHES    A    tracking branch    in Git is a local branch that is connected to a remote branch  When you push and pull on that branch  it  automatically pushes and pulls to the remote branch that it is connected with     Use this if you always pull from the same upstream branch into the
43. at he doesn t need to give the path to Alice s repository  when Bob cloned Alice s repository  git stored the  location of her repository in the repository configuration  and that location is used for pulls       git config   get remote origin url   home alice project     The complete configuration created by git clone is visible using  git config  I   and the git config man page explains the  meaning of each option      Git also keeps a pristine copy of Alice s master branch under the name  origin master        git branch  r  origin master    If Bob later decides to work from a different host  he can still perform clones and pulls using the ssh protocol     git clone alice org  home alice project myrepo    Alternatively  git has a native protocol  or can use rsync or http  see git pull for details     Chapter 3  Basic Usage    Git can also be used in a CVS like mode  with a central repository that various users push changes to  see git push and  link cvs migration html git for CVS users    Public git repositories    Another way to submit changes to a project is to tell the maintainer of that project to pull the changes from your  repository using git pull  In the section   lt  lt getting updates with git pull  Getting updates with git pull gt  gt   we described this  as a way to get updates from the  main  repository  but it works just as well in the other direction     If you and the maintainer both have accounts on the same machine  then you can just pull changes from each
44. ax  You can also place  gitignore files in other directories in your  working tree  and they will apply to those directories and their subdirectories  The  gitignore files can be added to your  repository like any other files  just run git add  gitignore and git commit  as usual   which is convenient when the  exclude patterns  such as patterns matching build output files  would also make sense for other users who clone your  repository     If you wish the exclude patterns to affect only certain repositories  instead of every repository for a given project   you  may instead put them in a file in your repository named  git info exclude  or in any file specified by the core  excludesfile  configuration variable  Some git commands can also take exclude patterns directly on the command line  See gitignore for  the details     REBASING    Suppose that you create a branch  mywork  on a remote tracking branch  origin        git checkout  b mywork origin    Chapter 4  Intermediate Usage    origin    a    Eor    Now you do some work  creating two new commits       vi file txt     git commit     vi otherfile txt    git commit    Meanwhile  someone else does some work creating two new commits on the origin branch too  This means both  origin   and  mywork  has advanced  which means the work has diverged     5I    Git Community Book       At this point  you could use  pull  to merge your changes back in  the result would create a new merge commit  like this     git merge          52    
45. bles for the shas  crc  checksums and offsets  At the end of both files are checksum shas for both the index file and the packfile it references     Importantly  packfile indexes are not neccesary to extract objects from a packfile  they are simply used to quickly retrieve  individual objects from a pack  The packfile format is used in upload pack and receieve pack programs  push and fetch  protocols  to transfer objects and there is no index used then   it can be built after the fact by scanning the packfile     The Packfile Format    The packfile itself is a very simple format  There is a header  a series of packed objects  each with it s own header and  body  and then a checksum trailer  The first four bytes is the string    PACK     which is sort of used to make sure you re  getting the start of the packfile correctly  This is followed by a 4 byte packfile version number and then a 4 byte number of  entries in that file  In Ruby  you might read the header data like this     def read_pack_header  Sig    session recv 4   ver    session recv 4  unpackC N   Q    entries    session recv 4  unpackC N   Q     sig  ver  entries    end    After that  you get a series of packed objects  in order of thier SHAs which each consist of an object header and object  contents  At the end of the packfile is a 20 byte SHAI sum of all the shas  in sorted order  in that packfile     Chapter 7  Internals and Plumbing    objects pack pack 4eb8b   c5 pack         Offsets from pack idx    117    G
46. e any further adjustments  do so now  and then add any newly modified content to the index  Finally   commit your changes with       git commit  This will again prompt you for a message describing the change  and then record a new version of the project     Alternatively  instead of running git add beforehand  you can use    25    Git Community Book    26      git commit  a  which will automatically notice any modified  but not new  files  add them to the index  and commit  all in one step     A note on commit messages  Though not required  it s a good idea to begin the commit message with a single short  less  than 50 character  line summarizing the change  followed by a blank line and then a more thorough description  Tools that    turn commits into email  for example  use the first line on the Subject  line and the rest of the commit message in the  body     Git tracks content not files    Many revision control systems provide an  add  command that tells the system to start tracking changes to a new file  Git s   add  command does something simpler and more powerful  git add is used both for new and newly modified files  and in  both cases it takes a snapshot of the given files and stages that content in the index  ready for inclusion in the next commit     BASIC BRANCHING AND MERGING    A single git repository can maintain multiple branches of development  To create a new branch named  experimental   use    git branch experimental   If you now run    git branch    you ll 
47. e arguments given to the log  command     commit   491239170cb1463c7c3cd970862d6de636ba787  Author  Matt McCutchen  lt matt mattmccutchen net gt   Date  Thu Aug 14 13 37 41 2008  0400    git format patch documentation  clarify what   cover letter does  commit 7950659dc9ef7F2b50b18010622299c508bfdfc3  Author  Eric Raible  lt raible gmail   com gt     Date  Thu Aug 14 10 12 54 2008  0700    bash completion   git apply  should use  fix  not  strip   Bring completion up to date with the man page     You can also ask git log to show patches       git log  p    commit da9973c6f9600d90e64aacb647f3ed22dfd692F70  Author  Robert Schiele  lt rschiele gmail   com gt   Date  Mon Aug 18 16 17 04 2008  0200    adapt git cvsserver manpage to dash free syntax    diff   git a Documentation git cvsserver txt b Documentation git cvsserver txt  index c2d3c90  785779e 100644       a Documentation git cvsserver  txt       b Documentation git cvsserver txt       11 7  11 7    SYNOPSIS    32    Chapter 3  Basic Usage    SSH     verse    export CVS_SERVER git cvsserver   export CVS_SERVER  git cvsserver     cvs   d  ext user server path repo git co  lt HEAD_name gt     pserver   etc inetd conf      Log Stats    If you pass the   stat option to    git log     it will show you which files have changed in that commit and how many lines  were added and removed from each       git log   stat  commit dba9194a49452b5f093b96872e19c91b50e526aa  Author  Junio C Hamano  lt gitster pobox com gt   Date  Sun Aug 17
48. e index file  so git diff shows only the  conflicts  It uses an unusual syntax       git diff  diff   cc file txt  index 802992c 2b60207    0000000      a file txt      b file txt       1 1  1 1  1 5      t  lt  lt  lt  lt  lt  lt  lt  HEAD  file txt   Hello world      Goodbye     gt  gt  gt  gt  gt  gt  gt  77976da35a11db4580b80ae27e8d65caf5208086  file txt    Recall that the commit which will be committed after we resolve this conflict will have two parents instead of the usual  one  one parent will be HEAD  the tip of the current branch  the other will be the tip of the other branch  which is stored  temporarily in MERGE_HEAD     80    Chapter 5  Advanced Git    During the merge  the index holds three versions of each file  Each of these three  file stages  represents a different  version of the file       git show  1 file txt   the file in a common ancestor of both branches    git show  2 file txt   the version from HEAD     git show  3 file txt   the version from MERGE_HEAD     When you ask git diff to show the conflicts  it runs a three way diff between the conflicted merge results in the work tree  with stages 2 and 3 to show only hunks whose contents come from both sides  mixed  in other words  when a hunk s  merge results come only from stage 2  that part is not conflicting and is not shown  Same for stage 3      The diff above shows the differences between the working tree version of file txt and the stage 2 and stage 3 versions  So  instead of preceding each line b
49. ebase interactively  This is often used to re write your own commit objects before pusing them somewhere   It is an easy way to split  merge or re order commits before sharing them with others  You can also use it to clean up  commits you ve pulled from someone when applying them locally     If you have a number of commits that you would like to somehow modify during the rebase  you can invoke interactive  mode by passing a   i  or    interactive  to the  git rebase    command       git rebase  i origin master    This will invoke interactive rebase mode on all the commits you have made since the last time you have pushed  or  merged from the origin repository      To see what commits those are beforehand  you can run log this way     git log github master      Once you run the  rebase  i  command  you will be thrown into your editor of choice with something that looks like this     Chapter 4  Intermediate Usage    pick fc62e55 added file_size   pick 9824bf4 fixed little thing   pick 21d8 a5 added number to log   pick 76b9da6 added the apply command   pick c264051 Revert  added file_size    not implemented correctly      Rebase   408319  b 4dc3d onto f408319    Commands    p  pick   use commit   e  edit   use commit  but stop for amending   s  squash   use commit  but meld into previous commit    If you remove a line here THAT COMMIT WILL BE LOST   However  if you remove everything  the rebase will be aborted     FH HH HH HR HH    This means that there are 5 commits since you 
50. ee and then stop  since we know we have everything before this point  You can force Git to double check that we have  everything with the    recover  option  See git http fetch for more information     If one of the loose object fetches fails  Git will download the packfile indexes looking for the sha that it needs  then  download that packfile     It is important if you are running a git server that serves repos this way to implement a post receive hook that runs the    git  update server info  command each time or there will be confusion     Fetching Data with Upload Pack    For the smarter protocols  fetching objects is much more efficient  A socket is opened  either over ssh or over port 9418   in the case of the git    protocol   and the git fetch pack command on the client begins communicating with a forked git  upload pack process on the server     Chapter 7  Internals and Plumbing    Then the server will tell the client which SHAs it has for each ref  and the client figures out what it needs and responds  with a list of SHAs it wants and already has     At this point  the server will generate a packfile with all the objects that the client needs and begin streaming it down to  the client     Let s look at an example    The client connects and sends the request header  The clone command    git clone git   myserver com project git   produces the following request   Q032git upload pack  project git Q Qhost myserver   com 000    The first four bytes contain the hex length
51. exactly what you need  you can also create  your own format with the    pretty format  option  see the git log docs for all the formatting options        git log   pretty format   h was  an   ar  message   s    a6b444f was Scott Chacon  5 days ago  message  dammit  this is the second time this has re  49d77f7 was Scott Chacon  8 days ago  message  modified index to create refs heads if it i  9764edd was Hans Engel  11 days ago  message  Add diff lcs dependency    Chapter 3  Basic Usage    elbale3 was Hans Engel  11 days ago  message  Add dependency for Open4   f87b4d was Scott Chacon  12 days ago  message  merged recent changes     Another interesting thing you can do is visualize the commit graph with the    graph  option  like so       git log   pretty format   h    s    graph     2d3acf9   ignore errors from SIGCHLD on trap      5e3ee11   Merge branch  master  of git   github com dustin grit  DN       420eac9   Added a method for getting the current branch        30e367c   timeout code and tests       5a09431   add timeout protection to grit       e1193f8   support for heads with slashes in them           d6016bc   require time for xmlschema    It will give a pretty nice ASCII representation of the commit history lines     Ordering the Log   You can also view the log entries in a few different orders  Note that git log starts with the most recent commit and  works backwards through the parents  however  since git history can contain multiple independent lines of developmen
52. ext header starts     119    Git Community Book    120    The data part is just zlib stream for non delta object types  for the two delta object representations  the data portion  contains something that identifies which base object this delta representation depends on  and the delta to apply on the  base object to resurrect this object  ref delta uses 20 byte hash of the base object at the beginning of data  while of s   delta stores an offset within the same packfile to identify the base object  In either case  two important constraints a  reimplementor must adhere to are     e delta representation must be based on some other object within the same packfile     e the base object must be of the same underlying type  blob  tree  commit or tag      RAW GIT    Here we will take a look at how to manipulate git at a more raw level  in case you would like to write a tool that generates  new blobs  trees or commits in a more artificial way  If you want to write a script that uses more low level git plumbing to  do something new  here are some of the tools you ll need     Creating Blobs    Creating a blob in your Git repository and getting a SHA back is pretty easy  The git hash object command is all you ll  need  To create a blob object from an existing file  just run it with the   w  option  which tells it to write the blob  not just  compute the SHA        git hash object  w myfile txt  6f F87c4664981e4397625791c8ea3bbb5F2279a3      git hash object  w myfile2 txt  3bb0e8592a41ae3
53. get a list of all existing branches     Chapter 3  Basic Usage    experimental    master    The  experimental  branch is the one you just created  and the  master  branch is a default branch that was created for  you automatically  The asterisk marks the branch you are currently on  type      git checkout experimental   to switch to the experimental branch  Now edit a file  commit the change  and switch back to the master branch   Cedit file     git commit  a      git checkout master    Check that the change you made is no longer visible  since it was made on the experimental branch and you re back on the  master branch     You can make a different change on the master branch     Cedit file     git commit  a    at this point the two branches have diverged  with different changes made in each  To merge the changes made in  experimental into master  run      git merge experimental    If the changes don t conflict  you re done  If there are conflicts  markers will be left in the problematic files showing the  conflict       git diff    27    Git Community Book    28    will show this  Once you ve edited the files to resolve the conflicts     git commit  a  will commit the result of the merge  Finally     gitk  will show a nice graphical representation of the resulting history   At this point you could delete the experimental branch with    git branch  d experimental  This command ensures that the changes in the experimental branch are already in the current branch   If you devel
54. he may need to manually fix any conflicts   Note that the  master  argument in the above command is  actually unnecessary  as it is the default      The  pull  command thus performs two operations  it fetches changes from a remote branch  then merges them into the  current branch     When you are working in a small closely knit group  it is not unusual to interact with the same repository over and over  again  By defining  remote  repository shorthand  you can make it easier       git remote add bob  home bob myrepo    With this  Alice can perform the first operation alone using the  git fetch  command without merging them with her own  branch  using       git fetch bob    Unlike the longhand form  when Alice fetches from Bob using a remote repository shorthand set up with git remote   what was fetched is stored in a remote tracking branch  in this case bob master  So after this       git log  p master   bob master  shows a list of all the changes that Bob made since he branched from Alice s master branch   After examining those changes  Alice could merge the changes into her master branch       git merge bob master    4l    Git Community Book    42    This merge can also be done by    pulling from her own remote tracking branch     like this      git pull   remotes bob master  Note that git pull always merges into the current branch  regardless of what else is given on the command line   Later  Bob can update his repo with Alice s latest changes using     git pull    Note th
55. he two lines of development that were merged     However  if the current branch has not diverged from the other  so every commit present in the current branch is already  contained in the other  then git just performs a  fast forward   the head of the current branch is moved forward to point  at the head of the merged in branch  without any new commits being created     REVIEWING HISTORY   GIT LOG    The git log command can show lists of commits  On its own  it shows all commits reachable from the parent commit  but  you can also make more specific requests     git  git  git  git    git  git  git  git    A A A A A TAA AA    git    log  log  log  log    log  log  log  log    log    V2  Sss   commits since  not reachable from  v2 5  test  master   commits reachable from master but not test  master  test   commits reachable from test but not master  master   test   commits reachable from either test or     master  but not both    since  2 weeks ago    commits from the Last 2 weeks    Makefile   commits that modify Makefile  fs    commits that modify any file under fs    S fooQ    commits that add or remove any file data      matching the string  foo       no merges   dont show merge commits    And of course you can combine all of these  the following finds commits since v2 5 which touch the Makefile or any file    under fs     3l    Git Community Book      git log v2 5   Makefile fs     Git log will show a listing of each commit  with the most recent commits first  that match th
56. isspelling of  suppress  in docs    Signed off by  Junio C Hamano  lt gitster pobox  com gt     As you can see  a commit is defined by     a tree  The SHAI name of a tree object  as defined below   representing the contents of a directory at a certain  point in time    parent s   The SHAI name of some number of commits which represent the immediately previous step s  in  the history of the project  The example above has one parent  merge commits may have more than one  A  commit with no parents is called a  root  commit  and represents the initial revision of a project  Each project  must have at least one root  A project can also have multiple roots  though that isn t common  or necessarily a  good idea     an author  The name of the person responsible for this change  together with its date    a committer  The name of the person who actually created the commit  with the date it was done  This may  be different from the author  for example  if the author wrote a patch and emailed it to another person who  used the patch to create the commit    a comment describing this commit     Note that a commit does not itself contain any information about what actually changed  all changes are calculated by  comparing the contents of the tree referred to by this commit with the trees associated with its parents  In particular  git  does not attempt to record file renames explicitly  though it can identify cases where the existence of the same file data at  changing paths suggests a rena
57. it Community Book    118    The object header is a series of one or more   byte  8 bit  hunks that specify the type of object the following data is  and  the size of the data when expanded  Each byte is really 7 bits of data  with the first bit being used to say if that hunk is the  last one or not before the data starts  If the first bit is a 1  you will read another byte  otherwise the data starts next  The  first 3 bits in the first byte specifies the type of data  according to the table below      Currently  of the 8 values that can be expressed with 3 bits  0 7   0  000  is  undefined  and 5  101  is not yet used      Here  we can see an example of a header of two bytes  where the first specifies that the following data is a commit  and  the remainder of the first and the last 7 bits of the second specifies that the data will be 144 bytes when expanded     Chapter 7  Internals and Plumbing    OBJ_COMMIT   001  OBJ TREE   010   OBJ BLOB   011  OBJ_TAG   100  OBJ_OFS DELTA   110  OBJ_REF DELTA   111    Read from packfile     10010000 90010010          Step A 10010000 OBJ_COMMIT  00010010   Step B 100 10000 i  00010010  sepe    10010000    00010010 s    B A   gt  0010010 0000  size  144    It is important to note that the size specified in the header data is not the size of the data that actually follows  but the size    of that data when expanded  This is why the offsets in the packfile index are so useful  otherwise you have to expand every  object just to tell when the n
58. it cat file blob a0423896   hello world     and the  parent  object refers to the previous commit     git cat file commit 54196cc2  tree 92b8b694ffb1675e5975148e1121810081dbdf fe    author J  Bruce Fields  lt bfields puzzle fieldses org gt  1143414668  0500  committer J  Bruce Fields  lt bfields puzzle fieldses org gt  1143414668  0500    GIT REFERENCES    Branches  remote tracking branches  and tags are all references to commits  All references are named with a slash   separated path name starting with  refs   the names we ve been using so far are actually shorthand       The branch  test  is short for  refs heads test      The tag  v2 6 18  is short for  refs tags v2 6 18       origin master  is short for  refs remotes origin master      The full name is occasionally useful if  for example  there ever exists a tag and a branch with the same name     Chapter 7  Internals and Plumbing     Newly created refs are actually stored in the  git refs directory  under the path given by their name  However  for  efficiency reasons they may also be packed together in a single file  see git pack refs      As another useful shortcut  the  HEAD  of a repository can be referred to just using the name of that repository  So  for  example   origin  is usually a shortcut for the HEAD branch in the repository  origin      For the complete list of paths which git checks for references  and the order it uses to decide which to choose when there  are multiple references with the same shorthand na
59. last pushed and it gives you one line per commit with the following format   Caction   partial sha  Cshort commit message     Now  you can change the action  which is by default  pick   to either  edit  or  squash     or just leave it as    pick     You can also  reorder the commits just by moving the lines around however you want  Then  when you exit the editor  git will try to  apply the commits however they are now arranged and do the action specified     If    pick    is specified  it will simply try to apply the patch and save the commit with the same message as before   If  squash  is specified  it will combine that commit with the previous one to create a new commit  This will drop you into    your editor again to merge the commit messages of the two commits it is now squashing together  So  if you exit the  editor with this     57    Git Community Book    pick fc62e55 added file_size   squash 9824bf4 fixed little thing   squash 21d8 a5 added number to log   squash 76b9da6 added the apply command   squash c264051 Revert  added file_size    not implemented correctly    Then you will have to create a single commit message from this       This is a combination of 5 commits     The first commit s message is   added file_size     This is the 2nd commit message   fixed little thing     This is the 3rd commit message   added number to log     This is the 4th commit message   added the apply command     This is the 5th commit message     Revert  added file_size    not implemen
60. list of entries  each with a mode  object type  SHAI name  and name  sorted by  name  It represents the contents of a single directory tree     Chapter    Introduction    An object referenced by a tree may be blob  representing the contents of a file  or another tree  representing the contents  of a subdirectory  Since trees and blobs  like all other objects  are named by the SHAI hash of their contents  two trees  have the same SHAI name if and only if their contents  including  recursively  the contents of all subdirectories  are  identical  This allows git to quickly determine the differences between two related tree objects  since it can ignore any  entries with identical object names      Note  in the presence of submodules  trees may also have commits as entries  See the Submodules section      Note that the files all have mode 644 or 755  git actually only pays attention to the executable bit     Commit Object    The  commit  object links a physical state of a tree with a description of how we got there and why     ae668         You can use the   pretty raw option to git show or git log to examine your favorite commit       git show  s   pretty raw 2be7fcb476  commit 2be7fcb4764f2dbcee52635b91f edb1b3dcf7ab4    Git Community Book    tree fb3a8bddQceddd019615af4d57a53f43d8cee2bf   parent 257a84d9d02e90447b149af58b271c194 5edb6a   author Dave Watson  lt dwatson mimvista com gt  1187576872  0400  committer Junio C Hamano  lt gitster pobox com gt  1187591163  0700    Fix m
61. ll  or by a fetch followed by a  rebase  see the  lt  lt setting up a shared repository next section gt  gt  and gitcvs migration for more     GIT TAG    Lightweight Tags  We can create a tag to refer to a particular commit by running git tag with no arguments     git tag stable 1 1b2e1d63ff    After that  we can use stable   to refer to the commit   b2eld63ff     Chapter 3  Basic Usage    This creates a  lightweight  tag  basically a branch that never moves  If you would also like to include a comment with the  tag  and possibly sign it cryptographically  then we can create a tag object instead   Tag Objects    If one of  a   s  or  u  lt key id gt  is passed  the command creates a tag object  and requires the tag message  Unless  m or   F is given  an editor is started for the user to type in the tag message     When this happens  a new object is added to the Git object database and the tag ref points to that tag object  rather than  the commit itself  The strength of this is that you can sign the tag  so you can verify that it is the correct commit later  You  can create a tag object like this       git tag  a stable 1 1b2e1d63ff  It is actually possible to tag any object  but tagging commit objects is the most common   In the Linux kernel source  the  first tag object references a tree  rather than a commit   Signed Tags    If you have a GPG key setup  you can create signed tags fairly easily  First  you will probably want to setup your key id in  your  git config or   gi
62. ll show you changes in the working directory that are not yet staged for the next commit  If you want to see what  is staged for the next commit  you can run      git diff   cached    Chapter 3  Basic Usage    which will show you the difference between the index and your last commit  what you would be committing if you run  git  commit  without the   a  option  Lastly  you can run      git diff HEAD  which shows changes in the working directory since your last commit  what you would be committing if you run  git    commit  a      More Diff Options    If you want to see how your current working directory differs from the state of the project in another branch  you can run  something like      git diff test    This will show you what is different between your current working directory and the snapshot on the  test  branch  You  can also limit the comparison to a specific file or subdirectory by adding a path limiter       git diff HEAD      lib    That command will show the changes between your current working directory and the last commit  or  more accurately   the tip of the current branch   limiting the comparison to files in the  lib  subdirectory     If you don t want to see the whole patch  you can add the    stat  option  which will limit the output to the files that have  changed along with a little text graph depicting how many lines changed in each file       gt git diff   stat    Layout book_index_template  html l 8      text 05_Installing_Git 0_Source  markdown l 14
63. m  this article may be helpful     Article  Installing Git on Ubuntu    Mac 10 4  In both Mac 10 4 and 10 5  you can install Git via MacPorts  if you have that installed  If not  you can install it from here   Once MacPorts is installed  all you should have to do is     sudo port install git core  If you prefer to install from source  these articles may be helpful     Article  Installing Git on Tiger    20    Chapter 2  First Time    Article  Installing Git and git svn on Tiger from source    Mac 10 5    With Leopard  you can also install via MacPorts  but here you have the additional option of using a nice installer  which you  can download from here  Git OSX Installer    If you prefer to install it from source  these guides may be particularly helpful to you    Article  Installing Git on OSX Leopard    Article  Installing Git on OS 10 5    Windows  On Windows  installing Git is pretty easy  Simply download and install the msysGit package     See the Git on Windows chapter for a screencast demonstrating installing and using Git on Windows     SETUP AND INITIALIZATION    Git Config    The first thing you re going to want to do is set up your name and email address for Git to use to sign your commits     2l    Git Community Book      git config   global user name  Scott Chacon     git config   global user email  schacon gmail  com     That will set up a file in your home directory which may be used by any of your projects  By default that file is    gitconfig  and the contents
64. me   See  for example  the  M option to git diff      Chapter    Introduction    A commit is usually created by git commit  which creates a commit whose parent is normally the current HEAD  and  whose tree is taken from the content currently stored in the index     The Object Model    So  now that we ve looked at the 3 main object types  blob  tree and commit   let s take a quick look at how they all fit  together     If we had a simple project with the following directory structure       gt tree        README       lib  l   inc        tricks rb        mylib rb    2 directories  3 files    And we committed this to a Git repository  it would be represented like this     Git Community Book    98ca9      S    e8455    Co    bc52a      mylib rb       b70  8    Oadla         oe       You can see that we have created a tree object for each directory  including the root  and a blob object for each file   Then we have a commit object to point to the root  so we can track what our project looked like when it was  committed     Chapter    Introduction    Tag Object    49el1l1      tag  se    type  tagger    my tag message that explains  this tag       A tag object contains an object name  called simply  object    object type  tag name  the name of the person   tagger   who  created the tag  and a message  which may contain a signature  as can be seen using git cat file       git cat file tag v1 5 0   object 437b1b20df4b356c9342dac8d38849f24ef44f27   type commit   tag v1 5 0   tagger Ju
65. me  see the  SPECIFYING REVISIONS  section of git rev parse     Showing commits unique to a given branch    Suppose you would like to see all the commits reachable from the branch head named  master  but not from any other  head in your repository     We can list all the heads in this repository with git show ref       git show ref   heads   bf62196b5e363d73353a9dcf094c59595f3153b7 refs heads core tutorial  db768d5504c1bb46f63ee9d6e1772bd047e05bf9 refs heads maint  a 7157ac624b2524a059a3414e99f6F44bebc1e7 refs heads master  24dbc18 ea14dclaebeQ9f14c8ecf32010690627 refs heads tutorial 2  1e87486ae06626c2f31eaa63d26f cOfd646c8af2 refs heads tutorial fixes    We can get just the branch head names  and remove  master   with the help of the standard utilities cut and grep       git show ref   heads   cut  d     f2   grep  v  Arefs heads master   refs heads core tutorial  refs heads maint    refs heads tutorial 2  refs heads tutorial fixes    Git Community Book    112    And then we can ask to see all the commits reachable from master but not from these other heads       gitk master   not  C git show ref   heads   cut  d     f2      grep  v  Arefs heads master       Obviously  endless variations are possible  for example  to see all commits reachable from some head but not from any tag  in the repository       gitk  C git show ref   heads     not     git show ref   tags       See git rev parse for explanations of commit selecting syntax such as   not         update ref       THE GI
66. nio C Hamano  lt junkio cox net gt  1171411200  0000    GIT 1 5 0  ARAA BEGIN PGP SIGNATURE       Version  GnuPG v1 4 6  GNU Linux     iD8DBQBFOLGqwMbZpPMRmM5oRAURiAJ9ohBLd7s2kqjkKlq  1qqC57SbnmzQCdG4ui  nLE L9aUXdWeTFPron96DLA    2E 0    Git Community Book    See the git tag command to learn how to create and verify tag objects   Note that git tag can also be used to create   lightweight tags   which are not tag objects at all  but just simple references whose names begin with  refs tags        GIT DIRECTORY AND WORKING DIRECTORY    The Git Directory    The  git directory    is the directory that stores all Git s history and meta information for your project   including all of the  objects  commits  trees  blobs  tags   all of the pointers to where different branches are and more     There is only one Git Directory per project  as opposed to one per subdirectory like with SVN or CVS   and that  directory is  by default  though not necessarily    git  in the root of your project  If you look at the contents of that  directory  you can see all of your important files         objects       refs     your objects  commits  trees  blobs  tags   pointers to your branches      gt tree  L 1       HEAD   pointer to your current branch       config   your configuration preferences       description   description of your project       hooks    pre post action hooks       index   index file  see next section        logs    a history of where your branches have been           there may be
67. ntinue     FINDING ISSUES   GIT BLAME    The linkto git blame   command is really helpful for figuring out who changed which sections of a file  If you simple run    git  blame  filename   you ll get an output of the entire file with the last commit sha  date and author for every line in the file     85    Git Community Book      git blame shal_file c     fcfd16   Linus Torvalds 2005 04 18 13 04 43  0700 8  37   Ofcfd16   Linus Torvalds 2005 04 18 13 04 43  0700 9   include  cache h    1688557  Junio C Hamano 2005 06 27 03 35 33  0700 10   include  delta h    a733cb6   Linus Torvalds 2005 06 28 14 21 02  0700 11   include  pack h    8e440259  Peter Eriksen 2006 04 02 14 44 09  0200 12   include  blob h    8e440259  Peter Eriksen 2006 04 02 14 44 09  0200 13   include  commit h    8e440259  Peter Eriksen 2006 04 02 14 44 09  0200 14   include  tag h    8e440259  Peter Eriksen 2006 04 02 14 44 09  0200 15   include  tree h    f35a6d3b  Linus Torvalds 2007 04 09 21 20 29  0700 16   include  refs h    70f5d5d3  Nicolas Pitre 2008 02 28 00 25 19  0500 17   include     pack revindex h 628522ec  Junio C Hamano    This is often helpful if a file had a line reverted or a mistake that broke the build to help you see who changed that line last     You can also specify a start and end line for the blame       gt git blame  L 160  10 shal_file c    ace1534d  Junio C Hamano 2005 05 07 00 38 04  0700 160     ace1534d  Junio C Hamano 2005 05 07 00 38 04  0700 161    Ofcfd160  Linus Torvalds 
68. objects in it     This entire process is accomplished through the git send pack command on the client  which is invoked by git push and the  git receive pack command on the server side  which is invoked by the ssh connect process or git daemon  if it s an open  push server      129    
69. om gt  1220463037  0700  added chapters on private repo setup  scm migration  raw git  So now it fetches the tree aa176fb8   GET  git myproject git objects aa 176fb83a47d00386be237b450fb9dfb5be251a   200  which looks like this   100644 blob 6ff87c4664981e4397625791c8ea3bbb5F2279a3 COPYING  100644 blob 97b51a6d3685b093cfb345c9e79516e5099a13fb README  100644 blob 9d1b23b8660817e4074006f15 fae8 amp 6e2a508c573 Rakefile  So then it fetches those objects   GET  git myproject git objects 6f f87c4664981e4397625791c8ea3bbb5f2279a3   200    GET  git myproject git objects 97 b51a6d3685b093cfb345c9e79516e5099a13fb   200  GET  git myproject git objects 9d 1b23b8660817e4a74006F15fae8 amp 6e2a508c573   200    125    Git Community Book    126    It actually does this with Curl  and can open up multiple parallel threads to speed up this process  When it s done recursing  the tree pointed to by the commit  it fetches the next parent     GET  git myproject git objects bd 71cad2d597d0f1827d4a3f67bb96a646FO2889   200  Now in this case  the commit that comes back looks like this     tree b4cc0Ocf8546edd4fcf29defc3aec14de53e6cf8   parent ab04d884140f 7b0cf8 amp bbf86d6883869F16a46f65   author Scott Chacon  lt schacon gmail com gt  1220421161  0700  committer Scott Chacon  lt schacon gmail com gt  1220421161  0700    added chapters on the packfile and how git stores objects    and we can see that the parent  ab04d88 is where our master branch is currently pointing  So  we recursively fetch this  tr
70. on t use very  often  but can be very helpful in certain situations  Learning these commands should round out your day to day git  knowledge  you will be a master of the Git     Now that you know Git  we will then cover Working with Git  Here we will go over how to use Git in scripts  with  deployment tools  with editors and more  These sections are meant to help you integrate Git into your environment     Lastly  we will have a series of articles on low level documentation that may help the Git hackers who want to learn  how the actual internals and protocols work in Git     Feedback and Contributing    At any point  if you see a mistake or want to contribute to the book  you can send me an email at schacon gmail com  or  you can clone the source of this book at http   github com schacon gitscm and send me a patch or a pull request     References    Much of this book is pulled together from different sources and then added to   If you would like to read some of the original articles or resources  please visit them and thank the authors     e Git User Manual  e The Git Tutorial  e The Git Tutorial pt 2    Chapter    Introduction    e  My Git Workflow  blog post    THE GIT OBJECT MODEL    The SHA    All the information needed to represent the history of a project is stored in files referenced by a 40 digit  object name   that looks something like this     6f   87c4664981e4397625791c8ea3bbb5f2279a3    You will see these 40 character strings all over the place in Git  In each ca
71. op on a branch crazy idea  then regret it  you can always delete the branch with    git branch  D crazy idea    Branches are cheap and easy  so this is a good way to try something out     How to merge    You can rejoin two diverging branches of development using git merge       git merge branchname    Chapter 3  Basic Usage    merges the changes made in the branch  branchname  into the current branch  If there are conflicts  for example  if the  same file is modified in two different ways in the remote branch and the local branch  then you are warned  the output  may look something like this       git merge next  100   4 4  done  Auto merged file txt  CONFLICT Ccontent   Merge conflict in file txt  Automatic merge failed  fix conflicts and then commit the result     Conflict markers are left in the problematic files  and after you resolve the conflicts manually  you can update the index  with the contents and run git commit  as you normally would when modifying a file     If you examine the resulting commit using gitk  you will see that it has two parents  one pointing to the top of the current  branch  and one to the top of the other branch   Resolving a merge    When a merge isn t resolved automatically  git leaves the index and the working tree in a special state that gives you all the  information you need to help resolve the merge     Files with conflicts are marked specially in the index  so until you resolve the problem and update the index  git commit  will fail      
72. ored in the created tree object  but it can be used to determine quickly which files  in the working directory differ from what was stored in the index  and thus save git from having to read all of the  data from such files to look for changes     It can efficiently represent information about merge conflicts between different tree objects  allowing each  pathname to be associated with sufficient information about the trees involved that you can create a three way  merge between them     We saw in  lt  lt conflict resolution gt  gt  that during a merge the index can store multiple versions of a single file   called  stages    The third column in the git Is files output above is the stage number  and will take on values  other than 0 for files with merge conflicts     The index is thus a sort of temporary staging area  which is filled with a tree which you are in the process of working on     113    Git Community Book    114    THE PACKFILE    This chapter explains in detail  down to the bits  how the packfile and pack index files are formatted     The Packfile Index  First off  we have the packfile index  which is basically just a series of bookmarks into a packfile     There are two versions of the packfile index   version one  which is the default in versions of Git earlier than 1 6  and  version two  which is the default from 1 6 forward  but which can be read by Git versions going back to 1 5 2  and has been  further backported to 1 4 4 5 if you are still on the 1 4 serie
73. ou can go back and modify the old commit  You should never do this if you have already made the history  public  git does not normally expect the  history  of a project to change  and cannot correctly perform repeated  merges from a branch that has had its history changed     Fixing a mistake with a new commit    Creating a new commit that reverts an earlier change is very easy  just pass the git revert command a reference to the bad  commit  for example  to revert the most recent commit       git revert HEAD    This will create a new commit which undoes the change in HEAD  You will be given a chance to edit the commit message  for the new commit     You can also revert an earlier change  for example  the next to last     git revert HEADA    In this case git will attempt to undo the old change while leaving intact any changes made since then  If more recent  changes overlap with the changes to be reverted  then you will be asked to fix conflicts manually  just as in the case of  resolving a merge     73    Git Community Book    74    Fixing a mistake by modifying a commit    If you have just committed something but realize you need to fix up that commit  recent versions of git commit support an    amend flag which instructs git to replace the HEAD commit with a new one  based on the current contents of the  index  This gives you an opportunity to add files that you forgot to add or correct typos in a commit message  prior to  pushing the change out for the world to see     If
74. ourself typing all 40 hex digits       git cat file  t 54196cc2    commit    git cat file commit 54196cc2    107    Git Community Book    108    tree 92b8b694ffb1675e5975148e1121810081dbdffe   author J  Bruce Fields  lt bfields puzzle fieldses org gt  1143414668  0500  committer J  Bruce Fields  lt bfields puzzle fieldses org gt  1143414668  0500  initial commit    A tree can refer to one or more  blob  objects  each corresponding to a file  In addition  a tree can also refer to other  tree objects  thus creating a directory hierarchy  You can examine the contents of any tree using Is tree  remember that a  long enough initial portion of the SHAI will also work        git ls tree 92b8b694  100644 blob 3b18e512dba79e4c8300dd08aeb37f8e728b8dad file txt    Thus we see that this tree has one file in it  The SHAI hash is a reference to that file s data       git cat file  t 3b18e512  blob    A  blob  is just file data  which we can also examine with cat file       git cat file blob 3b18e512  hello world    Note that this is the old file data  so the object that git named in its response to the initial tree was a tree with a snapshot  of the directory state that was recorded by the first commit     All of these objects are stored under their SHAI names inside the git directory       find  git objects    git objects    git objects pack    Chapter 7  Internals and Plumbing     git objects info    git objects 3b   git objects 3b 18e512dba79e4c8300dd08aeb37 f 8e728b8dad   git objects 9
75. pdate the  public repository with the latest changes created in your private repository     The simplest way to do this is using git push and ssh  to update the remote branch named  master  with the latest state of    your branch named  master   run     git push ssh   yourserver com  you proj git master master  or just     git push ssh   yourserver com  you proj git master    As with git fetch  git push will complain if this does not result in a  lt  lt fast forwards fast forward gt  gt   see the following    section for details on handling this case     44    Chapter 3  Basic Usage    Note that the target of a  push  is normally a  lt  lt defbarerepository bare gt  gt  repository  You can also push to a repository  that has a checked out working tree  but the working tree will not be updated by the push  This may lead to unexpected  results if the branch you push to is the currently checked out branch     As with git fetch  you may also set up configuration options to save typing  so  for example  after    cat  gt  gt  git config  lt  lt EOF   remote  public repo     url   ssh   yourserver com  you proj git  EOF  you should be able to perform the above push with just      git push public repo master    See the explanations of the remote  url  branch  remote  and remote  push options in git config for details     What to do when a push fails  If a push would not result in a  lt  lt fast forwards fast forward gt  gt  of the remote branch  then it will fail with an error like  
76. rged files using external tools such as emacs or kdiff3     Each time you resolve the conflicts in a file and update the index     git add file txt    the different stages of that file will be  collapsed   after which git diff will  by default  no longer show diffs for that file     Multiway Merge    You can merge several heads at one time by simply listing them on the same git merge command  For instance       git merge scott master rick master tom master    Chapter 5  Advanced Git    is the equivalent of       git merge scott master    git merge rick master    git merge tom master    Subtree    There are situations where you want to include contents in your project from an independently developed project  You  can just pull from the other project as long as there are no conflicting paths     The problematic case is when there are conflicting files  Potential candidates are Makefiles and other standard filenames   You could merge these files but probably you do not want to  A better solution for this problem can be to merge the  project as its own subdirectory  This is not supported by the recursive merge strategy  so just pulling won t work     What you want is the subtree merge strategy  which helps you in such a situation     In this example  let s say you have the repository at  path to B  but it can be an URL as well  if you want   You want to  merge the master branch of that repository to the dir B subdirectory in your current branch     Here is the command sequence yo
77. ries of patches  Just  save all of the patch containing messages  in order  into a single mailbox file  say  patches mbox   then run      git am  3 patches mbox    Git will apply each patch in order  if any conflicts are found  it will stop  and you can fix the conflicts as described in    lt  lt resolving a merge Resolving a merge gt  gt     The   3  option tells git to perform a merge  if you would prefer it just to  abort and leave your tree and index untouched  you may omit that option      87    Git Community Book    Once the index is updated with the results of the conflict resolution  instead of creating a new commit  just run    git am   resolved  and git will create the commit for you and continue applying the remaining patches from the mailbox     The final result will be a series of commits  one for each patch in the original mailbox  with authorship and commit log  message each taken from the message containing each patch     CUSTOMIZING GIT    git config    Changing your Editor      git config   global core editor emacs    Adding Aliases    git config   global alias last  cat file commit HEAD     git last  tree c85fbd1996b8e7e5eda1288b56042c0cdb91836b  parent cdc9a0a28173b6ba4aca00eb34f5aabb39980735  author Scott Chacon  lt schacon gmail com gt  1220473867  0700  committer Scott Chacon  lt schacon gmail com gt  1220473867  0700    fixed a weird formatting problem    88      git cat file commit HEAD   tree c85fbd1996b8e7e5eda1288b56042c0cdb91836b   parent cdc9a0a2
78. s     Version 2 also includes a CRC checksum of each object so compressed data can be copied directly from pack to pack  during repacking without undetected data corruption  Version 2 indexes can also handle packfiles larger than 4 Gb     Chapter 7  Internals and Plumbing    objects pack pack 4eb8b   c5 idx    Version     Version 2  peine header  0002 2 x 4 bytes  fanout table  256 x 4 bytes    fanout table    fanout 255    gt  size 256 x 4 bytes    fanout 255    gt  size    sha listing   size  x 20 bytes    J        i  l       offset   shas table   size  x  20   4  bytes        size  x 4 bytes    packfile checksum SHA1   trailer    2 x 20 bytes    idxfile checksum SHA1    packfile offsets   size  x 4 bytes    large packfile offsets  N x 8 bytes    N is number of 4 byte offsets  that have the high bit set    this group only appears in indices  of packfiles larger than 2G    trailer  2 x 20 bytes       In both formats  the fanout table is simply a way to find the offset of a particular sha faster within the index file  The offset   shal    tables are sorted by shal    values  this is to allow binary search of this table   and fanout   table points at the offset     115    Git Community Book    116    shal    table in a specific way  so that part of the latter table that covers all hashes that start with a given byte can be found  to avoid 8 iterations of the binary search      In version I  the offsets and shas are in the same space  where in version two  there are seperate ta
79. se the name is calculated by taking the SHAI  hash of the contents of the object  The SHAI hash is a cryptographic hash function  What that means to us is that it is  virtually impossible to find two different objects with the same name  This has a number of advantages  among others     e Git can quickly determine whether two objects are identical or not  just by comparing names    e Since object names are computed the same way in every repository  the same content stored in two repositories  will always be stored under the same name    e Git can detect errors when it reads an object  by checking that the object s name is still the SHAI hash of its  contents     The Objects    Every object consists of three things   a type  a size and content  The size is simply the size of the contents  the    contents depend on what type of object it is  and there are four different types of objects   blob    tree    commit   and    tag      Git Community Book        A   blob    is used to store file data   it is generally a file    e A  tree  is basically like a directory   it references a bunch of other trees and or blobs  i e  files and sub   directories    e A   commit       points to a single tree  marking it as what the project looked like at a certain point in time  It  contains meta information about that point in time  such as a timestamp  the author of the changes since the last  commit  a pointer to the previous commit s   etc    e A   tag    is a way to mark a specific commit as
80. sect   This  branch points to a commit  with commit id 65934     that is reachable from  master  but not from v2 6 18  Compile and  test it  and see whether it crashes  Assume it does crash  Then       git bisect bad  Bisecting  1769 revisions left to test after this   7ef f82c8b1511017ae605f0c99ac275a7e21b867  i2c core  Drop useless bitmaskings    Chapter 5  Advanced Git    checks out an older version  Continue like this  telling git at each stage whether the version it gives you is good or bad  and  notice that the number of revisions left to test is cut approximately in half each time     After about 13 tests  in this case   it will output the commit id of the guilty commit  You can then examine the commit  with git show  find out who wrote it  and mail them your bug report with the commit id  Finally  run      git bisect reset  to return you to the branch you were on before and delete the temporary  bisect  branch     Note that the version which git bisect checks out for you at each point is just a suggestion  and you re free to try a  different version if you think it would be a good idea  For example  occasionally you may land on a commit that broke  something unrelated  run      git bisect visualize    which will run gitk and label the commit it chose with a marker that says  bisect   Choose a safe looking commit nearby   note its commit id  and check it out with       git reset   hard fb47ddb2db       then test  run  bisect good  or  bisect bad  as appropriate  and co
81. st they may take up a little extra disk space  They can sometimes provide a  last resort method for recovering lost work     SETTING UP A PUBLIC REPOSITORY    Assume your personal repository is in the directory   proj  We first create a new clone of the repository and tell git   daemon that it is meant to be public       git clone   bare   proj proj git    touch proj git git daemon export ok    The resulting directory proj git contains a  bare  git repository  it is just the contents of the   git  directory  without any  files checked out around it     75    Git Community Book    76    Next  copy proj git to the server where you plan to host the public repository  You can use scp  rsync  or whatever is  most convenient    Exporting a git repository via the git protocol   This is the preferred method     If someone else administers the server  they should tell you what directory to put the repository in  and what git    URL it  will appear at     Otherwise  all you need to do is start git daemon  it will listen on port 9418  By default  it will allow access to any  directory that looks like a git directory and contains the magic file git daemon export ok  Passing some directory paths as  git daemon arguments will further restrict the exports to those paths     You can also run git daemon as an inetd service  see the git daemon man page for details   See especially the examples  section    Exporting a git repository via http    The git protocol gives better performance and reli
82. t   the particular order that commits are listed in may be somewhat arbitrary     If you want to specify a certain order  you can add an ordering option to the git log command     By default  the commits are shown in reverse chronological order     35    Git Community Book    However  you can also specify    topo order     which makes the commits appear in topological order  i e  descendant  commits are shown before their parents   If we view the git log for the Grit repo in topo order  you can see that the  development lines are all grouped together       git log   pretty format   h    s    topo order   graph    4a904d7   Merge branch    idx2     N  X       9d6d250         cec36f7      decfe7b      cd27d57      823a9d9    t   oe    a  a             x     E       eH HH He          36      Aeb3b FO      d065e76    3fa3284    d 1icffd    7c74272    13f8cc3    Q6bae5a    Ob5bedf    d40e1f      ef8a23c    15dd347    3dabb  a    eacic37    Qa7d387    4d6b69c        dfeffce   merged in bryces changes and fixed some testing issues      23f4ecf   Clarify how to get a full count out of Repo commits    Appropriate time zone test fix from halorgium    Fix the to_hash test to run in US Pacific time   fixed manifest and grit rb to make correct gemspec  added lib grit commit_stats rb to the big list o  files  cleared out errors by adding in Grit  Git run method  resolved merge conflicts  hopefully amicably    empty commit to push project to runcoderun   whitespace   whitespace   oops  upda
83. t clone myserver com  opt git myrepo git    77    Git Community Book    Which will simply prompt them for thier ssh password or use thier public key  however they have ssh authentication  setup     Multiple User Access using Gitosis    If you don t want to setup seperate accounts for every user  you can use a tool called Gitosis  In gitosis  there is an  authorized_keys file that contains the public keys of everyone authorized to access the repository  and then everyone uses  the  git  user to do pushes and pulls     Installing and Setting up Gitosis    78    Chapter 5  Advanced Git    Chapter 5    Advanced Git    CREATING NEW EMPTY BRANCHES    Ocasionally  you may want to keep branches in your repository that do not share an ancestor with your normal code   Some examples of this might be generated documentation or something along those lines  If you want to create a new  branch head that does not use your current codebase as a parent  you can create an empty branch like this     git symbolic ref HEAD refs heads newbranch  rm  git index   git clean  fdx    lt do work gt    git add your files   git commit  m    Initial commit       79    Git Community Book    MODIFYING YOUR HISTORY    Interactive rebasing is a good way to modify individual commits     git filter branch is a good way to edit commits en masse     ADVANCED BRANCHING AND MERGING    Getting conflict resolution help during a merge    All of the changes that git was able to merge automatically are already added to th
84. t provides multiple methods for fixing up mistakes as you are developing  Selecting an appropriate method depends on  whether or not you have committed the mistake  and if you have committed the mistake  whether you have shared the  erroneous commit with anyone else     Fixing un committed mistakes    If you ve messed up the working tree  but haven t yet committed your mistake  you can return the entire working tree to  the last committed state with      git reset   hard HEAD    This will throw away any changes you may have added to the git index and as well as any outstanding changes you have in  your working tree  In other words  it causes the results of  git diff  and  git diff   cached  to both be empty     If you just want to restore just one file  say your hello rb  use git checkout instead      git checkout    hello rb    git checkout HEAD hello rb    The first command restores hello rb to the version in the index  so that  git diff hello rb  returns no differences  The  second command will restore hello rb to the version in the HEAD revision  so that both  git diff hello rb  and  git diff     cached hello rb  return no differences     Chapter 4  Intermediate Usage    Fixing committed mistakes  If you make a commit that you later wish you hadn t  there are two fundamentally different ways to fix the problem     I  You can create a new commit that undoes whatever was done by the old commit  This is the correct thing if  your mistake has already been made public     2  Y
85. tconfig file      user   sSigningkey    lt gpg key id gt     You can also set that with      git config    global  user signingkey  lt gpg key id gt     47    Git Community Book    Now you can create a signed tag simply by replacing the  a with a  s     git tag  s stable 1 1b2e1d63ff  If you don t have your GPG key in your config file  you can accomplish the same thing this way       git tag  u  lt gpg key id gt  stable 1 1b2e1d63ff    48    Chapter 4    Chapter 4  Intermediate Usage    Intermediate Usage    IGNORING FILES    A project will often generate files that you do  not  want to track with git  This typically includes files generated by a build  process or temporary backup files made by your editor  Of course   not  tracking files with git is just a matter of  not   calling  git add  on them  But it quickly becomes annoying to have these untracked files lying around  e g  they make  git  add    and  git commit  a  practically useless  and they keep showing up in the output of  git status      You can tell git to ignore certain files by creating a file called  gitignore in the top level of your working directory  with    contents such as       Lines starting with     are considered comments     Ignore any file named foo txt    foo txt     Ignore  generated  html files     49    Git Community Book    50    shtml      except foo html which is maintained by hand     foo  html     Ignore objects and archives       oa     See gitignore for a detailed explanation of the synt
86. te ref refs blametree  ref  path  newrev   done  done    Client Side Hooks    Pre Commit  Running your tests automatically before you commit  GIT_DIR hooks pre commit  Here is an example of a Ruby script that runs RSpec tests before allowing a commit     html_path    spec_results html    spec  f h   html_path   f p spec      run the spec  send progress to screen  save html results to      find out how many errors were found   html   openChtml_path   read   examples   htmL match    d   examples      to_i rescue    failures   html match  C d   failures   0  to_i rescue    pending   html  match    d   pending      to_i rescue      if failures zero    puts  Q failures    examples  run    pending  pending   else   puts   aDID NOT COMMIT YOUR FILES      9l    Git Community Book    92    puts  View spec results at   File expand_pathChtml_path     puts  puts    failures  failures    examples  run    pending  pending   exit 1  end    e http   probablycorey wordpress com 2008 03 07 git hooks make me giddy     RECOVERING CORRUPTED OBJECTS    Recovering Lost Commits Blog Post    Recovering Corrupted Blobs by Linus    SUBMODULES    Large projects are often composed of smaller  self contained modules  For example  an embedded Linux distribution s  source tree would include every piece of software in the distribution with some local modifications  a movie player might  need to build against a specific  known working version of a decompression library  several independent programs might all 
87. te version here too   push 0 8 3   capture stderr and log it if debug is true when running commands  update history   some docs   update gemspec to include the newly added files to manifest   add missing files to manifest  add grit test   allow sending debug messages to a user defined Logger if provided  tes  pull out the date in this assertion and compare as xmlschemaw  to avoi  Removed debug print    Fixed to close opened file description     Chapter 3  Basic Usage    You can also use    date order     which orders the commits primarily by commit date  This option is similar to   topo order  in the sense that no parent comes before all of its children  but otherwise things are still ordered in the commit timestamp  order  You can see that development lines are not grouped together here  that they jump around as parallel development  occurred       git log   pretty format   h    s    date order   graph    4a904d7   Merge branch    idx2        X      8la3e  d   updated packfile code to recognize index v2    dfeffce   merged in bryces changes and fixed some testing issues  I       c615d80   fixed a log issue  ff    23f4ecf   Clarify how to get a full count out of Repo commits    9d6d250   Appropriate time zone test fix from halorgium  INX      decfe7b   fixed manifest and grit rb to make correct gemspec      cd27d57   added lib grit commit_stats rb to the big list o  file      823a9d9   cleared out errors by adding in Grit  Git run method  z 4eb3bf     resolved merge conflicts
88. ted correctly    This reverts commit fc62e5543b195f18391886b9f663d5a7eca38e84     Once you have edited that down into once commit message and exit the editor  the commit will be saved with your new  message     58    Chapter 4  Intermediate Usage    If  edit  is specified  it will do the same thing  but then pause before moving on to the next one and drop you into the  command line so you can amend the commit  or change the commit contents somehow     If you wanted to split a commit  for instance  you would specify  edit  for that commit     pick fc62e55 added file_size   pick  9824bf4 fixed Little thing   edit 21d80a5 added number to log   pick 76b9da6 added the apply command   pick c264051 Revert  added file_size    not implemented correctly    And then when you get to the command line  you revert that commit and create two  or more  new ones  Lets say  21d80a5 modified two files  file  and file2  and you wanted to split them into seperate commits  You could do this after the  rebase dropped you to the command line        git reset HEADA     git add filel     git commit  first part of split commit     git add file2     git commit  second part of split commit     git rebase   continue    And now instead of 5 commits  you would have 6     The last useful thing that interactive rebase can do is drop commits for you  If instead of choosing    pick        squash    or    edit     for the commit line  you simply remove the line  it will remove the commit from the history     59  
89. ter 4  Intermediate Usage    Update gt  gt  1 4    staged unstaged path   i unchanged  4  0 assets stylesheets style css  Eoi unchanged  23  11 layout book_index_template html   3  unchanged  7  7 layout chapter_template html    4  unchanged  3  3 script pdf rb  5  unchanged  121  0 text 14_Interactive_Rebasing  _ Interactive_Rebasing markdown  Update gt  gt     If   hit enter    will be taken back to the main menu where   can see that the file status has changed     What now gt  status    staged unstaged path  1  4  0 nothing assets stylesheets style css  2  23  11 nothing layout book_index_template html  3   7  7 nothing layout chapter_template html  4   3  3 nothing script pdf rb  5 unchanged  121  0 text 14_Interactive_Rebasing  _ Interactive_Rebasing markdown    Now we can see the first four files are staged and the last one is still not  This is basically a compressed way to see the  same information we see when we run    git status    from the command line       git status     On branch master     Changes to be committed    Cuse  git reset HEAD  lt file gt        to unstage             modified  assets stylesheets style css     modified  lLayout book_index_template html    modified  Layout chapter_tempLate  html     modified  script pdf  rb         Changed but not updated     6l    Git Community Book                  Cuse  git add  lt file gt        modified     to update what will be committed     text 14_Interactive_Rebasing  _ Interactive_Rebasing markdown    There 
90. u need       git remote add  f Bproject  path to B  1      git merge  s ours   no commit Bproject master  2      git read tree   prefix dir B   u Bproject master  3      git commit  m  Merge B project as our subdirectory   4     git pull  s subtree Bproject master  5     83    Git Community Book    84    The benefit of using subtree merge is that it requires less administrative burden from the users of your repository  It  works with older  before Git v1 5 2  clients and you have the code right after clone     However if you use submodules then you can choose not to transfer the submodule objects  This may be a problem with  the subtree merge     Also  in case you make changes to the other project  it is easier to submit changes if you just use submodules      from Using Subtree Merge     FINDING ISSUES   GIT BISECT    Suppose version 2 6 18 of your project worked  but the version at  master  crashes  Sometimes the best way to find the  cause of such a regression is to perform a brute force search through the project s history to find the particular commit  that caused the problem  The git bisect command can help you do this       git bisect start     git bisect good v2 6 18     git bisect bad master   Bisecting  3537 revisions left to test after this    6593409002 8b88e83e2b0F8b36618fe503349F8e  BLOCK  Make USB storage depend on SCSI rather than selecting it  try    If you run  git branch  at this point  you ll see that git has temporarily moved you to a new branch named  bi
91. us  we have a SHA  5bac6559  that points to it     Rearranging Trees    We can also do tree manipulation by combining trees into new structures using the index file  As a simple example  let s  take the tree we just created and make a new tree that has two copies of our 5bac6559 tree in it using a temporary index  file   You can do this by resetting the GITINDEXFILE environment variable or on the command line     First  we read the tree into our index file under a new prefix using the git read tree command  and then write the index  contents as a tree using the git write tree command       export GIT_INDEX_FILE  tmp index     git read tree   prefix copy1  5bac6559    git read tree   prefix copy2  5bac6559    git write tree  bb2fa6de7625322322382215d9ea78cfe76508c1      gt git ls tree bb2fa    040000 tree 5bac6559179bd543a024d6d187692343e2d8ae83 copy1  040000 tree 5bac6559179bd543a024d6d187692343e2d8ae83 copy2    So now we can see that we ve created a new tree just from index manipulation  You can also do interesting merge  operations and such in a temporary index this way   see the git read tree docs for more information     122    Chapter 7  Internals and Plumbing    Creating Commits    Now that we have a tree SHA  we can create a commit object that points to it  We can do this using the git commit tree  command  Most of the data that goes into the commit has to be set as environment variables  so you ll want to set the  following     GIT_AUTHOR_NAME  GIT_AUTHOR_EMATL  GIT_A
92. very single revision one by  one     Importing Perforce    In contrib fast import you will find the git p4 script  which is a Python script that will import a Perforce repository for you         git git contrib fast import git p4 clone   depot project main all myproject    Chapter 6  Working with Git    Importing Others   These are other SCMs that listed high on the Git Survey  should find import docs for them    TODO    e CVS  e Mercurial  hg   e Bazaar NG    e Darcs  e ClearCase    GRAPHICAL GIT    Git has a couple of fairly popular Graphial User Interfaces that can read and or maniplulate Git repositories     Bundled GUIs    Git comes with two major GUI programs written in Tcl Tk  Gitk is a repository browser and commit history visualization  tool     gitk    git gui is a tool that helps you visualize the index operations  like add  remove and commit  It won t do everything you can  do on the command line  but for many of the basic operations  it s pretty good     10     Git Community Book    102    git gui    Third Party Projects  For Mac users  there is GitNub    For Linux or other Qt users  there is QGit    HOSTED GIT  github    repoorcz    ALTERNATIVE USES  ContentDistribution    TicGit    SCRIPTING AND GIT    Ruby and Git  grit    jgit   jruby    PHP and Git    Python and Git    pygit    Perl and Git    perlgit    GIT AND EDITORS    textmate    eclipse    Chapter 6  Working with Git    103    Git Community Book    netbeans    104    Chapter 7  Internals and Plumbing  
93. y a single     or      it now uses two columns  the first column is used for differences  between the first parent and the working directory copy  and the second for differences between the second parent and  the working directory copy   See the  COMBINED DIFF FORMAT  section of git diff files for a details of the format      After resolving the conflict in the obvious way  but before updating the index   the diff will look like       git diff   diff   cc file txt   index 802992c 2b60207    0000000      a file txt       b file txt        1 1  1 1  1 1         Hello world    Goodbye     Goodbye world    This shows that our resolved version deleted  Hello world  from the first parent  deleted  Goodbye  from the second  parent  and added  Goodbye world   which was previously absent from both     8l    Git Community Book    82    Some special diff options allow diffing the working directory against any of these stages       git diff  1 file txt   diff against stage 1    git diff   base file txt   same as the above    git diff  2 file txt   diff against stage 2    git diff   ours file txt   same as the above    git diff  3 file txt   diff against stage 3      git diff   theirs file txt   same as the above   The git log and gitk commands also provide special help for merges       git log   merge    gitk   merge    These will display all commits which exist only on HEAD or on MERGE_HEAD  and which touch an unmerged file   You may also use git mergetool  which lets you merge the unme
    
Download Pdf Manuals
 
 
    
Related Search
    
Related Contents
SPECTRACOOL Slim Fit MODE D`EMPLOI  INFORMATIONS    Analyse Opé triangle jaune  Clique aqui para acessar o manual  Tout-en-un HP Color LaserJet série 2800 Imprimante / télécopieur1      TVA2020 - User Manual  Manual del usuario de Profesor 2000.    Copyright © All rights reserved. 
   Failed to retrieve file