0
Smacking Git Around
      by Scott Chacon
Me
Scott Chacon
github.com/schacon
“Scott Chacon has an
understandable but borderline
unhealthy obsession with Git”
                  - Ilya Grigorik
       ...
git-scm.com
book.git-scm.com
schacon@gmail.com
</me>
previously, on Git...
GIT
Git
image by matthew mccullough
Scott Chacon
Scott   Scott Chacon
                         is a Git




 v1         v2             v3
98ca9..                        34ac2..                     f30ab..
commit                         commit                  ...
98ca9..
                                                                  e8455..
commit                size
             ...
98ca9..
                                                                  e8455..
commit                size
             ...
0de24..
     22d8858e8513666bf91b82bd2939ec7b0d1974da
stable           master




98ca9    34ac2   f30ab




         a23fe   3acd1




                 topic
stable           master




98ca9    34ac2   f30ab




         a23fe   3acd1




                 topic
stable           master




98ca9    34ac2   f30ab




         a23fe   3acd1




                 topic
stable           master




98ca9    34ac2   f30ab




         a23fe   3acd1




                 topic
$ time git checkout -b newbranch
Switched to a new branch quot;newbranchquot;

real	 0m0.040s
user	 0m0.003s
sys	0m0.008s
$ time git checkout -b newbranch
Switched to a new branch quot;newbranchquot;

real	 0m0.040s
user	 0m0.003s
sys	0m0.008s
master




develop




topic
distributed
development


          image by matthew mccullough
ccf03da00eca1b60a489354c1278c27f1fbc55dc
a640106f173c5be59ed5757cf33f568b3e10994f
c51a137df64b8ed2f8d84ad62df7b49b1c409906...
C
fast
efficient
100k repos
80k users
</git-recap>
Git Tips and Tricks
Tips and Tricks
Selection and Ranges

   Data Munging

     Debugging

    Customizing
Selection and Ranges
Revision Selection
Revision Selection
  alternate ways to refer to
 objects or ranges of objects
Revision Selection
        full sha-1
       partial sha-1
    branch or tag name
       caret parent
        tilde spec
 ...
Full SHA1
6e453f523fa1da50ecb04431101112b3611c6a4d
Partial SHA1
6e453f523fa1da50ecb04431101112b3611c6a4d

6e453f523fa1da50

6e453
Branch, Remote
  or Tag Name
     v1.0
    default
   m/cupcake
Caret Parent

   default^2

2nd parent of ‘default’
b3be1      a09c6      df2fa   c36ae




5ec47   ce0e4      2f45e      4eadf   2fbb3    18cae



                jess/maste...
master^
        b3be1      a09c6      df2fa   c36ae




5ec47   ce0e4      2f45e      4eadf   2fbb3    18cae



          ...
master^2
        b3be1      a09c6      df2fa   c36ae




5ec47   ce0e4      2f45e      4eadf   2fbb3    18cae



         ...
Tilde Spec

    default~2

grandparent of ‘default’
 (parent of the parent)
master~2
        b3be1      a09c6      df2fa   c36ae




5ec47   ce0e4      2f45e      4eadf   2fbb3    18cae



         ...
master^^^2
           master~2^2
        b3be1      a09c6      df2fa   c36ae




5ec47   ce0e4      2f45e      4eadf   2fb...
master^^^2
           master~2^2
        b3be1      a09c6      df2fa   c36ae




5ec47   ce0e4      2f45e      4eadf   2fb...
master^^^2
           master~2^2
        b3be1      a09c6      df2fa   c36ae




5ec47   ce0e4      2f45e      4eadf   2fb...
Blob Spec

default:path/to/file

blob of that file in ‘default’ commit
Relative Specs

   master@{yesterday}

the commit ‘master’ was at yesterday
Relative Specs

           master@{5}

the 5th prior value of ‘master’ (locally)
Ranges
Ranges

      ce0e4..e4272

every commit reachable by e4272
  that is not reachable by ce034
Ranges

      [old]..[new]

every commit reachable by [new]
  that is not reachable by [old]
Ranges

      ce0e4..

everything since a commit
“Reachability”
jess/master..master
        b3be1      a09c6      df2fa   c36ae




5ec47   ce0e4      2f45e      4eadf   2fbb3    18cae

...
jess/master..master
        b3be1      a09c6      df2fa   c36ae




5ec47   ce0e4      2f45e      4eadf   2fbb3    18cae

...
jess/master..master
        b3be1      a09c6      df2fa   c36ae




5ec47   ce0e4      2f45e      4eadf   2fbb3    18cae

...
jess/master..master
        b3be1      a09c6      df2fa   c36ae




5ec47   ce0e4      2f45e      4eadf   2fbb3    18cae

...
jess/master..master
        b3be1      a09c6      df2fa   c36ae




5ec47   ce0e4      2f45e      4eadf   2fbb3    18cae

...
jess/master..master
        b3be1      a09c6      df2fa   c36ae




5ec47   ce0e4      2f45e      4eadf   2fbb3    18cae

...
jess/master..master
        b3be1      a09c6      df2fa   c36ae




5ec47   ce0e4      2f45e      4eadf   2fbb3    18cae

...
jess/master..master
        b3be1      a09c6      df2fa   c36ae




5ec47   ce0e4      2f45e      4eadf   2fbb3    18cae

...
jess/master..c36ae
         b3be1      a09c6      df2fa   c36ae




5ec47    ce0e4      2f45e      4eadf   2fbb3    18cae
...
jess/master..c36ae
         b3be1      a09c6      df2fa   c36ae




5ec47    ce0e4      2f45e      4eadf   2fbb3    18cae
...
jess/master..c36ae
         b3be1      a09c6      df2fa   c36ae




5ec47    ce0e4      2f45e      4eadf   2fbb3    18cae
...
jess/master..c36ae
         b3be1      a09c6      df2fa   c36ae




5ec47    ce0e4      2f45e      4eadf   2fbb3    18cae
...
Advanced Log
Log Subsets
what am I going to
      push?
git log origin/master..
C1
origin/master        master   HEAD




                C0
C4   master   HEAD




                     C3




                     C2




                C1
origin/master




      ...
C7   C4
origin/master                  master   HEAD




                C6   C3




                C5   C2




         ...
C7    C4
origin/master                 master   HEAD




                C6    C3




                C5    C2




       ...
C7   C4
origin/master               master   HEAD




                C6   C3




                C5   C2




            ...
C7   C4
origin/master               master   HEAD




                C6   C3




                C5   C2




            ...
C7   C4
origin/master               master   HEAD




                C6   C3




                C5   C2




            ...
C7   C4
origin/master               master   HEAD




                C6   C3




                C5   C2




            ...
commit 72d404debaa804fca82fd9cf710fbde48c7305c6
Author: Shawn O. Pearce <spearce@spearce.org>
Date:   Sun Oct 12 13:13:59 ...
commit 72d404debaa804fca82fd9cf710fbde48c7305c6
C4   Author: Shawn O. Pearce <spearce@spearce.org>
     Date:   Sun Oct 12...
C7   C4
origin/master                master   HEAD




                C6   C3




                C5   C2




           ...
C7   C4
origin/master                master   HEAD




                C6   C3




                C5   C2




           ...
C7   C4
origin/master                 master   HEAD




                C6   C3




                C5   C2




          ...
git log origin/master..

git log origin/master..HEAD

git log origin/master..master

git log master ^origin/master

git lo...
git log HEAD ^origin/master
git log HEAD ^origin/master
git log master topic1 ^origin/master
origin/master



    C1



    C0
master



                 C3
origin/master



    C1



    C0
experiment


                           C10




                            C9




                            C8
        ...
experiment


                           C10
                master
origin/master


                            C9
    C7  ...
which changes aren’t in
     experiment?
git log origin/master master ^experiment

                                  experiment


                                 ...
git log origin/master master ^experiment

                                  experiment


                                 ...
git log origin/master master ^experiment

                                  experiment


                                 ...
git log origin/master master ^experiment

                                  experiment


                                 ...
git log origin/master master ^experiment

                                  experiment


                                 ...
git log origin/master master ^experiment

                                  experiment


                                 ...
git log origin/master master ^experiment

                                  experiment


                                 ...
git log --graph
git log --pretty=oneline --graph
gitk
gitk 6d13f..41aba
Revision Diffs
git diff revA revB
$ echo ‘version one’ > test
         $ git add test
         $ git commit -m ‘C1’




master




 C1
$ git checkout -b topic
         $ echo ‘version two’ >> test
         $ git commit -m ‘C2’



         topic




        ...
$ echo ‘version three’ >> test
         $ git commit -m ‘C3’

           topic




           C3




           C2
master
...
$ git checkout master
         $ echo ‘version four’ >> test
         $ git commit -m ‘C4’

           topic




         ...
$ echo ‘version five’ >> test
         $ git commit -m ‘C5’


master     topic




 C5        C3




 C4        C2




 C1
master   topic




                 $ git diff topic
 C5      C3




 C4      C2




 C1
master      topic



         what does topic have
                   $ git diff   topic
 C5         C3
          that I d...
master       topic



         what would happen if I
                   $ git diff topic
 C5          C3
           merge...
master      topic



         how do I make topic
                    $ git diff   topic
 C5         C3
           look li...
$ git diff topic
                 diff --git a/test b/test
master   topic
                 index 304313d..bd8c6c9 100644
 ...
$ git diff topic
                 diff --git a/test b/test
master   topic
                 index 304313d..bd8c6c9 100644
 ...
$ git diff HEAD topic
                 diff --git a/test b/test
master   topic
                 index bd8c6c9..304313d 100...
$ git diff HEAD topic
                 diff --git a/test b/test
master   topic
                 index bd8c6c9..304313d 100...
git diff HEAD   topic
git diff HEAD...topic
git diff HEAD...topic
$ git diff HEAD   topic

master   topic




 C5      C3




 C4      C2




 C1
$ git diff HEAD   topic

master   topic




 C5      C3




 C4      C2




 C1
$ git diff HEAD...topic

master   topic




 C5      C3




 C4      C2




 C1
$ git diff HEAD...topic
                   diff --git a/test b/test
master   topic     index 9bc69cf..304313d 100644
     ...
$ git diff HEAD...topic
                       diff --git a/test b/test
master       topic     index 9bc69cf..304313d 1006...
Data Munging
Rewriting History
Modifying the last commit
git commit --amend
Rebasing
master   topic




 C5      C3




 C4      C2




 C1
topic




         C6
master




 C5      C3




 C4      C2




 C1

                 git merge master
master   topic




 C5      C3




 C4      C2




 C1


                 git rebase master
master   topic




 C5      C3




 C4      C2




 C1


                 git rebase master
master   topic




 C5      C3




 C4      C2




 C1


                 git rebase master
master   topic




 C5      C3




 C4      C2




 C1


                 git rebase master
master   topic




                 git diff c2 c3 > 2-3.patch
 C5      C3




 C4      C2




 C1


                    g...
master   topic




                 git diff c2 c3 > 2-3.patch
 C5      C3

                 diff --git a/test b/test
    ...
master   topic




 C5      C3




 C4      C2




 C1

                 2-3.patch
master      topic




 C5         C3




 C4         C2




         git diff c1 c2 > 1-2.patch
 C1

                     ...
master      topic




 C5         C3




 C4         C2




         git diff c1 c2 > 1-2.patch
                          ...
master   topic




 C5      C3




 C4      C2




                 1-2.patch
 C1

                 2-3.patch
git rebase master


master   topic




 C5      C3




 C4      C2




                           1-2.patch
 C1

         ...
git rebase master


1-2.patch
  master    topic




   C5       C3




   C4       C2




   C1

                         ...
git rebase master
         topic




master
         C2'




 C5      C3




 C4      C2




 C1

                        ...
git rebase master
         2-3.patch
            topic




master
            C2'




 C5         C3




 C4         C2


...
topic
                 git rebase master
         C3'



master
         C2'




 C5      C3




 C4      C2




 C1
topic




         C3'



master
         C2'

                 git rebase master
 C5      C3




 C4      C2




 C1
topic




         C3'



master
         C2'

                 git rebase master
 C5      C3




 C4      C2




 C1
topic




         C3'




         C2'

                 git rebase master
         C5
master




         C4




       ...
Fun with Rebasing
rebase --onto
Transplanting Topic
    Branches
master




C1    C2
master




C1    C2




                 C3




              server
master




C1    C2




                 C3




              server



                       C8    C9



               ...
master




C1    C2




              C3   C4   C10



                        server




                   C8    C9



 ...
master




C1   C2   C5    C6




          C3    C4      C10



                        server




                C8    ...
move your ‘client’
branch work to your
  ‘master’ branch
master




C1   C2   C5    C6




          C3    C4      C10



                        server




                C8    ...
master




C1   C2   C5    C6




          C3    C4      C10



                        server




                C8    ...
master




  C1    C2     C5    C6




               C3    C4      C10



                             server




       ...
master




  C1    C2     C5    C6




               C3    C4      C10



                             server




       ...
master




  C1    C2     C5    C6




               C3    C4      C10



                             server




       ...
master




  C1    C2     C5    C6




               C3    C4      C10



                             server




       ...
master




  C1    C2     C5    C6




               C3    C4      C10



                             server




       ...
master




  C1    C2     C5    C6




               C3    C4      C10



                             server




       ...
master




  C1    C2     C5    C6




               C3    C4      C10



                             server




       ...
master




  C1    C2     C5    C6




               C3    C4      C10



                             server




       ...
master




     C1    C2    C5     C6




                 C3     C4      C10



                                server


...
master




     C1    C2    C5     C6




                 C3     C4      C10



                                server


...
master




     C1    C2    C5     C6




                 C3     C4      C10



                                server


...
master




     C1    C2    C5     C6




                 C3     C4      C10



                                server


...
master             client
               master




C1        C5    C6       C8'       C9'
C1   C2         C6       C8    ...
master            client




C1   C2   C5    C6       C8'      C9'




          C3    C4      C10



                    ...
master            client




    C1    C2     C5    C6       C8'      C9'




                 C3    C4      C10



      ...
master            client




    C1    C2     C5    C6       C8'      C9'




                 C3    C4      C10



      ...
master            client




    C1    C2     C5    C6       C8'      C9'




                 C3    C4      C10



      ...
master            client
                                         client




    C1    C2     C5     C6       C8'      C9'...
client
                               client               server
                master




                             ...
client               server
                 master




 C1   C2    C5    C6      C8'   C9'      C3'   C4'   C10'




git ...
transplant some of a
    topic branch
master




C0   C1    C2




           C3      C4   C5




                        topic
master




C0   C1    C2




           C3      C4   C5




                        topic
master




      C0      C1     C2




                     C3      C4   C5




                                  topic


...
master




      C0      C1     C2




                     C3       C4   C5




                   newtopic        topic
...
master




      C0      C1     C2




                     C3       C4    C5




                   newtopic         topi...
master          topic




                              C4'   C5'
      C0      C1     C2




                     C3     ...
Fixing a commit
  several back
git rebase -i
git rebase --interactive
default



 C4



 C3



 C2



 C1



 C0
default



 C4



 C3



 C2



 C1



 C0
default



             C4



             C3



default~2    C2



             C1



             C0
default



             C4



             C3



default~2    C2



             C1



             C0
git rebase -i default~2^
git rebase -i default~2^
git rebase -i default~2^
pick 969c877 git apply --directory broken for new files
pick b75271d git diff <tree>{3,}: do not reverse order of args
pic...
C2
     pick 969c877 git apply --directory broken for new files
     pick b75271d git diff <tree>{3,}: do not reverse orde...
pick 969c877 git apply --directory broken for new files
pick b75271d git diff <tree>{3,}: do not reverse order of args
pic...
pick 969c877 git apply --directory broken for new files
pick b75271d git diff <tree>{3,}: do not reverse order of args
pic...
pick 969c877 git apply --directory broken for new files
pick b75271d git diff <tree>{3,}: do not reverse order of args
pic...
pick 969c877 git apply --directory broken for new files
pick b75271d git diff <tree>{3,}: do not reverse order of args
pic...
pick 969c877 git apply --directory broken for new files
pick b75271d git diff <tree>{3,}: do not reverse order of args
pic...
edit 969c877 git apply --directory broken for new files
pick b75271d git diff <tree>{3,}: do not reverse order of args
pic...
$ git rebase -i default~2^
Stopped at 969c877... git apply --directory broken for new files
You can amend the commit now, ...
$ git rebase -i default~2^
Stopped at 969c877... git apply --directory broken for new files
You can amend the commit now, ...
$ git rebase -i default~2^
Stopped at 969c877... git apply --directory broken for new files
You can amend the commit now, ...
$ git rebase -i default~2^
Stopped at 969c877... git apply --directory broken for new files
You can amend the commit now, ...
$ git rebase -i default~2^
Stopped at 969c877... git apply --directory broken for new files
You can amend the commit now, ...
default



C4    C4'



C3    C3'



C2    C2'



C1



C0
default



C4    C4'



C3    C3'



C2    C2'



C1



C0
default



C4    C4'



C3    C3'



C2    C2'



C1



C0
Squashing commits
     together
pick 969c877 git apply --directory broken for new files
pick b75271d git diff <tree>{3,}: do not reverse order of args
pic...
pick 969c877 git apply --directory broken for new files
squash b75271d git diff <tree>{3,}: do not reverse order of args
s...
# This is a combination of 3 commits.
# The first commit's message is:
git apply --directory broken for new files

# This ...
# This is a combination of 3 commits.
# The first commit's message is:
git apply --directory broken for new files

# This ...
# This is a combination of 3 commits.
# The first commit's message is:
git apply --directory broken for new files

# This ...
# This is a combination of 3 commits.
# The first commit's message is:
git apply --directory broken for new files

# This ...
C4



C3
     default



C2    C5



C1



C0
The Perils
scott   jessica




default



 C1



 C0
scott                   jessica




                                      default



                                     ...
scott                   jessica




default           scott/default       default


                        C7
 C7        ...
scott                   jessica




                                      default



                                     ...
scott                        jessica




                                      default



                                ...
scott                        jessica




                                            default



                          ...
scott                        jessica



                                            default



                           ...
Filter Branch
History Revision on Steroids
remove all instances of a
 file from every commit
git filter-branch
--tree-filter 'rm -f filename'
              HEAD
change your email
  in all commits
git filter-branch --env-filter
quot;export GIT_AUTHOR_EMAIL=you@email.comquot;
                  HEAD
git filter-branch --env-filter
quot;export GIT_AUTHOR_EMAIL=you@email.comquot;
           origin/master..HEAD
Subtree Merging
Alternative to
 Submodules
$ ls
README	 	 rack_app.rb
$ git remote add rack_remote git@github.com:schacon/rack.git
$ git fetch rack_remote
warning: n...
master



 C3



 C2



 C1



 C0
$ ls
README	 	 rack_app.rb
$ git remote add rack_remote git@github.com:schacon/rack.git
$ git fetch rack_remote
warning: n...
$ ls
README	 	 rack_app.rb
$ git remote add rack_remote git@github.com:schacon/rack.git
$ git fetch rack_remote
warning: n...
$ ls
README	 	 rack_app.rb
$ git remote add rack_remote git@github.com:schacon/rack.git
$ git fetch rack_remote
warning: n...
$ ls
README	 	 rack_app.rb
$ git remote add rack_remote git@github.com:schacon/rack.git
$ git fetch rack_remote
warning: n...
$ ls
README	 	 rack_app.rb
$ git remote add rack_remote git@github.com:schacon/rack.git
$ git fetch rack_remote
warning: n...
$ ls
README	 	 rack_app.rb
$ git remote add rack_remote git@github.com:schacon/rack.git
$ git fetch rack_remote
warning: n...
$ ls
README	 	 rack_app.rb
$ git remote add rack_remote git@github.com:schacon/rack.git
$ git fetch rack_remote
warning: n...
$ ls
README	 	 rack_app.rb
$ git remote add rack_remote git@github.com:schacon/rack.git
$ git fetch rack_remote
warning: n...
master




 C3      rack_branch




             C6        rack_remote/master
 C2



             C5
 C1



 C0          C4
$ git checkout master
$ ls
README	 rack_app.rb
      	
$ git checkout rack_branch
$ ls
AUTHORS	 	 KNOWN-ISSUES	Rakefile	 c...
$ git checkout master
$ ls
README	 rack_app.rb
      	
$ git checkout rack_branch
$ ls
AUTHORS	 	 KNOWN-ISSUES	Rakefile	 c...
$ git checkout master
$ ls
README	 rack_app.rb
      	
$ git checkout rack_branch
$ ls
AUTHORS	 	 KNOWN-ISSUES	Rakefile	 c...
$ git checkout master
$ ls
README	 rack_app.rb
      	
$ git checkout rack_branch
$ ls
AUTHORS	 	 KNOWN-ISSUES	Rakefile	 c...
checkout ‘rack’
into my project
$ git read-tree --prefix=rack/ -u rack_branch
$ ls
README	 rack	 rack_app.rb
      	      	
$ ls rack
AUTHORS	 	 KNOWN-ISS...
$ git read-tree --prefix=rack/ -u rack_branch
$ ls
README	 rack	 rack_app.rb
      	      	
$ ls rack
AUTHORS	 	 KNOWN-ISS...
$ git read-tree --prefix=rack/ -u rack_branch
$ ls
README	 rack	 rack_app.rb
      	      	
$ ls rack
AUTHORS	 	 KNOWN-ISS...
$ git read-tree --prefix=rack/ -u rack_branch
$ ls
README	 rack	 rack_app.rb
      	      	
$ ls rack
AUTHORS	 	 KNOWN-ISS...
$ git read-tree --prefix=rack/ -u rack_branch
$ ls
README	 rack	 rack_app.rb
      	      	
$ ls rack
AUTHORS	 	 KNOWN-ISS...
$ git read-tree --prefix=rack/ -u rack_branch
$ ls
README	 rack	 rack_app.rb
      	      	
$ ls rack
AUTHORS	 	 KNOWN-ISS...
edit a file in rack
$ vim rack/lib/rack.rb
$ git commit -am 'added awesome to rack'
[master b1b77ee] added awesome to rack
  1 files changed, ...
$ vim rack/lib/rack.rb
$ git commit -am 'added awesome to rack'
[master b1b77ee] added awesome to rack
  1 files changed, ...
$ vim rack/lib/rack.rb
$ git commit -am 'added awesome to rack'
[master b1b77ee] added awesome to rack
  1 files changed, ...
submit the change
   back to rack
$ vim rack/lib/rack.rb
$ git commit -am 'added awesome to rack'
[master b1b77ee] added awesome to rack
  1 files changed, ...
git merge -s subtree
$ vim rack/lib/rack.rb
$ git commit -am 'added awesome to rack'
[master b1b77ee] added awesome to rack
  1 files changed, ...
$ vim rack/lib/rack.rb
$ git commit -am 'added awesome to rack'
[master b1b77ee] added awesome to rack
  1 files changed, ...
$ vim rack/lib/rack.rb
$ git commit -am 'added awesome to rack'
[master b1b77ee] added awesome to rack
  1 files changed, ...
$ vim rack/lib/rack.rb
$ git commit -am 'added awesome to rack'
[master b1b77ee] added awesome to rack
  1 files changed, ...
$ vim rack/lib/rack.rb
$ git commit -am 'added awesome to rack'
[master b1b77ee] added awesome to rack
  1 files changed, ...
$ vim rack/lib/rack.rb
$ git commit -am 'added awesome to rack'
[master b1b77ee] added awesome to rack
  1 files changed, ...
$ vim rack/lib/rack.rb
$ git commit -am 'added awesome to rack'
[master b1b77ee] added awesome to rack
  1 files changed, ...
$ vim rack/lib/rack.rb
$ git commit -am 'added awesome to rack'
[master b1b77ee] added awesome to rack
  1 files changed, ...
$ vim rack/lib/rack.rb
$ git commit -am 'added awesome to rack'
[master b1b77ee] added awesome to rack
  1 files changed, ...
git merge -s subtree --no-commit --squash master
git merge -s subtree --no-commit --squash master




                   really?
Tim Dysinger

            http://dysinger.net/2008/04/29/
replacing-braid-or-piston-for-git-with-40-lines-of-rake/
Tim Dysinger

            http://dysinger.net/2008/04/29/
replacing-braid-or-piston-for-git-with-40-lines-of-rake/


     ...
Patch Staging
git add -p
$ git status
# On branch master
# Changed but not updated:
#   (use quot;git add <file>...quot; to update what wi
#   (use...
$ git status
# On branch master
# Changed but not updated:
#   (use quot;git add <file>...quot; to update what wi
#   (use...
$ git add -p
diff --git a/ticgit.gemspec b/ticgit.gemspec
index 9c32bd4..a44667b 100644
--- a/ticgit.gemspec
+++ b/ticgit....
$ git add -p
diff --git a/ticgit.gemspec b/ticgit.gemspec
index 9c32bd4..a44667b 100644
--- a/ticgit.gemspec
+++ b/ticgit....
$ git add -p
diff --git a/ticgit.gemspec b/ticgit.gemspec
index 9c32bd4..a44667b 100644
--- a/ticgit.gemspec
+++ b/ticgit....
$ git add -p
diff --git a/ticgit.gemspec b/ticgit.gemspec
index 9c32bd4..a44667b 100644
--- a/ticgit.gemspec
+++ b/ticgit....
@@ -9,9 +9,10 @@ Gem::Specification.new do |s|
     s.files     =   [quot;lib/ticgit/base.rbquot;, quot;lib/ticgit/
quot;l...
@@ -9,9 +9,10 @@ Gem::Specification.new do |s|
     s.files     =   [quot;lib/ticgit/base.rbquot;, quot;lib/ticgit/
quot;l...
@@ -9,9 +9,10 @@ Gem::Specification.new do |s|
     s.files     =   [quot;lib/ticgit/base.rbquot;, quot;lib/ticgit/
quot;l...
$ git status
# On branch master
# Changes to be committed:
#   (use quot;git reset HEAD <file>...quot; to unstage)
#
#	 mo...
$ git status
# On branch master
# Changes to be committed:
#   (use quot;git reset HEAD <file>...quot; to unstage)
#
#	 mo...
$ git status
# On branch master
# Changes to be committed:
#   (use quot;git reset HEAD <file>...quot; to unstage)
#
#	 mo...
$ git status
# On branch master
# Changes to be committed:
#   (use quot;git reset HEAD <file>...quot; to unstage)
#
#	 mo...
partially stage files
git add -p
Debugging
Annotation
git blame
git blame
ie: “what dumbass did this? oh, it was me...”
git blame daemon.c
979e32fa   (Randal L. Schwartz        2005-10-25   16:29:09   -0700    1)   #include   quot;cache.hquot...
git blame daemon.c
979e32fa   (Randal L. Schwartz        2005-10-25   16:29:09   -0700    1)   #include   quot;cache.hquot...
git blame daemon.c
979e32fa   (Randal L. Schwartz        2005-10-25   16:29:09   -0700    1)   #include   quot;cache.hquot...
git blame daemon.c
979e32fa   (Randal L. Schwartz        2005-10-25   16:29:09   -0700    1)   #include   quot;cache.hquot...
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Smacking Git Around   Advanced Git Tricks
Upcoming SlideShare
Loading in...5
×

Smacking Git Around Advanced Git Tricks

3,661

Published on

Published in: Technology

Transcript of "Smacking Git Around Advanced Git Tricks"

  1. 1. Smacking Git Around by Scott Chacon
  2. 2. Me
  3. 3. Scott Chacon
  4. 4. github.com/schacon
  5. 5. “Scott Chacon has an understandable but borderline unhealthy obsession with Git” - Ilya Grigorik igvita.com
  6. 6. git-scm.com
  7. 7. book.git-scm.com
  8. 8. schacon@gmail.com
  9. 9. </me>
  10. 10. previously, on Git...
  11. 11. GIT
  12. 12. Git
  13. 13. image by matthew mccullough
  14. 14. Scott Chacon Scott Scott Chacon is a Git v1 v2 v3
  15. 15. 98ca9.. 34ac2.. f30ab.. commit commit commit size size size tree tree tree 0de24 184ca 92ec2 author parent parent Scott 98ca9 34ac2 committer author author Scott Scott Scott committer committer initial commit of my project Scott Scott fixed bug #1328 - stack add feature #32 - ability to overflow under certain add new formats to the central snapshot A snapshot B snapshot C
  16. 16. 98ca9.. e8455.. commit size blob size 0de24.. 0de24.. tree 0de24 == LICENSE: tree size parent nil (The MIT License) author Scott blob e8455 README Copyright (c) 2007 Tom Preston- committer Scott tree 10af9 lib Permission is hereby granted, f my commit message goes here ree of charge, to any person ob and it is really, really cool bc52a.. 10af9.. blob size tree size require 'grit/index' blob bc52a mylib.rb require 'grit/status' tree b70f8 inc module Grit class << self attr_accessor :debug b70f8.. 0ad1a.. tree size size blob blob 0ad1a tricks.rb require 'grit/git-ruby/reposi require 'grit/git-ruby/file_i module Grit module Tricks
  17. 17. 98ca9.. e8455.. commit size blob size 0de24.. 0de24.. tree 0de24 == LICENSE: tree size parent nil (The MIT License) author Scott blob e8455 README Copyright (c) 2007 Tom Preston- committer Scott tree 10af9 lib Permission is hereby granted, f my commit message goes here ree of charge, to any person ob and it is really, really cool bc52a.. 10af9.. blob size tree size require 'grit/index' blob bc52a mylib.rb require 'grit/status' tree b70f8 inc module Grit class << self attr_accessor :debug b70f8.. 0ad1a.. tree size size blob blob 0ad1a tricks.rb require 'grit/git-ruby/reposi require 'grit/git-ruby/file_i module Grit module Tricks
  18. 18. 0de24.. 22d8858e8513666bf91b82bd2939ec7b0d1974da
  19. 19. stable master 98ca9 34ac2 f30ab a23fe 3acd1 topic
  20. 20. stable master 98ca9 34ac2 f30ab a23fe 3acd1 topic
  21. 21. stable master 98ca9 34ac2 f30ab a23fe 3acd1 topic
  22. 22. stable master 98ca9 34ac2 f30ab a23fe 3acd1 topic
  23. 23. $ time git checkout -b newbranch Switched to a new branch quot;newbranchquot; real 0m0.040s user 0m0.003s sys 0m0.008s
  24. 24. $ time git checkout -b newbranch Switched to a new branch quot;newbranchquot; real 0m0.040s user 0m0.003s sys 0m0.008s
  25. 25. master develop topic
  26. 26. distributed development image by matthew mccullough
  27. 27. ccf03da00eca1b60a489354c1278c27f1fbc55dc a640106f173c5be59ed5757cf33f568b3e10994f c51a137df64b8ed2f8d84ad62df7b49b1c409906 7e06f7f8d471d5ccbe958fcfaef0fc48ff1a3def dafe95908f7b9cbd2697f04544b68904a6c59aac 2934b685f5dfd2b12c5d7d35d07c6058640f0581 d3b47a90ef9bf2d7bbc5a7cf2b2f27eef4a08f04 dbfeee0f5717d9978788da17cd6853316c92744a 864734938d4044fc5e713e4818f60ecb4f460525 3793a0108438a539f958236dbb9f4ea98b6b70ea 00a60fa1439f082128c1ec03ec3c73acab074d31 6ba82b4879f04de35ffe2ef02d50df0adf184fad 861020b6afeeec245afa2f864c72f5c2588295be 505f3128a573bfe1d23aec2acef83c34c3cbd8be 213e6f8761df038ab0b7c34a9fc4c2c3ce6c8b43 798a8088bcc7cf47fdb33a9d79e398220b660f88
  28. 28. C
  29. 29. fast
  30. 30. efficient
  31. 31. 100k repos
  32. 32. 80k users
  33. 33. </git-recap>
  34. 34. Git Tips and Tricks
  35. 35. Tips and Tricks Selection and Ranges Data Munging Debugging Customizing
  36. 36. Selection and Ranges
  37. 37. Revision Selection
  38. 38. Revision Selection alternate ways to refer to objects or ranges of objects
  39. 39. Revision Selection full sha-1 partial sha-1 branch or tag name caret parent tilde spec blob spec relative specs ranges
  40. 40. Full SHA1 6e453f523fa1da50ecb04431101112b3611c6a4d
  41. 41. Partial SHA1 6e453f523fa1da50ecb04431101112b3611c6a4d 6e453f523fa1da50 6e453
  42. 42. Branch, Remote or Tag Name v1.0 default m/cupcake
  43. 43. Caret Parent default^2 2nd parent of ‘default’
  44. 44. b3be1 a09c6 df2fa c36ae 5ec47 ce0e4 2f45e 4eadf 2fbb3 18cae jess/master master
  45. 45. master^ b3be1 a09c6 df2fa c36ae 5ec47 ce0e4 2f45e 4eadf 2fbb3 18cae jess/master master
  46. 46. master^2 b3be1 a09c6 df2fa c36ae 5ec47 ce0e4 2f45e 4eadf 2fbb3 18cae jess/master master
  47. 47. Tilde Spec default~2 grandparent of ‘default’ (parent of the parent)
  48. 48. master~2 b3be1 a09c6 df2fa c36ae 5ec47 ce0e4 2f45e 4eadf 2fbb3 18cae jess/master master
  49. 49. master^^^2 master~2^2 b3be1 a09c6 df2fa c36ae 5ec47 ce0e4 2f45e 4eadf 2fbb3 18cae jess/master master
  50. 50. master^^^2 master~2^2 b3be1 a09c6 df2fa c36ae 5ec47 ce0e4 2f45e 4eadf 2fbb3 18cae jess/master master
  51. 51. master^^^2 master~2^2 b3be1 a09c6 df2fa c36ae 5ec47 ce0e4 2f45e 4eadf 2fbb3 18cae jess/master master
  52. 52. Blob Spec default:path/to/file blob of that file in ‘default’ commit
  53. 53. Relative Specs master@{yesterday} the commit ‘master’ was at yesterday
  54. 54. Relative Specs master@{5} the 5th prior value of ‘master’ (locally)
  55. 55. Ranges
  56. 56. Ranges ce0e4..e4272 every commit reachable by e4272 that is not reachable by ce034
  57. 57. Ranges [old]..[new] every commit reachable by [new] that is not reachable by [old]
  58. 58. Ranges ce0e4.. everything since a commit
  59. 59. “Reachability”
  60. 60. jess/master..master b3be1 a09c6 df2fa c36ae 5ec47 ce0e4 2f45e 4eadf 2fbb3 18cae jess/master master
  61. 61. jess/master..master b3be1 a09c6 df2fa c36ae 5ec47 ce0e4 2f45e 4eadf 2fbb3 18cae jess/master master
  62. 62. jess/master..master b3be1 a09c6 df2fa c36ae 5ec47 ce0e4 2f45e 4eadf 2fbb3 18cae jess/master master
  63. 63. jess/master..master b3be1 a09c6 df2fa c36ae 5ec47 ce0e4 2f45e 4eadf 2fbb3 18cae jess/master master
  64. 64. jess/master..master b3be1 a09c6 df2fa c36ae 5ec47 ce0e4 2f45e 4eadf 2fbb3 18cae jess/master master
  65. 65. jess/master..master b3be1 a09c6 df2fa c36ae 5ec47 ce0e4 2f45e 4eadf 2fbb3 18cae jess/master master
  66. 66. jess/master..master b3be1 a09c6 df2fa c36ae 5ec47 ce0e4 2f45e 4eadf 2fbb3 18cae jess/master master
  67. 67. jess/master..master b3be1 a09c6 df2fa c36ae 5ec47 ce0e4 2f45e 4eadf 2fbb3 18cae jess/master master
  68. 68. jess/master..c36ae b3be1 a09c6 df2fa c36ae 5ec47 ce0e4 2f45e 4eadf 2fbb3 18cae jess/master master
  69. 69. jess/master..c36ae b3be1 a09c6 df2fa c36ae 5ec47 ce0e4 2f45e 4eadf 2fbb3 18cae jess/master master
  70. 70. jess/master..c36ae b3be1 a09c6 df2fa c36ae 5ec47 ce0e4 2f45e 4eadf 2fbb3 18cae jess/master master
  71. 71. jess/master..c36ae b3be1 a09c6 df2fa c36ae 5ec47 ce0e4 2f45e 4eadf 2fbb3 18cae jess/master master
  72. 72. Advanced Log
  73. 73. Log Subsets
  74. 74. what am I going to push?
  75. 75. git log origin/master..
  76. 76. C1 origin/master master HEAD C0
  77. 77. C4 master HEAD C3 C2 C1 origin/master C0
  78. 78. C7 C4 origin/master master HEAD C6 C3 C5 C2 C1 git fetch origin C0
  79. 79. C7 C4 origin/master master HEAD C6 C3 C5 C2 C1 git log origin/master.. C0
  80. 80. C7 C4 origin/master master HEAD C6 C3 C5 C2 C1 git log origin/master..HEAD C0
  81. 81. C7 C4 origin/master master HEAD C6 C3 C5 C2 C1 git log origin/master..HEAD C0
  82. 82. C7 C4 origin/master master HEAD C6 C3 C5 C2 C1 git log origin/master..HEAD C0
  83. 83. C7 C4 origin/master master HEAD C6 C3 C5 C2 C1 git log origin/master..HEAD C0
  84. 84. commit 72d404debaa804fca82fd9cf710fbde48c7305c6 Author: Shawn O. Pearce <spearce@spearce.org> Date: Sun Oct 12 13:13:59 2008 -0700 test-lib: fix broken printf b8eecafd888d219633f4c29e8b6a90fc21a46dfd introduced usage of printf without a format string. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> commit 969c877506cf8cc760c7b251fef6c5b6850bfc19 Author: Jeff King <peff@peff.net> Date: Sun Oct 12 00:06:11 2008 -0400 git apply --directory broken for new files We carefully verify that the input to git-apply is sane, including cross-checking that the filenames we see in quot;+++quot; headers match what was provided on the command line of quot;diff --gitquot;. When --directory is used, however, we ended up comparing the unadorned name to one with the prepended root, causing us to complain about a mismatch. We simply need to prepend the root directory, if any, when pulling the name out of the git header. commit ff74126c03a8dfd04e7533573a5c420f2a7112ac Author: Johannes Schindelin <Johannes.Schindelin@gmx.de> Date: Fri Oct 10 13:42:12 2008 +0200 rebase -i: do not fail when there is no commit to cherry-pick
  85. 85. commit 72d404debaa804fca82fd9cf710fbde48c7305c6 C4 Author: Shawn O. Pearce <spearce@spearce.org> Date: Sun Oct 12 13:13:59 2008 -0700 test-lib: fix broken printf b8eecafd888d219633f4c29e8b6a90fc21a46dfd introduced usage of printf without a format string. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> commit 969c877506cf8cc760c7b251fef6c5b6850bfc19 C3 Author: Jeff King <peff@peff.net> Date: Sun Oct 12 00:06:11 2008 -0400 git apply --directory broken for new files We carefully verify that the input to git-apply is sane, including cross-checking that the filenames we see in quot;+++quot; headers match what was provided on the command line of quot;diff --gitquot;. When --directory is used, however, we ended up comparing the unadorned name to one with the prepended root, causing us to complain about a mismatch. We simply need to prepend the root directory, if any, when pulling the name out of the git header. commit ff74126c03a8dfd04e7533573a5c420f2a7112ac C2 Author: Johannes Schindelin <Johannes.Schindelin@gmx.de> Date: Fri Oct 10 13:42:12 2008 +0200 rebase -i: do not fail when there is no commit to cherry-pick
  86. 86. C7 C4 origin/master master HEAD C6 C3 C5 C2 C1 git log origin/master .. HEAD C0
  87. 87. C7 C4 origin/master master HEAD C6 C3 C5 C2 C1 git log HEAD .. origin/master C0
  88. 88. C7 C4 origin/master master HEAD C6 C3 C5 C2 C1 git log HEAD .. origin/master C0 “commits in origin/master not in HEAD”
  89. 89. git log origin/master.. git log origin/master..HEAD git log origin/master..master git log master ^origin/master git log master --not origin/master
  90. 90. git log HEAD ^origin/master
  91. 91. git log HEAD ^origin/master
  92. 92. git log master topic1 ^origin/master
  93. 93. origin/master C1 C0
  94. 94. master C3 origin/master C1 C0
  95. 95. experiment C10 C9 C8 master C3 origin/master C1 C0
  96. 96. experiment C10 master origin/master C9 C7 C5 C6 C4 C8 C2 C3 C1 C0
  97. 97. which changes aren’t in experiment?
  98. 98. git log origin/master master ^experiment experiment C10 master origin/master C9 C7 C5 C6 C4 C8 C2 C3 C1 C0
  99. 99. git log origin/master master ^experiment experiment C10 master origin/master C9 C7 C5 C6 C4 C8 C2 C3 C1 C0
  100. 100. git log origin/master master ^experiment experiment C10 master origin/master C9 C7 C5 C6 C4 C8 C2 C3 C1 C0
  101. 101. git log origin/master master ^experiment experiment C10 master origin/master C9 C7 C5 C6 C4 C8 C2 C3 C1 C0
  102. 102. git log origin/master master ^experiment experiment C10 master origin/master C9 C7 C5 C6 C4 C8 C2 C3 C1 C0
  103. 103. git log origin/master master ^experiment experiment C10 master origin/master C9 C7 C5 C6 C4 C8 C2 C3 C1 C0
  104. 104. git log origin/master master ^experiment experiment C10 master origin/master C9 C7 C5 C6 C4 C8 C2 C3 C1 C0
  105. 105. git log --graph
  106. 106. git log --pretty=oneline --graph
  107. 107. gitk
  108. 108. gitk 6d13f..41aba
  109. 109. Revision Diffs
  110. 110. git diff revA revB
  111. 111. $ echo ‘version one’ > test $ git add test $ git commit -m ‘C1’ master C1
  112. 112. $ git checkout -b topic $ echo ‘version two’ >> test $ git commit -m ‘C2’ topic C2 master C1
  113. 113. $ echo ‘version three’ >> test $ git commit -m ‘C3’ topic C3 C2 master C1
  114. 114. $ git checkout master $ echo ‘version four’ >> test $ git commit -m ‘C4’ topic C3 master C4 C2 C1
  115. 115. $ echo ‘version five’ >> test $ git commit -m ‘C5’ master topic C5 C3 C4 C2 C1
  116. 116. master topic $ git diff topic C5 C3 C4 C2 C1
  117. 117. master topic what does topic have $ git diff topic C5 C3 that I don’t have? C4 C2 C1
  118. 118. master topic what would happen if I $ git diff topic C5 C3 merged in topic? C4 C2 C1
  119. 119. master topic how do I make topic $ git diff topic C5 C3 look like HEAD? C4 C2 C1
  120. 120. $ git diff topic diff --git a/test b/test master topic index 304313d..bd8c6c9 100644 --- a/test +++ b/test C5 C3 @@ -1,3 +1,3 @@ version one -version two -version three C4 C2 +version four +version five C1
  121. 121. $ git diff topic diff --git a/test b/test master topic index 304313d..bd8c6c9 100644 --- a/test +++ b/test C5 C3 @@ -1,3 +1,3 @@ version one -version two -version three C4 C2 +version four +version five C1
  122. 122. $ git diff HEAD topic diff --git a/test b/test master topic index bd8c6c9..304313d 100644 --- a/test +++ b/test C5 C3 @@ -1,3 +1,3 @@ version one -version four -version five C4 C2 +version two +version three C1
  123. 123. $ git diff HEAD topic diff --git a/test b/test master topic index bd8c6c9..304313d 100644 --- a/test +++ b/test C5 C3 @@ -1,3 +1,3 @@ version one -version four -version five C4 C2 +version two +version three C1
  124. 124. git diff HEAD topic
  125. 125. git diff HEAD...topic
  126. 126. git diff HEAD...topic
  127. 127. $ git diff HEAD topic master topic C5 C3 C4 C2 C1
  128. 128. $ git diff HEAD topic master topic C5 C3 C4 C2 C1
  129. 129. $ git diff HEAD...topic master topic C5 C3 C4 C2 C1
  130. 130. $ git diff HEAD...topic diff --git a/test b/test master topic index 9bc69cf..304313d 100644 --- a/test +++ b/test @@ -1 +1,3 @@ C5 C3 version one +version two +version three C4 C2 C1
  131. 131. $ git diff HEAD...topic diff --git a/test b/test master topic index 9bc69cf..304313d 100644 --- a/test what would happen if I +++ b/test @@ -1 +1,3 @@ C5 C3 merged in topic? version one +version two +version three C4 C2 C1
  132. 132. Data Munging
  133. 133. Rewriting History
  134. 134. Modifying the last commit
  135. 135. git commit --amend
  136. 136. Rebasing
  137. 137. master topic C5 C3 C4 C2 C1
  138. 138. topic C6 master C5 C3 C4 C2 C1 git merge master
  139. 139. master topic C5 C3 C4 C2 C1 git rebase master
  140. 140. master topic C5 C3 C4 C2 C1 git rebase master
  141. 141. master topic C5 C3 C4 C2 C1 git rebase master
  142. 142. master topic C5 C3 C4 C2 C1 git rebase master
  143. 143. master topic git diff c2 c3 > 2-3.patch C5 C3 C4 C2 C1 git rebase master
  144. 144. master topic git diff c2 c3 > 2-3.patch C5 C3 diff --git a/test b/test index 2eadcec..bd8c6c9 100644 --- a/test C4 C2 +++ b/test @@ -1,2 +1,3 @@ version one version four C1 +version five git rebase master
  145. 145. master topic C5 C3 C4 C2 C1 2-3.patch
  146. 146. master topic C5 C3 C4 C2 git diff c1 c2 > 1-2.patch C1 2-3.patch
  147. 147. master topic C5 C3 C4 C2 git diff c1 c2 > 1-2.patch 1-2.patch C1 2-3.patch
  148. 148. master topic C5 C3 C4 C2 1-2.patch C1 2-3.patch
  149. 149. git rebase master master topic C5 C3 C4 C2 1-2.patch C1 2-3.patch
  150. 150. git rebase master 1-2.patch master topic C5 C3 C4 C2 C1 2-3.patch
  151. 151. git rebase master topic master C2' C5 C3 C4 C2 C1 2-3.patch
  152. 152. git rebase master 2-3.patch topic master C2' C5 C3 C4 C2 C1
  153. 153. topic git rebase master C3' master C2' C5 C3 C4 C2 C1
  154. 154. topic C3' master C2' git rebase master C5 C3 C4 C2 C1
  155. 155. topic C3' master C2' git rebase master C5 C3 C4 C2 C1
  156. 156. topic C3' C2' git rebase master C5 master C4 C1
  157. 157. Fun with Rebasing
  158. 158. rebase --onto
  159. 159. Transplanting Topic Branches
  160. 160. master C1 C2
  161. 161. master C1 C2 C3 server
  162. 162. master C1 C2 C3 server C8 C9 client
  163. 163. master C1 C2 C3 C4 C10 server C8 C9 client
  164. 164. master C1 C2 C5 C6 C3 C4 C10 server C8 C9 client
  165. 165. move your ‘client’ branch work to your ‘master’ branch
  166. 166. master C1 C2 C5 C6 C3 C4 C10 server C8 C9 client
  167. 167. master C1 C2 C5 C6 C3 C4 C10 server C8 C9 client
  168. 168. master C1 C2 C5 C6 C3 C4 C10 server C8 C9 client git rebase master
  169. 169. master C1 C2 C5 C6 C3 C4 C10 server C8 C9 client git rebase master
  170. 170. master C1 C2 C5 C6 C3 C4 C10 server C8 C9 client git rebase master
  171. 171. master C1 C2 C5 C6 C3 C4 C10 server C8 C9 client git rebase master
  172. 172. master C1 C2 C5 C6 C3 C4 C10 server C8 C9 client git rebase server
  173. 173. master C1 C2 C5 C6 C3 C4 C10 server C8 C9 client git rebase server
  174. 174. master C1 C2 C5 C6 C3 C4 C10 server C8 C9 client git rebase server
  175. 175. master C1 C2 C5 C6 C3 C4 C10 server C8 C9 client git rebase server
  176. 176. master C1 C2 C5 C6 C3 C4 C10 server C8 C9 client git rebase --onto master server
  177. 177. master C1 C2 C5 C6 C3 C4 C10 server C8 C9 client git rebase --onto master server
  178. 178. master C1 C2 C5 C6 C3 C4 C10 server C8 C9 client git rebase --onto master server
  179. 179. master C1 C2 C5 C6 C3 C4 C10 server C8 C9 client git rebase --onto master server
  180. 180. master client master C1 C5 C6 C8' C9' C1 C2 C6 C8 C9 C3 C4 C10 C4 C10 server server C8 C9 C8 C9 client
  181. 181. master client C1 C2 C5 C6 C8' C9' C3 C4 C10 server C8 C9
  182. 182. master client C1 C2 C5 C6 C8' C9' C3 C4 C10 server C8 C9 git checkout server git rebase master
  183. 183. master client C1 C2 C5 C6 C8' C9' C3 C4 C10 server C8 C9 git checkout server git rebase client
  184. 184. master client C1 C2 C5 C6 C8' C9' C3 C4 C10 server C8 C9 git checkout server git rebase client
  185. 185. master client client C1 C2 C5 C6 C8' C9' C6 C3' C4' C10' C3 C4 C10 server C8 C9 git checkout server git rebase client
  186. 186. client client server master C3' C10' C1 C1 C2 C2 C5 C5 C6 C6 C8' C8' C9' C9' C3' C4' git checkout server git rebase client
  187. 187. client server master C1 C2 C5 C6 C8' C9' C3' C4' C10' git checkout server git rebase client
  188. 188. transplant some of a topic branch
  189. 189. master C0 C1 C2 C3 C4 C5 topic
  190. 190. master C0 C1 C2 C3 C4 C5 topic
  191. 191. master C0 C1 C2 C3 C4 C5 topic git branch newtopic C3
  192. 192. master C0 C1 C2 C3 C4 C5 newtopic topic git branch newtopic C3
  193. 193. master C0 C1 C2 C3 C4 C5 newtopic topic git branch newtopic C3 git rebase --onto master newtopic
  194. 194. master topic C4' C5' C0 C1 C2 C3 C4 C5 newtopic git branch newtopic C3 git rebase --onto master newtopic
  195. 195. Fixing a commit several back
  196. 196. git rebase -i git rebase --interactive
  197. 197. default C4 C3 C2 C1 C0
  198. 198. default C4 C3 C2 C1 C0
  199. 199. default C4 C3 default~2 C2 C1 C0
  200. 200. default C4 C3 default~2 C2 C1 C0
  201. 201. git rebase -i default~2^
  202. 202. git rebase -i default~2^
  203. 203. git rebase -i default~2^
  204. 204. pick 969c877 git apply --directory broken for new files pick b75271d git diff <tree>{3,}: do not reverse order of args pick 72d404d test-lib: fix broken printf # Rebase f285a2d..5c283eb onto f285a2d # # 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. # ~ ~ ~ ~ ~ quot;~/projects/git/.git/rebase-merge/git-rebase-todoquot; 14L, 472C
  205. 205. C2 pick 969c877 git apply --directory broken for new files pick b75271d git diff <tree>{3,}: do not reverse order of args C3 pick 72d404d test-lib: fix broken printf C4 # Rebase f285a2d..5c283eb onto f285a2d # # 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. # ~ ~ ~ ~ ~ quot;~/projects/git/.git/rebase-merge/git-rebase-todoquot; 14L, 472C
  206. 206. pick 969c877 git apply --directory broken for new files pick b75271d git diff <tree>{3,}: do not reverse order of args pick 72d404d test-lib: fix broken printf # Rebase f285a2d..5c283eb onto f285a2d # # 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. # ~ ~ ~ ~ ~ quot;~/projects/git/.git/rebase-merge/git-rebase-todoquot; 14L, 472C
  207. 207. pick 969c877 git apply --directory broken for new files pick b75271d git diff <tree>{3,}: do not reverse order of args pick 72d404d test-lib: fix broken printf # Rebase f285a2d..5c283eb onto f285a2d # # 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. # ~ ~ ~ ~ ~ quot;~/projects/git/.git/rebase-merge/git-rebase-todoquot; 14L, 472C
  208. 208. pick 969c877 git apply --directory broken for new files pick b75271d git diff <tree>{3,}: do not reverse order of args pick 72d404d test-lib: fix broken printf # Rebase f285a2d..5c283eb onto f285a2d # # 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. # ~ ~ ~ ~ ~ quot;~/projects/git/.git/rebase-merge/git-rebase-todoquot; 14L, 472C
  209. 209. pick 969c877 git apply --directory broken for new files pick b75271d git diff <tree>{3,}: do not reverse order of args pick 72d404d test-lib: fix broken printf # Rebase f285a2d..5c283eb onto f285a2d # # 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. # ~ ~ ~ ~ ~ quot;~/projects/git/.git/rebase-merge/git-rebase-todoquot; 14L, 472C
  210. 210. pick 969c877 git apply --directory broken for new files pick b75271d git diff <tree>{3,}: do not reverse order of args pick 72d404d test-lib: fix broken printf # Rebase f285a2d..5c283eb onto f285a2d # # 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. # ~ ~ ~ ~ ~ quot;~/projects/git/.git/rebase-merge/git-rebase-todoquot; 14L, 472C
  211. 211. edit 969c877 git apply --directory broken for new files pick b75271d git diff <tree>{3,}: do not reverse order of args pick 72d404d test-lib: fix broken printf # Rebase f285a2d..5c283eb onto f285a2d # # 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. # ~ ~ ~ ~ ~ quot;~/projects/git/.git/rebase-merge/git-rebase-todoquot; 14L, 472C
  212. 212. $ git rebase -i default~2^ Stopped at 969c877... git apply --directory broken for new files You can amend the commit now, with git commit --amend Once you are satisfied with your changes, run git rebase --continue $_
  213. 213. $ git rebase -i default~2^ Stopped at 969c877... git apply --directory broken for new files You can amend the commit now, with git commit --amend Once you are satisfied with your changes, run git rebase --continue $_ edit files git add git commit --amend git rebase --continue
  214. 214. $ git rebase -i default~2^ Stopped at 969c877... git apply --directory broken for new files You can amend the commit now, with git commit --amend Once you are satisfied with your changes, run git rebase --continue $_ edit files git add git commit --amend git rebase --continue
  215. 215. $ git rebase -i default~2^ Stopped at 969c877... git apply --directory broken for new files You can amend the commit now, with git commit --amend Once you are satisfied with your changes, run git rebase --continue $_ edit files git add git commit --amend git rebase --continue
  216. 216. $ git rebase -i default~2^ Stopped at 969c877... git apply --directory broken for new files You can amend the commit now, with git commit --amend Once you are satisfied with your changes, run git rebase --continue $_ edit files git add git commit --amend git rebase --continue
  217. 217. default C4 C4' C3 C3' C2 C2' C1 C0
  218. 218. default C4 C4' C3 C3' C2 C2' C1 C0
  219. 219. default C4 C4' C3 C3' C2 C2' C1 C0
  220. 220. Squashing commits together
  221. 221. pick 969c877 git apply --directory broken for new files pick b75271d git diff <tree>{3,}: do not reverse order of args pick 72d404d test-lib: fix broken printf # Rebase f285a2d..5c283eb onto f285a2d # # 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. # ~ ~ ~ ~ ~ quot;~/projects/git/.git/rebase-merge/git-rebase-todoquot; 14L, 472C
  222. 222. pick 969c877 git apply --directory broken for new files squash b75271d git diff <tree>{3,}: do not reverse order of args squash 72d404d test-lib: fix broken printf # Rebase f285a2d..5c283eb onto f285a2d # # 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. # ~ ~ ~ ~ ~ quot;~/projects/git/.git/rebase-merge/git-rebase-todoquot; 14L, 472C
  223. 223. # This is a combination of 3 commits. # The first commit's message is: git apply --directory broken for new files # This is the 2nd commit message: git diff <tree>{3,}: do not reverse order of args # This is the 3rd commit message: test-lib: fix broken printf # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Author: Jeff King <peff@peff.net> # # Not currently on any branch. # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: builtin-apply.c # modified: builtin-diff.c # modified: t/t4013-diff-various.sh # new file: t/t4013/diff.diff_master_master^_side # modified: t/t4128-apply-root.sh # modified: t/test-lib.sh # ~ ~ quot;.git/COMMIT_EDITMSGquot; 39L, 1454C
  224. 224. # This is a combination of 3 commits. # The first commit's message is: git apply --directory broken for new files # This is the 2nd commit message: git diff <tree>{3,}: do not reverse order of args # This is the 3rd commit message: test-lib: fix broken printf # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Author: Jeff King <peff@peff.net> # # Not currently on any branch. # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: builtin-apply.c # modified: builtin-diff.c # modified: t/t4013-diff-various.sh # new file: t/t4013/diff.diff_master_master^_side # modified: t/t4128-apply-root.sh # modified: t/test-lib.sh # ~ ~ quot;.git/COMMIT_EDITMSGquot; 39L, 1454C
  225. 225. # This is a combination of 3 commits. # The first commit's message is: git apply --directory broken for new files # This is the 2nd commit message: git diff <tree>{3,}: do not reverse order of args # This is the 3rd commit message: test-lib: fix broken printf # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Author: Jeff King <peff@peff.net> # # Not currently on any branch. # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: builtin-apply.c # modified: builtin-diff.c # modified: t/t4013-diff-various.sh # new file: t/t4013/diff.diff_master_master^_side # modified: t/t4128-apply-root.sh # modified: t/test-lib.sh # ~ ~ quot;.git/COMMIT_EDITMSGquot; 39L, 1454C
  226. 226. # This is a combination of 3 commits. # The first commit's message is: git apply --directory broken for new files # This is the 2nd commit message: git diff <tree>{3,}: do not reverse order of args # This is the 3rd commit message: test-lib: fix broken printf # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Author: Jeff King <peff@peff.net> # # Not currently on any branch. # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: builtin-apply.c # modified: builtin-diff.c # modified: t/t4013-diff-various.sh # new file: t/t4013/diff.diff_master_master^_side # modified: t/t4128-apply-root.sh # modified: t/test-lib.sh # ~ ~ quot;.git/COMMIT_EDITMSGquot; 39L, 1454C
  227. 227. C4 C3 default C2 C5 C1 C0
  228. 228. The Perils
  229. 229. scott jessica default C1 C0
  230. 230. scott jessica default C4 C3 C2 default scott/default C1 C1 C0 C0
  231. 231. scott jessica default scott/default default C7 C7 C4 C6 C6 C3 C5 C5 C2 C1 C1 C0 C0
  232. 232. scott jessica default C8 scott/default default C7 C7 C4 C6 C6 C3 C5 C5 C2 C1 C1 C0 C0
  233. 233. scott jessica default C8 scott/default default C7 C7 C7' C4 C6 C6 C6' C3 C5 C5 C5' C2 C1 C1 C0 C0
  234. 234. scott jessica default C8 scott/default default C7' C7 C7 C7' C4 C6' C6 C6 C6' C3 C5' C5 C5 C5' C2 C1 C1 C0 C0
  235. 235. scott jessica default C9 C8 scott/default default C7' C7 C7 C7' C4 C6' C6 C6 C6' C3 C5' C5 C5 C5' C2 C1 C1 C0 C0
  236. 236. Filter Branch History Revision on Steroids
  237. 237. remove all instances of a file from every commit
  238. 238. git filter-branch --tree-filter 'rm -f filename' HEAD
  239. 239. change your email in all commits
  240. 240. git filter-branch --env-filter quot;export GIT_AUTHOR_EMAIL=you@email.comquot; HEAD
  241. 241. git filter-branch --env-filter quot;export GIT_AUTHOR_EMAIL=you@email.comquot; origin/master..HEAD
  242. 242. Subtree Merging
  243. 243. Alternative to Submodules
  244. 244. $ ls README rack_app.rb $ git remote add rack_remote git@github.com:schacon/rack.git $ git fetch rack_remote warning: no common commits remote: Counting objects: 3184, done. remote: Compressing objects: 100% (1465/1465), done. remote: Total 3184 (delta 1952), reused 2770 (delta 1675) Receiving objects: 100% (3184/3184), 677.42 KiB | 4 KiB/s, do Resolving deltas: 100% (1952/1952), done. From git@github.com:schacon/rack * [new branch] master -> rack_remote/master $ git checkout -b rack_branch rack_remote/master Branch rack_branch set up to track remote branch refs/remotes Switched to a new branch quot;rack_branchquot; $ ls AUTHORS KNOWN-ISSUES Rakefile contrib lib COPYING README bin example test
  245. 245. master C3 C2 C1 C0
  246. 246. $ ls README rack_app.rb $ git remote add rack_remote git@github.com:schacon/rack.git $ git fetch rack_remote warning: no common commits remote: Counting objects: 3184, done. remote: Compressing objects: 100% (1465/1465), done. remote: Total 3184 (delta 1952), reused 2770 (delta 1675) Receiving objects: 100% (3184/3184), 677.42 KiB | 4 KiB/s, do Resolving deltas: 100% (1952/1952), done. From git@github.com:schacon/rack * [new branch] master -> rack_remote/master $ git checkout -b rack_branch rack_remote/master Branch rack_branch set up to track remote branch refs/remotes Switched to a new branch quot;rack_branchquot; $ ls AUTHORS KNOWN-ISSUES Rakefile contrib lib COPYING README bin example test
  247. 247. $ ls README rack_app.rb $ git remote add rack_remote git@github.com:schacon/rack.git $ git fetch rack_remote warning: no common commits remote: Counting objects: 3184, done. remote: Compressing objects: 100% (1465/1465), done. remote: Total 3184 (delta 1952), reused 2770 (delta 1675) Receiving objects: 100% (3184/3184), 677.42 KiB | 4 KiB/s, do Resolving deltas: 100% (1952/1952), done. From git@github.com:schacon/rack * [new branch] master -> rack_remote/master $ git checkout -b rack_branch rack_remote/master Branch rack_branch set up to track remote branch refs/remotes Switched to a new branch quot;rack_branchquot; $ ls AUTHORS KNOWN-ISSUES Rakefile contrib lib COPYING README bin example test
  248. 248. $ ls README rack_app.rb $ git remote add rack_remote git@github.com:schacon/rack.git $ git fetch rack_remote warning: no common commits remote: Counting objects: 3184, done. remote: Compressing objects: 100% (1465/1465), done. remote: Total 3184 (delta 1952), reused 2770 (delta 1675) Receiving objects: 100% (3184/3184), 677.42 KiB | 4 KiB/s, do Resolving deltas: 100% (1952/1952), done. From git@github.com:schacon/rack * [new branch] master -> rack_remote/master $ git checkout -b rack_branch rack_remote/master Branch rack_branch set up to track remote branch refs/remotes Switched to a new branch quot;rack_branchquot; $ ls AUTHORS KNOWN-ISSUES Rakefile contrib lib COPYING README bin example test
  249. 249. $ ls README rack_app.rb $ git remote add rack_remote git@github.com:schacon/rack.git $ git fetch rack_remote warning: no common commits remote: Counting objects: 3184, done. remote: Compressing objects: 100% (1465/1465), done. remote: Total 3184 (delta 1952), reused 2770 (delta 1675) Receiving objects: 100% (3184/3184), 677.42 KiB | 4 KiB/s, do Resolving deltas: 100% (1952/1952), done. From git@github.com:schacon/rack * [new branch] master -> rack_remote/master $ git checkout -b rack_branch rack_remote/master Branch rack_branch set up to track remote branch refs/remotes Switched to a new branch quot;rack_branchquot; $ ls AUTHORS KNOWN-ISSUES Rakefile contrib lib COPYING README bin example test
  250. 250. $ ls README rack_app.rb $ git remote add rack_remote git@github.com:schacon/rack.git $ git fetch rack_remote warning: no common commits remote: Counting objects: 3184, done. remote: Compressing objects: 100% (1465/1465), done. remote: Total 3184 (delta 1952), reused 2770 (delta 1675) Receiving objects: 100% (3184/3184), 677.42 KiB | 4 KiB/s, do Resolving deltas: 100% (1952/1952), done. From git@github.com:schacon/rack * [new branch] master -> rack_remote/master $ git checkout -b rack_branch rack_remote/master Branch rack_branch set up to track remote branch refs/remotes Switched to a new branch quot;rack_branchquot; $ ls AUTHORS KNOWN-ISSUES Rakefile contrib lib COPYING README bin example test
  251. 251. $ ls README rack_app.rb $ git remote add rack_remote git@github.com:schacon/rack.git $ git fetch rack_remote warning: no common commits remote: Counting objects: 3184, done. remote: Compressing objects: 100% (1465/1465), done. remote: Total 3184 (delta 1952), reused 2770 (delta 1675) Receiving objects: 100% (3184/3184), 677.42 KiB | 4 KiB/s, do Resolving deltas: 100% (1952/1952), done. From git@github.com:schacon/rack * [new branch] master -> rack_remote/master $ git checkout -b rack_branch rack_remote/master Branch rack_branch set up to track remote branch refs/remotes Switched to a new branch quot;rack_branchquot; $ ls AUTHORS KNOWN-ISSUES Rakefile contrib lib COPYING README bin example test
  252. 252. $ ls README rack_app.rb $ git remote add rack_remote git@github.com:schacon/rack.git $ git fetch rack_remote warning: no common commits remote: Counting objects: 3184, done. remote: Compressing objects: 100% (1465/1465), done. remote: Total 3184 (delta 1952), reused 2770 (delta 1675) Receiving objects: 100% (3184/3184), 677.42 KiB | 4 KiB/s, do Resolving deltas: 100% (1952/1952), done. From git@github.com:schacon/rack * [new branch] master -> rack_remote/master $ git checkout -b rack_branch rack_remote/master Branch rack_branch set up to track remote branch refs/remotes Switched to a new branch quot;rack_branchquot; $ ls AUTHORS KNOWN-ISSUES Rakefile contrib lib COPYING README bin example test
  253. 253. $ ls README rack_app.rb $ git remote add rack_remote git@github.com:schacon/rack.git $ git fetch rack_remote warning: no common commits remote: Counting objects: 3184, done. remote: Compressing objects: 100% (1465/1465), done. remote: Total 3184 (delta 1952), reused 2770 (delta 1675) Receiving objects: 100% (3184/3184), 677.42 KiB | 4 KiB/s, do Resolving deltas: 100% (1952/1952), done. From git@github.com:schacon/rack * [new branch] master -> rack_remote/master $ git checkout -b rack_branch rack_remote/master Branch rack_branch set up to track remote branch refs/remotes Switched to a new branch quot;rack_branchquot; $ ls AUTHORS KNOWN-ISSUES Rakefile contrib lib COPYING README bin example test
  254. 254. master C3 rack_branch C6 rack_remote/master C2 C5 C1 C0 C4
  255. 255. $ git checkout master $ ls README rack_app.rb $ git checkout rack_branch $ ls AUTHORS KNOWN-ISSUES Rakefile contrib lib COPYING README bin example test
  256. 256. $ git checkout master $ ls README rack_app.rb $ git checkout rack_branch $ ls AUTHORS KNOWN-ISSUES Rakefile contrib lib COPYING README bin example test
  257. 257. $ git checkout master $ ls README rack_app.rb $ git checkout rack_branch $ ls AUTHORS KNOWN-ISSUES Rakefile contrib lib COPYING README bin example test
  258. 258. $ git checkout master $ ls README rack_app.rb $ git checkout rack_branch $ ls AUTHORS KNOWN-ISSUES Rakefile contrib lib COPYING README bin example test
  259. 259. checkout ‘rack’ into my project
  260. 260. $ git read-tree --prefix=rack/ -u rack_branch $ ls README rack rack_app.rb $ ls rack AUTHORS KNOWN-ISSUES Rakefile contrib lib COPYING README bin example test $ git add rack $ git commit -m 'added rack code' [master 0839fd8] added rack code 108 files changed, 10334 insertions(+), 0 dele create mode 100644 rack/AUTHORS create mode 100644 rack/COPYING ... create mode 100644 rack/test/testrequest.rb
  261. 261. $ git read-tree --prefix=rack/ -u rack_branch $ ls README rack rack_app.rb $ ls rack AUTHORS KNOWN-ISSUES Rakefile contrib lib COPYING README bin example test $ git add rack $ git commit -m 'added rack code' [master 0839fd8] added rack code 108 files changed, 10334 insertions(+), 0 dele create mode 100644 rack/AUTHORS create mode 100644 rack/COPYING ... create mode 100644 rack/test/testrequest.rb
  262. 262. $ git read-tree --prefix=rack/ -u rack_branch $ ls README rack rack_app.rb $ ls rack AUTHORS KNOWN-ISSUES Rakefile contrib lib COPYING README bin example test $ git add rack $ git commit -m 'added rack code' [master 0839fd8] added rack code 108 files changed, 10334 insertions(+), 0 dele create mode 100644 rack/AUTHORS create mode 100644 rack/COPYING ... create mode 100644 rack/test/testrequest.rb
  263. 263. $ git read-tree --prefix=rack/ -u rack_branch $ ls README rack rack_app.rb $ ls rack AUTHORS KNOWN-ISSUES Rakefile contrib lib COPYING README bin example test $ git add rack $ git commit -m 'added rack code' [master 0839fd8] added rack code 108 files changed, 10334 insertions(+), 0 dele create mode 100644 rack/AUTHORS create mode 100644 rack/COPYING ... create mode 100644 rack/test/testrequest.rb
  264. 264. $ git read-tree --prefix=rack/ -u rack_branch $ ls README rack rack_app.rb $ ls rack AUTHORS KNOWN-ISSUES Rakefile contrib lib COPYING README bin example test $ git add rack $ git commit -m 'added rack code' [master 0839fd8] added rack code 108 files changed, 10334 insertions(+), 0 dele create mode 100644 rack/AUTHORS create mode 100644 rack/COPYING ... create mode 100644 rack/test/testrequest.rb
  265. 265. $ git read-tree --prefix=rack/ -u rack_branch $ ls README rack rack_app.rb $ ls rack AUTHORS KNOWN-ISSUES Rakefile contrib lib COPYING README bin example test $ git add rack $ git commit -m 'added rack code' [master 0839fd8] added rack code 108 files changed, 10334 insertions(+), 0 dele create mode 100644 rack/AUTHORS create mode 100644 rack/COPYING ... create mode 100644 rack/test/testrequest.rb
  266. 266. edit a file in rack
  267. 267. $ vim rack/lib/rack.rb $ git commit -am 'added awesome to rack' [master b1b77ee] added awesome to rack 1 files changed, 1 insertions(+), 0 deletions(-) $ git checkout rack_branch $ git merge --squash -s subtree --no-commit master Squash commit -- not updating HEAD Automatic merge went well; stopped before committin $ git status # On branch rack_branch # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: lib/rack.rb #
  268. 268. $ vim rack/lib/rack.rb $ git commit -am 'added awesome to rack' [master b1b77ee] added awesome to rack 1 files changed, 1 insertions(+), 0 deletions(-) $ git checkout rack_branch $ git merge --squash -s subtree --no-commit master Squash commit -- not updating HEAD Automatic merge went well; stopped before committin $ git status # On branch rack_branch # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: lib/rack.rb #
  269. 269. $ vim rack/lib/rack.rb $ git commit -am 'added awesome to rack' [master b1b77ee] added awesome to rack 1 files changed, 1 insertions(+), 0 deletions(-) $ git checkout rack_branch $ git merge --squash -s subtree --no-commit master Squash commit -- not updating HEAD Automatic merge went well; stopped before committin $ git status # On branch rack_branch # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: lib/rack.rb #
  270. 270. submit the change back to rack
  271. 271. $ vim rack/lib/rack.rb $ git commit -am 'added awesome to rack' [master b1b77ee] added awesome to rack 1 files changed, 1 insertions(+), 0 deletions(-) $ git checkout rack_branch $ git merge --squash -s subtree --no-commit master Squash commit -- not updating HEAD Automatic merge went well; stopped before committin $ git status # On branch rack_branch # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: lib/rack.rb #
  272. 272. git merge -s subtree
  273. 273. $ vim rack/lib/rack.rb $ git commit -am 'added awesome to rack' [master b1b77ee] added awesome to rack 1 files changed, 1 insertions(+), 0 deletions(-) $ git checkout rack_branch $ git merge -s subtree --no-commit --squash master Squash commit -- not updating HEAD Automatic merge went well; stopped before committin $ git status # On branch rack_branch # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: lib/rack.rb #
  274. 274. $ vim rack/lib/rack.rb $ git commit -am 'added awesome to rack' [master b1b77ee] added awesome to rack 1 files changed, 1 insertions(+), 0 deletions(-) $ git checkout rack_branch $ git merge -s subtree --no-commit --squash master Squash commit -- not updating HEAD Automatic merge went well; stopped before committin $ git status # On branch rack_branch # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: lib/rack.rb #
  275. 275. $ vim rack/lib/rack.rb $ git commit -am 'added awesome to rack' [master b1b77ee] added awesome to rack 1 files changed, 1 insertions(+), 0 deletions(-) $ git checkout rack_branch $ git merge -s subtree --no-commit --squash master Squash commit -- not updating HEAD Automatic merge went well; stopped before committin $ git status # On branch rack_branch # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: lib/rack.rb #
  276. 276. $ vim rack/lib/rack.rb $ git commit -am 'added awesome to rack' [master b1b77ee] added awesome to rack 1 files changed, 1 insertions(+), 0 deletions(-) $ git checkout rack_branch $ git merge -s subtree --no-commit --squash master Squash commit -- not updating HEAD Automatic merge went well; stopped before committin $ git status # On branch rack_branch # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: lib/rack.rb #
  277. 277. $ vim rack/lib/rack.rb $ git commit -am 'added awesome to rack' [master b1b77ee] added awesome to rack 1 files changed, 1 insertions(+), 0 deletions(-) $ git checkout rack_branch $ git merge -s subtree --no-commit --squash master Squash commit -- not updating HEAD Automatic merge went well; stopped before committin $ git status # On branch rack_branch # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: lib/rack.rb #
  278. 278. $ vim rack/lib/rack.rb $ git commit -am 'added awesome to rack' [master b1b77ee] added awesome to rack 1 files changed, 1 insertions(+), 0 deletions(-) $ git checkout rack_branch $ git merge -s subtree --no-commit --squash master Squash commit -- not updating HEAD Automatic merge went well; stopped before committin $ git status # On branch rack_branch # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: lib/rack.rb #
  279. 279. $ vim rack/lib/rack.rb $ git commit -am 'added awesome to rack' [master b1b77ee] added awesome to rack 1 files changed, 1 insertions(+), 0 deletions(-) $ git checkout rack_branch $ git merge -s subtree --no-commit --squash master Squash commit -- not updating HEAD Automatic merge went well; stopped before committin $ git status # On branch rack_branch # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: lib/rack.rb #
  280. 280. $ vim rack/lib/rack.rb $ git commit -am 'added awesome to rack' [master b1b77ee] added awesome to rack 1 files changed, 1 insertions(+), 0 deletions(-) $ git checkout rack_branch $ git merge -s subtree --no-commit --squash master Squash commit -- not updating HEAD Automatic merge went well; stopped before committin $ git status # On branch rack_branch # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: lib/rack.rb #
  281. 281. $ vim rack/lib/rack.rb $ git commit -am 'added awesome to rack' [master b1b77ee] added awesome to rack 1 files changed, 1 insertions(+), 0 deletions(-) $ git checkout rack_branch $ git merge -s subtree --no-commit --squash master Squash commit -- not updating HEAD Automatic merge went well; stopped before committin $ git status # On branch rack_branch # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: lib/rack.rb #
  282. 282. git merge -s subtree --no-commit --squash master
  283. 283. git merge -s subtree --no-commit --squash master really?
  284. 284. Tim Dysinger http://dysinger.net/2008/04/29/ replacing-braid-or-piston-for-git-with-40-lines-of-rake/
  285. 285. Tim Dysinger http://dysinger.net/2008/04/29/ replacing-braid-or-piston-for-git-with-40-lines-of-rake/ http://tinyurl.com/braidgit
  286. 286. Patch Staging
  287. 287. git add -p
  288. 288. $ git status # On branch master # Changed but not updated: # (use quot;git add <file>...quot; to update what wi # (use quot;git checkout -- <file>...quot; to discar # # modified: ticgit.gemspec # no changes added to commit (use quot;git addquot; and/
  289. 289. $ git status # On branch master # Changed but not updated: # (use quot;git add <file>...quot; to update what wi # (use quot;git checkout -- <file>...quot; to discar # # modified: ticgit.gemspec # no changes added to commit (use quot;git addquot; and/
  290. 290. $ git add -p diff --git a/ticgit.gemspec b/ticgit.gemspec index 9c32bd4..a44667b 100644 --- a/ticgit.gemspec +++ b/ticgit.gemspec @@ -1,7 +1,7 @@ Gem::Specification.new do |s| s.platform = Gem::Platform::RUBY s.name = quot;ticgitquot; - s.version = quot;0.3.5quot; + s.version = quot;0.3.6quot; s.date = quot;2008-05-10quot; s.author = quot;Scott Chaconquot; s.email = quot;schacon@gmail.comquot; Stage this hunk [y,n,a,d,/,j,J,g,e,?]? y
  291. 291. $ git add -p diff --git a/ticgit.gemspec b/ticgit.gemspec index 9c32bd4..a44667b 100644 --- a/ticgit.gemspec +++ b/ticgit.gemspec @@ -1,7 +1,7 @@ Gem::Specification.new do |s| s.platform = Gem::Platform::RUBY s.name = quot;ticgitquot; - s.version = quot;0.3.5quot; + s.version = quot;0.3.6quot; s.date = quot;2008-05-10quot; s.author = quot;Scott Chaconquot; s.email = quot;schacon@gmail.comquot; Stage this hunk [y,n,a,d,/,j,J,g,e,?]? y
  292. 292. $ git add -p diff --git a/ticgit.gemspec b/ticgit.gemspec index 9c32bd4..a44667b 100644 --- a/ticgit.gemspec +++ b/ticgit.gemspec @@ -1,7 +1,7 @@ Gem::Specification.new do |s| s.platform = Gem::Platform::RUBY s.name = quot;ticgitquot; - s.version = quot;0.3.5quot; + s.version = quot;0.3.6quot; s.date = quot;2008-05-10quot; s.author = quot;Scott Chaconquot; s.email = quot;schacon@gmail.comquot; Stage this hunk [y,n,a,d,/,j,J,g,e,?]?
  293. 293. $ git add -p diff --git a/ticgit.gemspec b/ticgit.gemspec index 9c32bd4..a44667b 100644 --- a/ticgit.gemspec +++ b/ticgit.gemspec @@ -1,7 +1,7 @@ Gem::Specification.new do |s| s.platform = Gem::Platform::RUBY s.name = quot;ticgitquot; - s.version = quot;0.3.5quot; + s.version = quot;0.3.6quot; s.date = quot;2008-05-10quot; s.author = quot;Scott Chaconquot; s.email = quot;schacon@gmail.comquot; Stage this hunk [y,n,a,d,/,j,J,g,e,?]? y
  294. 294. @@ -9,9 +9,10 @@ Gem::Specification.new do |s| s.files = [quot;lib/ticgit/base.rbquot;, quot;lib/ticgit/ quot;lib/ticgit/comment.rbquot;, quot;lib/ticgit/ticket.rbquot;, quot;lib/ ticgit.rbquot;, quot;bin/tiquot;, quot;bin/ticgitwebquot;] s.bindir = 'bin' - s.executables << quot;tiquot; - s.executables << quot;ticgitwebquot; + s.executables = [quot;tiquot;, quot;ticgitwebquot;] + s.default_executable = %q{ti} s.homepage = quot;http://github/schacon/ticgitquot; s.require_paths = [quot;libquot;, quot;binquot;] + s.specification_version = 2 if s.respond_to? :specification_version= end Stage this hunk [y,n,a,d,/,K,g,s,e,?]?
  295. 295. @@ -9,9 +9,10 @@ Gem::Specification.new do |s| s.files = [quot;lib/ticgit/base.rbquot;, quot;lib/ticgit/ quot;lib/ticgit/comment.rbquot;, quot;lib/ticgit/ticket.rbquot;, quot;lib/ ticgit.rbquot;, quot;bin/tiquot;, quot;bin/ticgitwebquot;] s.bindir = 'bin' - s.executables << quot;tiquot; - s.executables << quot;ticgitwebquot; + s.executables = [quot;tiquot;, quot;ticgitwebquot;] + s.default_executable = %q{ti} s.homepage = quot;http://github/schacon/ticgitquot; s.require_paths = [quot;libquot;, quot;binquot;] + s.specification_version = 2 if s.respond_to? :specification_version= end Stage this hunk [y,n,a,d,/,K,g,s,e,?]?
  296. 296. @@ -9,9 +9,10 @@ Gem::Specification.new do |s| s.files = [quot;lib/ticgit/base.rbquot;, quot;lib/ticgit/ quot;lib/ticgit/comment.rbquot;, quot;lib/ticgit/ticket.rbquot;, quot;lib/ ticgit.rbquot;, quot;bin/tiquot;, quot;bin/ticgitwebquot;] s.bindir = 'bin' - s.executables << quot;tiquot; - s.executables << quot;ticgitwebquot; + s.executables = [quot;tiquot;, quot;ticgitwebquot;] + s.default_executable = %q{ti} s.homepage = quot;http://github/schacon/ticgitquot; s.require_paths = [quot;libquot;, quot;binquot;] + s.specification_version = 2 if s.respond_to? :specification_version= end Stage this hunk [y,n,a,d,/,K,g,s,e,?]? n
  297. 297. $ git status # On branch master # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: ticgit.gemspec # # Changed but not updated: # (use quot;git add <file>...quot; to update what will be com # (use quot;git checkout -- <file>...quot; to discard changes # # modified: ticgit.gemspec #
  298. 298. $ git status # On branch master # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: ticgit.gemspec # # Changed but not updated: # (use quot;git add <file>...quot; to update what will be com # (use quot;git checkout -- <file>...quot; to discard changes # # modified: ticgit.gemspec #
  299. 299. $ git status # On branch master # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: ticgit.gemspec # # Changed but not updated: # (use quot;git add <file>...quot; to update what will be com # (use quot;git checkout -- <file>...quot; to discard changes # # modified: ticgit.gemspec #
  300. 300. $ git status # On branch master # Changes to be committed: # (use quot;git reset HEAD <file>...quot; to unstage) # # modified: ticgit.gemspec # # Changed but not updated: # (use quot;git add <file>...quot; to update what will be com # (use quot;git checkout -- <file>...quot; to discard changes # # modified: ticgit.gemspec #
  301. 301. partially stage files
  302. 302. git add -p
  303. 303. Debugging
  304. 304. Annotation
  305. 305. git blame
  306. 306. git blame ie: “what dumbass did this? oh, it was me...”
  307. 307. git blame daemon.c 979e32fa (Randal L. Schwartz 2005-10-25 16:29:09 -0700 1) #include quot;cache.hquot; 85023577 (Junio C Hamano 2006-12-19 14:34:12 -0800 2) #include quot;pkt-line.hquot; 77cb17e9 (Michal Ostrowski 2006-01-10 21:12:17 -0500 3) #include quot;exec_cmd.hquot; 49ba83fb (Jon Loeliger 2006-09-19 20:31:51 -0500 4) #include quot;interpolate.hquot; f8ff0c06 (Petr Baudis 2005-09-22 11:25:28 +0200 5) 85023577 (Junio C Hamano 2006-12-19 14:34:12 -0800 6) #include <syslog.h> 85023577 (Junio C Hamano 2006-12-19 14:34:12 -0800 7) 695dffe2 (Johannes Schindelin 2006-09-28 12:00:35 +0200 8) #ifndef HOST_NAME_MAX 695dffe2 (Johannes Schindelin 2006-09-28 12:00:35 +0200 9) #define HOST_NAME_MAX 256 695dffe2 (Johannes Schindelin 2006-09-28 12:00:35 +0200 10) #endif 695dffe2 (Johannes Schindelin 2006-09-28 12:00:35 +0200 11) 415e7b87 (Patrick Welche 2007-10-18 18:17:39 +0100 12) #ifndef NI_MAXSERV 415e7b87 (Patrick Welche 2007-10-18 18:17:39 +0100 13) #define NI_MAXSERV 32 415e7b87 (Patrick Welche 2007-10-18 18:17:39 +0100 14) #endif 415e7b87 (Patrick Welche 2007-10-18 18:17:39 +0100 15) 9048fe1c (Petr Baudis 2005-09-24 16:13:01 +0200 16) static int log_syslog; f8ff0c06 (Petr Baudis 2005-09-22 11:25:28 +0200 17) static int verbose; 1955fabf (Mark Wooding 2006-02-03 20:27:04 +0000 18) static int reuseaddr; f8ff0c06 (Petr Baudis 2005-09-22 11:25:28 +0200 19) 960deccb (H. Peter Anvin 2005-10-19 14:27:01 -0700 20) static const char daemon_usage[] = 1b1dd23f (Stephan Beyer 2008-07-13 15:36:15 +0200 21) quot;git daemon [--verbose] [--syslog] [ 3bd62c21 (Stephen R. van den Berg 2008-08-14 20:02:20 +0200 22) quot; [--timeout=n] [--init-ti 3bd62c21 (Stephen R. van den Berg 2008-08-14 20:02:20 +0200 23) quot; [--strict-paths] [--base 73a7a656 (Jens Axboe 2007-07-27 14:00:29 -0700 24) quot; [--user-path | --user-pa 49ba83fb (Jon Loeliger 2006-09-19 20:31:51 -0500 25) quot; [--interpolated-path=pat 678dac6b (Tilman Sauerbeck 2006-08-22 19:37:41 +0200 26) quot; [--reuseaddr] [--detach] d9edcbd6 (Junio C Hamano 2006-09-07 01:40:04 -0700 27) quot; [--[enable|disable|allow dd467629 (Jon Loeliger 2006-09-26 09:47:43 -0500 28) quot; [--inetd | [--listen=hos dd467629 (Jon Loeliger 2006-09-26 09:47:43 -0500 29) quot; [--user=user dd467629 (Jon Loeliger 2006-09-26 09:47:43 -0500 30) quot; [directory...]quot;; 4ae95682 (H. Peter Anvin 2005-09-26 19:10:55 -0700 31) 4ae95682 (H. Peter Anvin 2005-09-26 19:10:55 -0700 32) /* List of acceptable pathname prefi 96f1e58f (David Rientjes 2006-08-15 10:23:48 -0700 33) static char **ok_paths;
  308. 308. git blame daemon.c 979e32fa (Randal L. Schwartz 2005-10-25 16:29:09 -0700 1) #include quot;cache.hquot; 85023577 (Junio C Hamano 2006-12-19 14:34:12 -0800 2) #include quot;pkt-line.hquot; 77cb17e9 (Michal Ostrowski 2006-01-10 21:12:17 -0500 3) #include quot;exec_cmd.hquot; 49ba83fb (Jon Loeliger 2006-09-19 20:31:51 -0500 4) #include quot;interpolate.hquot; f8ff0c06 (Petr Baudis 2005-09-22 11:25:28 +0200 5) 85023577 (Junio C Hamano 2006-12-19 14:34:12 -0800 6) #include <syslog.h> 85023577 (Junio C Hamano 2006-12-19 14:34:12 -0800 7) 695dffe2 (Johannes Schindelin 2006-09-28 12:00:35 +0200 8) #ifndef HOST_NAME_MAX 695dffe2 (Johannes Schindelin 2006-09-28 12:00:35 +0200 9) #define HOST_NAME_MAX 256 695dffe2 (Johannes Schindelin 2006-09-28 12:00:35 +0200 10) #endif 695dffe2 (Johannes Schindelin 2006-09-28 12:00:35 +0200 11) 415e7b87 (Patrick Welche 2007-10-18 18:17:39 +0100 12) #ifndef NI_MAXSERV 415e7b87 (Patrick Welche 2007-10-18 18:17:39 +0100 13) #define NI_MAXSERV 32 415e7b87 (Patrick Welche 2007-10-18 18:17:39 +0100 14) #endif 415e7b87 (Patrick Welche 2007-10-18 18:17:39 +0100 15) 9048fe1c (Petr Baudis 2005-09-24 16:13:01 +0200 16) static int log_syslog; f8ff0c06 (Petr Baudis 2005-09-22 11:25:28 +0200 17) static int verbose; 1955fabf (Mark Wooding 2006-02-03 20:27:04 +0000 18) static int reuseaddr; f8ff0c06 (Petr Baudis 2005-09-22 11:25:28 +0200 19) 960deccb (H. Peter Anvin 2005-10-19 14:27:01 -0700 20) static const char daemon_usage[] = 1b1dd23f (Stephan Beyer 2008-07-13 15:36:15 +0200 21) quot;git daemon [--verbose] [--syslog] [ 3bd62c21 (Stephen R. van den Berg 2008-08-14 20:02:20 +0200 22) quot; [--timeout=n] [--init-ti 3bd62c21 (Stephen R. van den Berg 2008-08-14 20:02:20 +0200 23) quot; [--strict-paths] [--base 73a7a656 (Jens Axboe 2007-07-27 14:00:29 -0700 24) quot; [--user-path | --user-pa 49ba83fb (Jon Loeliger 2006-09-19 20:31:51 -0500 25) quot; [--interpolated-path=pat 678dac6b (Tilman Sauerbeck 2006-08-22 19:37:41 +0200 26) quot; [--reuseaddr] [--detach] d9edcbd6 (Junio C Hamano 2006-09-07 01:40:04 -0700 27) quot; [--[enable|disable|allow dd467629 (Jon Loeliger 2006-09-26 09:47:43 -0500 28) quot; [--inetd | [--listen=hos dd467629 (Jon Loeliger 2006-09-26 09:47:43 -0500 29) quot; [--user=user dd467629 (Jon Loeliger 2006-09-26 09:47:43 -0500 30) quot; [directory...]quot;; 4ae95682 (H. Peter Anvin 2005-09-26 19:10:55 -0700 31) 4ae95682 (H. Peter Anvin 2005-09-26 19:10:55 -0700 32) /* List of acceptable pathname prefi 96f1e58f (David Rientjes 2006-08-15 10:23:48 -0700 33) static char **ok_paths;
  309. 309. git blame daemon.c 979e32fa (Randal L. Schwartz 2005-10-25 16:29:09 -0700 1) #include quot;cache.hquot; 85023577 (Junio C Hamano 2006-12-19 14:34:12 -0800 2) #include quot;pkt-line.hquot; 77cb17e9 (Michal Ostrowski 2006-01-10 21:12:17 -0500 3) #include quot;exec_cmd.hquot; 49ba83fb (Jon Loeliger 2006-09-19 20:31:51 -0500 4) #include quot;interpolate.hquot; f8ff0c06 (Petr Baudis 2005-09-22 11:25:28 +0200 5) 85023577 (Junio C Hamano 2006-12-19 14:34:12 -0800 6) #include <syslog.h> 85023577 (Junio C Hamano 2006-12-19 14:34:12 -0800 7) 695dffe2 (Johannes Schindelin 2006-09-28 12:00:35 +0200 8) #ifndef HOST_NAME_MAX 695dffe2 (Johannes Schindelin 2006-09-28 12:00:35 +0200 9) #define HOST_NAME_MAX 256 695dffe2 (Johannes Schindelin 2006-09-28 12:00:35 +0200 10) #endif 695dffe2 (Johannes Schindelin 2006-09-28 12:00:35 +0200 11) 415e7b87 (Patrick Welche 2007-10-18 18:17:39 +0100 12) #ifndef NI_MAXSERV 415e7b87 (Patrick Welche 2007-10-18 18:17:39 +0100 13) #define NI_MAXSERV 32 415e7b87 (Patrick Welche 2007-10-18 18:17:39 +0100 14) #endif 415e7b87 (Patrick Welche 2007-10-18 18:17:39 +0100 15) 9048fe1c (Petr Baudis 2005-09-24 16:13:01 +0200 16) static int log_syslog; f8ff0c06 (Petr Baudis 2005-09-22 11:25:28 +0200 17) static int verbose; 1955fabf (Mark Wooding 2006-02-03 20:27:04 +0000 18) static int reuseaddr; f8ff0c06 (Petr Baudis 2005-09-22 11:25:28 +0200 19) 960deccb (H. Peter Anvin 2005-10-19 14:27:01 -0700 20) static const char daemon_usage[] = 1b1dd23f (Stephan Beyer 2008-07-13 15:36:15 +0200 21) quot;git daemon [--verbose] [--syslog] [ 3bd62c21 (Stephen R. van den Berg 2008-08-14 20:02:20 +0200 22) quot; [--timeout=n] [--init-ti 3bd62c21 (Stephen R. van den Berg 2008-08-14 20:02:20 +0200 23) quot; [--strict-paths] [--base 73a7a656 (Jens Axboe 2007-07-27 14:00:29 -0700 24) quot; [--user-path | --user-pa 49ba83fb (Jon Loeliger 2006-09-19 20:31:51 -0500 25) quot; [--interpolated-path=pat 678dac6b (Tilman Sauerbeck 2006-08-22 19:37:41 +0200 26) quot; [--reuseaddr] [--detach] d9edcbd6 (Junio C Hamano 2006-09-07 01:40:04 -0700 27) quot; [--[enable|disable|allow dd467629 (Jon Loeliger 2006-09-26 09:47:43 -0500 28) quot; [--inetd | [--listen=hos dd467629 (Jon Loeliger 2006-09-26 09:47:43 -0500 29) quot; [--user=user dd467629 (Jon Loeliger 2006-09-26 09:47:43 -0500 30) quot; [directory...]quot;; 4ae95682 (H. Peter Anvin 2005-09-26 19:10:55 -0700 31) 4ae95682 (H. Peter Anvin 2005-09-26 19:10:55 -0700 32) /* List of acceptable pathname prefi 96f1e58f (David Rientjes 2006-08-15 10:23:48 -0700 33) static char **ok_paths;
  310. 310. git blame daemon.c 979e32fa (Randal L. Schwartz 2005-10-25 16:29:09 -0700 1) #include quot;cache.hquot; 85023577 (Junio C Hamano 2006-12-19 14:34:12 -0800 2) #include quot;pkt-line.hquot; 77cb17e9 (Michal Ostrowski 2006-01-10 21:12:17 -0500 3) #include quot;exec_cmd.hquot; 49ba83fb (Jon Loeliger 2006-09-19 20:31:51 -0500 4) #include quot;interpolate.hquot; f8ff0c06 (Petr Baudis 2005-09-22 11:25:28 +0200 5) 85023577 (Junio C Hamano 2006-12-19 14:34:12 -0800 6) #include <syslog.h> 85023577 (Junio C Hamano 2006-12-19 14:34:12 -0800 7) 695dffe2 (Johannes Schindelin 2006-09-28 12:00:35 +0200 8) #ifndef HOST_NAME_MAX 695dffe2 (Johannes Schindelin 2006-09-28 12:00:35 +0200 9) #define HOST_NAME_MAX 256 695dffe2 (Johannes Schindelin 2006-09-28 12:00:35 +0200 10) #endif 695dffe2 (Johannes Schindelin 2006-09-28 12:00:35 +0200 11) 415e7b87 (Patrick Welche 2007-10-18 18:17:39 +0100 12) #ifndef NI_MAXSERV 415e7b87 (Patrick Welche 2007-10-18 18:17:39 +0100 13) #define NI_MAXSERV 32 415e7b87 (Patrick Welche 2007-10-18 18:17:39 +0100 14) #endif 415e7b87 (Patrick Welche 2007-10-18 18:17:39 +0100 15) 9048fe1c (Petr Baudis 2005-09-24 16:13:01 +0200 16) static int log_syslog; f8ff0c06 (Petr Baudis 2005-09-22 11:25:28 +0200 17) static int verbose; 1955fabf (Mark Wooding 2006-02-03 20:27:04 +0000 18) static int reuseaddr; f8ff0c06 (Petr Baudis 2005-09-22 11:25:28 +0200 19) 960deccb (H. Peter Anvin 2005-10-19 14:27:01 -0700 20) static const char daemon_usage[] = 1b1dd23f (Stephan Beyer 2008-07-13 15:36:15 +0200 21) quot;git daemon [--verbose] [--syslog] [ 3bd62c21 (Stephen R. van den Berg 2008-08-14 20:02:20 +0200 22) quot; [--timeout=n] [--init-ti 3bd62c21 (Stephen R. van den Berg 2008-08-14 20:02:20 +0200 23) quot; [--strict-paths] [--base 73a7a656 (Jens Axboe 2007-07-27 14:00:29 -0700 24) quot; [--user-path | --user-pa 49ba83fb (Jon Loeliger 2006-09-19 20:31:51 -0500 25) quot; [--interpolated-path=pat 678dac6b (Tilman Sauerbeck 2006-08-22 19:37:41 +0200 26) quot; [--reuseaddr] [--detach] d9edcbd6 (Junio C Hamano 2006-09-07 01:40:04 -0700 27) quot; [--[enable|disable|allow dd467629 (Jon Loeliger 2006-09-26 09:47:43 -0500 28) quot; [--inetd | [--listen=hos dd467629 (Jon Loeliger 2006-09-26 09:47:43 -0500 29) quot; [--user=user dd467629 (Jon Loeliger 2006-09-26 09:47:43 -0500 30) quot; [directory...]quot;; 4ae95682 (H. Peter Anvin 2005-09-26 19:10:55 -0700 31) 4ae95682 (H. Peter Anvin 2005-09-26 19:10:55 -0700 32) /* List of acceptable pathname prefi 96f1e58f (David Rientjes 2006-08-15 10:23:48 -0700 33) static char **ok_paths;
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×