Git -- rozproszony system kontroli wersji

1,929 views
1,783 views

Published on

Prezentacja przedstawiona na konferencji Pingwinaria 2010.

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,929
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Git -- rozproszony system kontroli wersji

  1. 1. Rozproszony system kontroli wersji GIT Piotr Macuk <piotr@macuk.pl>
  2. 2. O mnie Programowanie 19 lat Linux + vim 12 lat Kontrola wersji 9 lat Ruby (on Rails) 5 lat Git 2 lata
  3. 3. Agenda Czym jest git Instalacja i konfiguracja Budowa Narzędzia Współpraca Pytania
  4. 4. Historia 2002-2005 – BitKeeper 6 kwietnia 2005 – zmiana licencji Linus daje sobie 2 tygodnie 18 kwietnia 2005 – git obsługuje swój kod 16 czerwca 2005 – git obsługuje kod jądra Opiekun projektu: Junio Hamano 14 lutego 2007 – wydano git 1.5.0
  5. 5. Założenia Nieliniowy rozwój kodu Rozproszenie pracy Szybkość i stabilność działania Integralność repozytorium Obsługa bardzo dużej ilości plików
  6. 6. Czym jest git? Stupid content tracker Ciekawy system plików Filozofia UNIX-a – wiele prostych narzędzi Git != svn++
  7. 7. Instalacja i konfiguracja $ sudo apt­get install git­core $ git config ­­global user.name   "Piotr Macuk" $ git config ­­global user.email   piotr@macuk.pl /etc/gitconfig ~/.gitconfig .git/config git help config
  8. 8. Nowy projekt $ mkdir ­p pesel/src $ touch pesel/README $ touch pesel/src/pesel.rb pesel pesel/README pesel/src pesel/src/pesel.rb
  9. 9. Utworzenie repozytorium $ git init pesel pesel/README pesel/src pesel/src/pesel.rb pesel/.git
  10. 10. Ignore $ cat .gitignore *.log *.pid [0­9].txt # production.log jest ok !production.log
  11. 11. Status $ git status # On branch master # Untracked files: #       README #       src/ nothing added to commit but  untracked files present (use "git  add" to track)
  12. 12. Nowe pliki $ git add . $ git status # On branch master # Changes to be committed: #       new file:   README #       new file:   src/pesel.rb
  13. 13. Commit $ git commit ­m 'Init' [master (root­commit) 7b355ec] Init 0 files changed, 0 insertions(+), 0  deletions(­) create mode 100644 README create mode 100644 src/pesel.rb $ git status # On branch master nothing to commit (working directory clean)
  14. 14. Perspektywa Katalog roboczy Indeks Repozytorium pesel pesel/.git/index pesel/.git Add Commit Commit -a Checkout
  15. 15. Baza obiektów $ cd .git/objects && find e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 29/206d2658aaf11920998fac41a9f5f7047418fb 4b/b2a6cec1e0c51741998cd243367706bbfb3b83 7b/355ecc8206060071ff60038fa034aab580dd59
  16. 16. Zmiana pliku $ echo 'Pesel library.' > README $ git add README $ git commit ­m 'Doc'
  17. 17. Baza obiektów $ cd .git/objects && find e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 29/206d2658aaf11920998fac41a9f5f7047418fb 4b/b2a6cec1e0c51741998cd243367706bbfb3b83 7b/355ecc8206060071ff60038fa034aab580dd59 d3/db0ebf6844ddc3ef19920e753bdf66f332a565 50/947a5824bab56cf14775c6594745f5b4409f2f 6a/aa7ae7ded1c036bc433a49906733a81da6fc9e
  18. 18. SHA-1       Init     Doc pesel tree  4bb2a6c   6aaa7ae pesel/README blob  e69de29   50947a5 pesel/src tree  29206d2   29206d2 pesel/src/pesel.rb blob  e69de29   e69de29
  19. 19. Skierowany graf acykliczny Init Doc commit commit 7b355ec d3db0eb tree tree pesel pesel 4bb2a6c 6aaa7ae blob tree blob e69de29 29206d2 50947a5 README src README src/pesel.rb
  20. 20. Typy obiektów blob blob (size)0 tree tree (size)0 e69de29 4bb2a6c content 100644 blob e69de29 README 040000 tree 29206d2 src commit tag d3db0eb e795501 Commit (size)0 tag (size)0 tree 6aaa7ae object d3db0eb parent 7b355ec type commit author Piotr Macuk  tag v0.0.1 <piotr@macuk.pl>  tagger Piotr Macuk  1271161942 +0200 <piotr@macuk.pl>  committer Piotr Macuk  Tue Apr 13 17:24:40 2010 <piotr@macuk.pl>  1271161942 +0200 First tag. Doc
  21. 21. Obiekty – założenia Objekty są niezmienne Obiekty są tylko dodawane Ten sam sposób przechowywania obj = zlib(sha1(header + content)) obj => .git/objects/
  22. 22. Gałęzie HEAD $ git branch fix23 $ git checkout fix23 master fix23 F D $ git checkout ­b fix23 E C $ git branch ­d fix23 B A
  23. 23. Gałęzie Nowy pomysł lub bug = nowa gałąź Gałąź = wskaźnik na commit Tworzenie gałęzi = zapis 40 bajtów do pliku HEAD = gałąź w której jest katalog roboczy
  24. 24. Tagi $ git tag v0.0.1 $ git tag ­a v1.0 $ git tag ­s v1.0signed $ git tag ­l
  25. 25. Wskaźniki $ cd .git/refs/ && find HEAD master fix23 tags/v0.0.1 heads/master F D heads/fix23 E C tag: v0.0.1 B A
  26. 26. Merge $ git merge fix23 HEAD $ git branch ­d fix23 master HEAD G master fix23 F D F D E C E C B B A A
  27. 27. Rebase + merge HEAD HEAD $ git checkout fix23 master fix23 $ git rebase master D2 D2 HEAD C2 C2 master fix23 master F D F F E C E $ git checkout master E $ git merge fix23 $ git branch ­d fix23 B B B A A A
  28. 28. Historia – log $ git log commit d3db0ebf6844ddc3ef19920e753bdf66f332a565 Author: Piotr Macuk <piotr@macuk.pl> Date:   Tue Apr 13 14:43:39 2010 +0200     Doc commit 7b355ecc8206060071ff60038fa034aab580dd59 Author: Piotr Macuk <piotr@macuk.pl> Date:   Tue Apr 13 14:32:22 2010 +0200     Init
  29. 29. Historia – log $ git log $ git log ­p $ git log file1 file2 dir3 $ git log tag..branch $ git log HEAD~10.. $ git log ­10 $ git log ­­author=fred $ git log ­­grep="some text" $ git log ­S"some code"
  30. 30. Historia – show $ git show commit d3db0ebf6844ddc3ef19920e753bdf66f332a565 Author: Piotr Macuk <piotr@macuk.pl> Date:   Tue Apr 13 14:43:39 2010 +0200     Dokumentacja diff ­­git a/README b/README index e69de29..50947a5 100644 ­­­ a/README +++ b/README @@ ­0,0 +1 @@ +Pesel library.
  31. 31. Różnice Katalog roboczy Indeks Repozytorium pesel pesel/.git/index pesel/.git git diff git diff HEAD git diff ­­cached
  32. 32. Undo $ git commit ­­amend $ git reset ­­soft $ git reset ­­hard # UWAGA
  33. 33. Adresowanie d3db0ebf6844ddc3ef19920e753bdf66f332a565 d3db0eb HEAD, master, fix23, v0.0.1 master@{1 week ago}, fix23@{yesterday} master~5, fix23^2, d3db0eb~2 '':/opis'' d3db0eb..7b355ec
  34. 34. Protokoły git ssh (+ gitshell) http/https File rsync http://github.com
  35. 35. Współpraca Każde repozytorium jest samowystarczalne Tworzymy sieć repozytoriów Publiczne i prywatne Główne repozytorium to tylko umowa $ git clone url dir $ git remote add janek url $ git pull (lub git fetch) $ git push
  36. 36. Lokalnie private private jan ola jan$ git remote add ola file://home/ola/pesel ola$ git remote add jan file://home/jan/pesel $ git pull # bez push! ola$ git branch ­a * master   remotes/jan/master
  37. 37. Współdzielenie shared private private private private $ git clone ­­bare pesel pesel.git $ scp ­r pesel.git server:~/ $ git remote add shared server:~/pesel.git
  38. 38. Open source public public public public main private private private Opiekun Developer Developer
  39. 39. Łaty Współpraca na zasadzie wysyłania łat $ git format­patch master~3 $ git apply *.patch $ git add … $ git commit
  40. 40. Wiele narzędzi git grep git blame git cherry-pick git bisect git revert git fsck git archive git gc git stash git prune
  41. 41. Narzędzia zewnętrzne gitk (tcl/tk) tig (console) qgit (Qt) TortoiseGit (Windows) GitX (Mac OS X) git svn (import, proxy)
  42. 42. Linki http://git-scm.com http://whygitisbetterthanx.com
  43. 43. Pytania?
  44. 44. Dziękuję za uwagę :) Piotr Macuk <piotr@macuk.pl>

×