• Non ci sono risultati.

Git 101

N/A
N/A
Protected

Academic year: 2021

Condividi "Git 101"

Copied!
454
0
0

Testo completo

(1)

Git 101

Scott Chacon

(2)

Introduction

(3)

Me

(4)

Scott Chacon

(5)
(6)

git-scm.com

(7)
(8)

http://progit.org

(9)

schacon@gmail.com

(10)

@chacon

twitter

(11)

</me>

(12)

What is Git?

(13)

Git is an open source,

distributed version control system designed for speed

and efficiency

(14)

version control

(15)

version control

subversion (svn) mercurial (hg)

visual source safe bazaar

concurrent version system (cvs) perforce

(16)

version control

subversion (svn) mercurial (hg)

visual source safe bazaar

concurrent version system (cvs) perforce

SoS

(17)

version control

subversion (svn) mercurial (hg)

visual source safe bazaar

concurrent version system (cvs) perforce

“not bad” SoS

(18)

version control

subversion (svn) mercurial (hg)

visual source safe bazaar

concurrent version system (cvs) perforce

SoS

“kill self”

(19)

version control

subversion (svn) mercurial (hg)

visual source safe bazaar

concurrent version system (cvs) perforce

git

(20)

Git is an open source,

distributed version control system designed for speed

and efficiency

(21)

git-scm.com

(22)

Git is an open source,

distributed version control system designed for speed

and efficiency

(23)

Fully Distributed

(24)

(almost) everything is local

(25)

which means

everything is fast

every clone is a backup work offline

(26)

No Network Needed

Performing a diff Viewing file history Committing changes

Merging branches

Obtaining other revisions of a file Switching branches

(27)

Git is an open source,

distributed version control system designed for

speed and efficiency

(28)
(29)

Immutable

(30)

(almost) never removes data

(31)

Snapshots, not Patches

(32)

delta storage







    

    





















snapshot storage

(33)

delta storage







    

    





















snapshot storage

(34)

delta storage







    

    





















snapshot storage

(35)

delta storage







    

    





















snapshot storage

(36)

delta storage







    

    





















snapshot storage

(37)

delta storage







    

    





















snapshot storage

(38)

delta storage







    

    





















snapshot storage

(39)

delta storage







    

    





















snapshot storage

(40)

delta storage







    

    





















snapshot storage

(41)

delta storage







    

    





















snapshot storage

(42)

delta storage







    

    





















snapshot storage

(43)

delta storage







    

    





















snapshot storage

(44)

delta storage







    

    





















snapshot storage

(45)

delta storage







    

    





















snapshot storage

(46)

delta storage







    

    





















snapshot storage

(47)

Basic Git

(48)

First Steps

(49)

$ git config --global user.name “Scott Chacon”

$ git config --global user.email “schacon@gmail.com”

(50)

Getting a Repo

(51)

Create One

(52)

git init

(53)

$ touch hello_world.rb

$ git init

$ git add .

$ git commit -m ‘first commit’

(54)

$ touch hello_world.rb

$ git init

$ git add .

$ git commit -m ‘first commit’

(55)

$ tree -a .

|-- .git

| |-- HEAD

| |-- branches

| |-- config

| |-- description

| |-- hooks

| | |-- post-commit.sample

| | |-- post-receive.sample

| | |-- ...

| | |-- pre-rebase.sample

| | `-- update.sample

| |-- info

| | `-- exclude

| |-- objects

| | |-- info

| | `-- pack

| |-- refs

| | |-- heads

| | `-- tags

| `-- remotes

`-- hello_world.rb

11 directories, 25 files

(56)

$ tree -a .

|-- .git

| |-- HEAD

| |-- branches

| |-- config

| |-- description

| |-- hooks

| | |-- post-commit.sample

| | |-- post-receive.sample

| | |-- ...

| | |-- pre-rebase.sample

| | `-- update.sample

| |-- info

| | `-- exclude

| |-- objects

| | |-- info

| | `-- pack

| |-- refs

| | |-- heads

| | `-- tags

| `-- remotes

`-- hello_world.rb

11 directories, 25 files

(57)

$ tree -a .

|-- .git

| |-- HEAD

| |-- branches

| |-- config

| |-- description

| |-- hooks

| | |-- post-commit.sample

| | |-- post-receive.sample

| | |-- ...

| | |-- pre-rebase.sample

| | `-- update.sample

| |-- info

| | `-- exclude

| |-- objects

| | |-- info

| | `-- pack

| |-- refs

| | |-- heads

| | `-- tags

| `-- remotes

`-- hello_world.rb

11 directories, 25 files

(58)

$ touch hello_world.rb

$ git init

$ git add .

$ git commit -m ‘first commit’

(59)

$ touch hello_world.rb

$ git init

$ git add .

$ git commit -m ‘first commit’

(60)

$ tree -a .

|-- .git

| |-- COMMIT_EDITMSG

| |-- HEAD

| |-- branches

| |-- config

| |-- description

| |-- hooks

| | |-- applypatch-msg.sample

| | `-- update.sample

| |-- index

| |-- info

| | `-- exclude

| |-- logs

| | |-- HEAD

| | `-- refs

| | `-- heads

| | `-- master

| |-- objects

| | |-- 32/09658ac8d80bc9726d3a33d77e3dfc5fe6035e

| | |-- 53/9cd7886a627841d525a78d45cbc6396be20b41

| | |-- e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391

| | |-- info

| | `-- pack

| |-- refs

| | |-- heads

| | | `-- master

| | `-- tags

| `-- remotes

`-- hello_world.rb

17 directories, 33 files

(61)

$ tree -a .

|-- .git

| |-- COMMIT_EDITMSG

| |-- HEAD

| |-- branches

| |-- config

| |-- description

| |-- hooks

| | |-- applypatch-msg.sample

| | `-- update.sample

| |-- index

| |-- info

| | `-- exclude

| |-- logs

| | |-- HEAD

| | `-- refs

| | `-- heads

| | `-- master

| |-- objects

| | |-- 32/09658ac8d80bc9726d3a33d77e3dfc5fe6035e

| | |-- 53/9cd7886a627841d525a78d45cbc6396be20b41

| | |-- e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391

| | |-- info

| | `-- pack

| |-- refs

| | |-- heads

| | | `-- master

| | `-- tags

| `-- remotes

`-- hello_world.rb

17 directories, 33 files

(62)

$ tree -a .

|-- .git

| |-- COMMIT_EDITMSG

| |-- HEAD

| |-- branches

| |-- config

| |-- description

| |-- hooks

| | |-- applypatch-msg.sample

| | `-- update.sample

| |-- index

| |-- info

| | `-- exclude

| |-- logs

| | |-- HEAD

| | `-- refs

| | `-- heads

| | `-- master

| |-- objects

| | |-- 32/09658ac8d80bc9726d3a33d77e3dfc5fe6035e

| | |-- 53/9cd7886a627841d525a78d45cbc6396be20b41

| | |-- e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391

| | |-- info

| | `-- pack

| |-- refs

| | |-- heads

| | | `-- master

| | `-- tags

| `-- remotes

`-- hello_world.rb

17 directories, 33 files

(63)

Clone One

(64)

git clone

(65)

$ git clone git://github.com/schacon/ticgit.git

Initialized empty Git repository in /private/tmp/ticgit/.git/

remote: Counting objects: 591, done.

remote: Compressing objects: 100% (267/267), done.

remote: Total 591 (delta 253), reused 587 (delta 252) Receiving objects: 100% (591/591), 73.05 KiB, done.

Resolving deltas: 100% (253/253), done.

$ cd ticgit/

$ ls

LICENSE! ! Rakefile! examples! note! ! ticgit.gemspec README!! bin!! lib!! spec

$

(66)

$ git clone git://github.com/schacon/ticgit.git

Initialized empty Git repository in /private/tmp/ticgit/.git/

remote: Counting objects: 591, done.

remote: Compressing objects: 100% (267/267), done.

remote: Total 591 (delta 253), reused 587 (delta 252) Receiving objects: 100% (591/591), 73.05 KiB, done.

Resolving deltas: 100% (253/253), done.

$ cd ticgit/

$ ls

LICENSE! ! Rakefile! examples! note! ! ticgit.gemspec README!! bin!! lib!! spec

$

(67)

$ git clone git://github.com/schacon/ticgit.git

Initialized empty Git repository in /private/tmp/ticgit/.git/

remote: Counting objects: 591, done.

remote: Compressing objects: 100% (267/267), done.

remote: Total 591 (delta 253), reused 587 (delta 252) Receiving objects: 100% (591/591), 73.05 KiB, done.

Resolving deltas: 100% (253/253), done.

$ cd ticgit/

$ ls

LICENSE! ! Rakefile! examples! note! ! ticgit.gemspec README!! bin!! lib!! spec

$

(68)

$ git clone git://github.com/schacon/ticgit.git

Initialized empty Git repository in /private/tmp/ticgit/.git/

remote: Counting objects: 591, done.

remote: Compressing objects: 100% (267/267), done.

remote: Total 591 (delta 253), reused 587 (delta 252) Receiving objects: 100% (591/591), 73.05 KiB, done.

Resolving deltas: 100% (253/253), done.

$ cd ticgit/

$ ls

.git LICENSE! ! Rakefile! examples! note! !

ticgit.gemspec README!! bin!! lib!! spec

$

(69)

A Basic Workflow

(70)

A Basic Workflow

Edit files

Stage the changes

Review your changes Commit the changes

(71)

working directory

repository index

git add

git commit

(72)

working directory

repository index

git add

git commit

a working copy of your project

(73)

working directory

repository index

git add

git commit

object database

(74)

working directory

repository index

git add

git commit

“staging”

(75)

A Basic Workflow

Edit files

Stage the changes

Review your changes Commit the changes

(76)

$ find .

./app.yaml

./index.yaml ./main.py

(77)

#!/usr/bin/env python import wsgiref.handlers

from google.appengine.ext import webapp class MainHandler(webapp.RequestHandler):

def get(self):

self.response.out.write('Hello world!') def main():

application = webapp.WSGIApplication([('/', MainHandler)], debug=True)

wsgiref.handlers.CGIHandler().run(application) if __name__ == '__main__':

main()

~

~

"main.py" 16L, 402C

$ vim main.py

(78)

#!/usr/bin/env python import wsgiref.handlers

from google.appengine.ext import webapp

# this program prints out ‘hello world’

class MainHandler(webapp.RequestHandler):

def get(self):

self.response.out.write('Hello world!') def main():

application = webapp.WSGIApplication([('/', MainHandler)], debug=True)

wsgiref.handlers.CGIHandler().run(application) if __name__ == '__main__':

main()

~

~

"main.py" 16L, 402C

$ vim main.py

(79)

$ git status

(80)

$ git status

# On branch master

# Changed but not updated:

# (use "git add <file>..." to update what will be committed)

#

# modified: main.py

#

no changes added to commit (use "git add" and/or "git commit -a")

(81)

$ git status

# On branch master

# Changed but not updated:

# (use "git add <file>..." to update what will be committed)

#

# modified: main.py

#

no changes added to commit (use "git add" and/or "git commit -a")

(82)

$ git status

# On branch master

# Changed but not updated:

# (use "git add <file>..." to update what will be committed)

#

# modified: main.py

#

no changes added to commit (use "git add" and/or "git commit -a")

(83)

$ git status

# On branch master

# Changed but not updated:

# (use "git add <file>..." to update what will be committed)

#

# modified: main.py

#

no changes added to commit (use "git add" and/or "git commit -a")

STAGED

(84)

A Basic Workflow

Edit files

Stage the changes

Review your changes Commit the changes

(85)

git add

(86)

working directory

repository index

git add

git commit

(87)

working directory

repository index

git add

git commit

(88)

$ git add main.py

$ git status

# On branch master

# Changes to be committed:

# (use "git reset HEAD <file>..." to unstage)

#

# modified: main.py

#

(89)

# On branch master

# Changes to be committed:

# (use "git reset HEAD <file>..." to unstage)

#

# modified: main.py

#

$ git add main.py

$ git status

(90)

# On branch master

# Changes to be committed:

# (use "git reset HEAD <file>..." to unstage)

#

# modified: main.py

#

$ git add main.py

$ git status

THAT ARE STAGED

(91)

$ vim app.yaml

application: chacon version: 1

runtime: python api_version: 1 handlers:

- url: .*

script: main.py

~

~

~

"app.yaml" 8L, 101C

(92)

application: chacon version: 1

runtime: python api_version: 1 handlers:

- url: .*

script: main.py

~

~

~

"app.yaml" 8L, 101C

$ vim app.yaml

(93)

application: chacon version: 2

runtime: python api_version: 1 handlers:

- url: .*

script: main.py

~

~

~

"app.yaml" 8L, 101C

$ vim app.yaml

(94)

$ git status

# On branch master

# Changes to be committed:

# (use "git reset HEAD <file>..." to unstage)

#

# modified: main.py

#

# Changed but not updated:

# (use "git add <file>..." to update what will be committed)

#

# modified: app.yaml

#

(95)

$ vim main.py

#!/usr/bin/env python import wsgiref.handlers

from google.appengine.ext import webapp

# this program prints out ‘hello world’

class MainHandler(webapp.RequestHandler):

def get(self):

self.response.out.write('Hello world!') def main():

application = webapp.WSGIApplication([('/', MainHandler)], debug=True)

wsgiref.handlers.CGIHandler().run(application) if __name__ == '__main__':

main()

~

~

"main.py" 16L, 402C

(96)

#!/usr/bin/env python import wsgiref.handlers

from google.appengine.ext import webapp

# this program prints out ‘hello world’

class MainHandler(webapp.RequestHandler):

def get(self):

self.response.out.write('Hola world!') def main():

application = webapp.WSGIApplication([('/', MainHandler)], debug=True)

wsgiref.handlers.CGIHandler().run(application) if __name__ == '__main__':

main()

~

~

"main.py" 16L, 402C

$ vim main.py

(97)

#!/usr/bin/env python import wsgiref.handlers

from google.appengine.ext import webapp

# this program prints out ‘hello world’

class MainHandler(webapp.RequestHandler):

def get(self):

self.response.out.write('Hola Mundo!') def main():

application = webapp.WSGIApplication([('/', MainHandler)], debug=True)

wsgiref.handlers.CGIHandler().run(application) if __name__ == '__main__':

main()

~

~

"main.py" 16L, 402C

$ vim main.py

(98)

# On branch master

# Changes to be committed:

# (use "git reset HEAD <file>..." to unstage)

#

# modified: main.py

#

# Changed but not updated:

# (use "git add <file>..." to update what will be committed)

#

# modified: app.yaml

# modified: main.py

#

$ git status

(99)

# On branch master

# Changes to be committed:

# (use "git reset HEAD <file>..." to unstage)

#

# modified: main.py

#

# Changed but not updated:

# (use "git add <file>..." to update what will be committed)

#

# modified: app.yaml

# modified: main.py

#

$ git status Staged

(100)

# On branch master

# Changes to be committed:

# (use "git reset HEAD <file>..." to unstage)

#

# modified: main.py

#

# Changed but not updated:

# (use "git add <file>..." to update what will be committed)

#

# modified: app.yaml

# modified: main.py

#

$ git status

Unstaged

(101)

# On branch master

# Changes to be committed:

# (use "git reset HEAD <file>..." to unstage)

#

# modified: main.py

#

# Changed but not updated:

# (use "git add <file>..." to update what will be committed)

#

# modified: app.yaml

# modified: main.py

#

$ git status

(102)

#!/usr/bin/env python import wsgiref.handlers

from google.appengine.ext import webapp

# this program prints out ‘hello world’

class MainHandler(webapp.RequestHandler):

def get(self):

self.response.out.write('Hola Mundo!') def main():

application = webapp.WSGIApplication

([('/' debug=True)

wsgiref.handlers.CGIHandler().run (applicat

if __name__ == '__main__':

main()

#!/usr/bin/env python import wsgiref.handlers

from google.appengine.ext import webapp

# this program prints out ‘hello world’

class MainHandler(webapp.RequestHandler):

def get(self):

self.response.out.write('Hello World!') def main():

application = webapp.WSGIApplication

([('/' debug=True)

wsgiref.handlers.CGIHandler().run (applicat

if __name__ == '__main__':

main()

Staged In Working Directory

(103)

#!/usr/bin/env python import wsgiref.handlers

from google.appengine.ext import webapp

# this program prints out ‘hello world’

class MainHandler(webapp.RequestHandler):

def get(self):

self.response.out.write('Hola Mundo!') def main():

application = webapp.WSGIApplication

([('/' debug=True)

wsgiref.handlers.CGIHandler().run (applicat

if __name__ == '__main__':

main()

#!/usr/bin/env python import wsgiref.handlers

from google.appengine.ext import webapp

# this program prints out ‘hello world’

class MainHandler(webapp.RequestHandler):

def get(self):

self.response.out.write('Hello World!') def main():

application = webapp.WSGIApplication

([('/' debug=True)

wsgiref.handlers.CGIHandler().run (applicat

if __name__ == '__main__':

main()

Staged In Working Directory

(104)

You have to stage a file after you edit it

(105)

You have to stage a file after you edit it

(106)

You have to stage a file after you edit it

(107)

$ git status

# On branch master

# Changes to be committed:

# (use "git reset HEAD <file>..." to unstage)

#

# modified: app.yaml

# modified: main.py

#

$ git add app.yaml main.py

(108)

A Basic Workflow

Edit files

Stage the changes

Review your changes Commit the changes

(109)

git commit

(110)

working directory

repository index

git add

git commit

(111)

working directory

repository index

git add

git commit

(112)

$ git commit

# Please enter the commit message for your changes. Lines starting

# with '#' will be ignored, and an empty message aborts the commit.

# On branch master

# Changes to be committed:

# (use "git reset HEAD <file>..." to unstage)

#

# modified: app.yaml

# modified: main.py

#

~

~

~

~

".git/COMMIT_EDITMSG" 10L, 279C

(113)

descriptive commit message

# Please enter the commit message for your changes. Lines starting

# with '#' will be ignored, and an empty message aborts the commit.

# On branch master

# Changes to be committed:

# (use "git reset HEAD <file>..." to unstage)

#

# modified: app.yaml

# modified: main.py

#

~

~

~

~

".git/COMMIT_EDITMSG" 10L, 279C

$ git commit

(114)

descriptive commit message

# Please enter the commit message for your changes. Lines starting

# with '#' will be ignored, and an empty message aborts the commit.

# On branch master

# Changes to be committed:

# (use "git reset HEAD <file>..." to unstage)

#

# modified: app.yaml

# modified: main.py

#

~

~

~

~

".git/COMMIT_EDITMSG" 10L, 279C

$ git commit

(115)

$ git commit

Created commit 77d3001: descriptive commit message 2 files changed, 4 insertions(+), 2 deletions(-)

(116)

A Basic Workflow

Edit files

Stage the changes Review your changes

Commit the changes

vim / emacs / etc git add (file)

repo status git commit

(117)

A Basic Workflow

Edit files

Stage the changes Review your changes

Commit the changes

vim / emacs / etc git add (file)

repo status git commit

(118)

A Basic Workflow

Edit files

Stage the changes Review your changes

Commit the changes

vim / emacs / etc git add (file)

repo status git commit

(119)

A Basic Workflow

Edit files

Stage the changes Review your changes

Commit the changes

vim / emacs / etc git add (file)

git status git commit

(120)

A Basic Workflow

Edit files

Stage the changes Review your changes

Commit the changes

vim / emacs / etc git add (file)

git status git commit

(121)

A Basicer Workflow

Edit files

Stage and Commit

vim / emacs / etc git commit -a

(122)

What’s going on here?

(123)

$ git commit

Created commit 77d3001: descriptive commit message 2 files changed, 4 insertions(+), 2 deletions(-)

(124)

$ git commit

Created commit 77d3001: descriptive commit message 2 files changed, 4 insertions(+), 2 deletions(-)

(125)

77d3001

(126)

77d3001a1de6bf8f5e431972fe4d25b01e595c0b

(127)

77d3001a1de6bf8f5e431972fe4d25b01e595c0b

(128)

77d3001a1de6bf8f5e431972fe4d25b01e595c0b

commit size ae668..

tree parent author committer

my commit message goes here and it is really, really cool

c4ec5 a149e Scott Scott

(129)

77d3001a1de6bf8f5e431972fe4d25b01e595c0b

commit size ae668..

tree parent author committer

my commit message goes here and it is really, really cool

c4ec5 a149e Scott Scott

tree c4ec543b0322744e55c5efc9b6c4e449d398dbff parent a149e2160b3f7573768cdc2fce24d0881f3577e1

author Scott Chacon <schacon@gmail.com> 1223402504 -0700

committer Scott Chacon <schacon@gmail.com> 1223402504 -0700 descriptive commit message

(130)

77d3001a1de6bf8f5e431972fe4d25b01e595c0b

commit size ae668..

tree parent author committer

my commit message goes here and it is really, really cool

c4ec5 a149e Scott Scott

(131)

77d3001a1de6bf8f5e431972fe4d25b01e595c0b

commit size ae668..

tree parent author committer

my commit message goes here and it is really, really cool

c4ec5 a149e Scott Scott

app.yaml

index.yaml

main.py

./ c4e

03e 1d3 3d5

(132)

commit size ae668..

tree parent author committer

my commit message goes here and it is really, really cool

c4ec5 a149e Scott Scott

app.yaml

index.yaml

main.py

./ c4e

03e 1d3 3d5

commit size

tree parent author committer

this is the previous commit and I am very proud of it

2de54 38def Scott Scott

(133)

commit size ae668..

tree parent author committer

my commit message goes here and it is really, really cool

c4ec5 a149e Scott Scott

app.yaml

index.yaml

main.py

./ c4e

03e 1d3 3d5

commit size

tree parent author committer

this is the previous commit and I am very proud of it

2de54 38def Scott Scott

app.yaml

index.yaml

main.py

./ c4e

03e 1d3 3d5

(134)

commit size ae668..

tree parent author committer

my commit message goes here and it is really, really cool

c4ec5 a149e Scott Scott

app.yaml

index.yaml

main.py

./ c4e

03e 1d3 3d5

commit size

tree parent author committer

this is the previous commit and I am very proud of it

2de54 38def Scott Scott commit size

tree parent author committer

this is the commit before that and I'm not sure why

2fe65 90ecd Scott Scott

app.yaml

index.yaml

main.py

./ c4e

03e 1d3 3d5

app.yaml

index.yaml

main.py

./ c4e

03e 1d3 3d5

commit size

tree parent author committer

this is the commit before that and I'm not sure why

2fe65 90ecd Scott Scott

app.yaml

index.yaml

main.py

./ c4e

03e 1d3 3d5

(135)

commit size ae668..

tree parent author committer

my commit message goes here and it is really, really cool

c4ec5 a149e Scott Scott

app.yaml

index.yaml

main.py

./ c4e

03e 1d3 3d5

commit size

tree parent author committer

this is the previous commit and I am very proud of it

2de54 38def Scott Scott commit size

tree parent author committer

this is the commit before that and I'm not sure why

2fe65 90ecd Scott Scott

app.yaml

index.yaml

main.py

./ c4e

03e 1d3 3d5

app.yaml

index.yaml

main.py

./ c4e

03e 1d3 3d5

commit size

tree parent author committer

this is the commit before that and I'm not sure why

2fe65 90ecd Scott Scott

app.yaml

index.yaml

main.py

./ c4e

03e 1d3 3d5

48e 38d a14 77d

c4e

3d5

1d3

03e

f46

23f 30e 67e

32a

5b1

(136)

Repository

3d4

03e ae6

5b1 1d3 c36 f46

23f 6fe

30e 67e 32a

ffe 38d 5b1 1d3

254 a14

d23

2d3 48e 735

de3 c4e c4e

77d 3d5

(137)

Repository

3d4

03e ae6

5b1 1d3 c36 f46

23f 6fe

30e 67e 32a

ffe 38d 5b1 1d3

254 a14

d23

2d3 48e 735

de3 c4e c4e

77d 3d5

git checkout ae635

(138)

Repository

3d4

03e ae6

5b1 1d3 c36 f46

23f 6fe

30e 67e 32a

ffe 38d 5b1 1d3

254 a14

d23

2d3 48e 735

de3 c4e c4e

77d 3d5

git checkout ae635

(139)

Working Directory Index

Rakefile

README

simplegit.rb ./

lib/

./Rakefile

./README

./lib/simplegit.rb ./

./lib/ c36

3d4

03e

5b1 1d3

Repository

3d4

03e ae6

5b1 1d3 c36 f46

23f 6fe

30e 67e 32a

ffe 38d 5b1 1d3

254 a14

d23

2d3 48e 735

de3 c4e c4e

77d 3d5

(140)

Repository

3d4

03e ae6

5b1 1d3 c36 f46

23f 6fe

30e 67e 32a

ffe 38d 5b1 1d3

254 a14

d23

2d3 48e 735

de3 c4e c4e

77d 3d5

Working Directory Index

Rakefile

README

simplegit.rb ./

lib/

./Rakefile

./README

./lib/simplegit.rb ./

./lib/ c36

3d4

03e

5b1 1d3

Riferimenti