Git talk from Open 2011 conference in Israel

734
-1

Published on

Git is an open source, distributed version control system that changes the way that you think about version control. In this lecture, I present some of the reasons why you would use a version-control system, and some of the compelling reasons why you should consider Git.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
734
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
12
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Git talk from Open 2011 conference in Israel

    1. 1. GitReuven M. Lerner • reuven@lerner.co.il Open Israel Conference June 30th, 2011
    2. 2. Who am I?• Web developer, software architect, consultant, lecturer/trainer• Linux Journal columnist since 1996• Mostly Ruby on Rails + PostgreSQL, but also Python, PHP, jQuery, and lots more...• Git user (and enthusiast) since 2008
    3. 3. What isversion control?
    4. 4. Time machine• Return to any point in a project’s history• Find out how files, folders have changed• Learn which user made which changes
    5. 5. Backup• Never fear that you’ve deleted a file — just rewind the history• Everything is recorded, can be undone
    6. 6. Maintenance tool• “Tag” releases• Who is to blame for a particular bug?• When did we introduce a particular problem?• Deploy specific versions on specific servers
    7. 7. Scratchpad• Try out new ideas• Experiment with alternative techniques• Upgrade a library• Refactor without affecting the “live” code base
    8. 8. Collaboration tool• Work without fear of “stomping” on someone else’s code• Identify conflicts between what developers wrote• Mix and match teams for projects
    9. 9. Version control is great• If you’re a programmer and not using version control, you’re really missing out • It’s also good for non-programs, such as configuration files• If you’re a CTO/team leader/VP R&D and your people aren’t using version control, you’re inviting disaster
    10. 10. What do people use?• RCS (ancient history)• CVS (should be ancient history)• Subversion (“a better CVS”)• SourceSafe• Perforce• lots of other systems
    11. 11. Problems with these• Work requires a server connection • (You can work, but not commit.)• Branching and merging is painful and slow • So no one does it!• Enforces a particular workflow• More code, more developers — slower VC
    12. 12. Distributed version control• Distributed: Everyone is their own server!• Everyone has a complete commit history • No single point of failure• Commit whenever you want (i.e., often)• Merge when two repositories connect
    13. 13. Git• Linus needed a VCS... so he wrote one! • Fast • Accurate • Distributed • Massively scalable • Super flexible
    14. 14. Open-source Git users• Linux kernel• PostgreSQL• Ruby language• Ruby on Rails• Perl language• among many, many others
    15. 15. Give me details!• What does Git do that others don’t?• Why do I claim that Git has changed my life?
    16. 16. Branching & merging• Branching and merging is both easy and fast in Git• I often branch and merge several times in a given day • When I used SVN, I would do everything in my power to avoid branching, because merges were long and difficult
    17. 17. Branching & merging• Create a branch: git checkout -b new-branch• Merge commits from other-branch git merge other-branch• Yes, it’s really that easy.• You don’t even have to change directories!
    18. 18. Easy branching changes everything!• Every new feature goes in a branch• Merging becomes easy, fast, and natural• Side projects are stored, not kept out of version control for fear of “contamination”• Commit, commit, commit all of the time, in an appropriate branch — never lose work!
    19. 19. Local repository is great• Work without a network connection• Commits, merges, and switching branches are nearly instantaneous• Reports and logs are super-fast • “Show me all files modified on Tuesday of last week” produces immediate resultss
    20. 20. Create a repository!/tmp $ cd myapp/tmp/myapp $ git initInitialized empty Git repository in /private/tmp/myapp/.git/master ✗ /tmp/myapp $ git add .master ✗ /tmp/myapp $ git commit -a -m Initial commit[master (root-commit) 030c6b6] Initial commit 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 fooInitial commitmaster ✔ /tmp/myapp $
    21. 21. Create a repository!/tmp $ cd myapp/tmp/myapp $ git initInitialized empty Git repository in /private/tmp/myapp/.git/master ✗ /tmp/myapp $ git add .master ✗ /tmp/myapp $ git commit -a -m Initial commit[master (root-commit) 030c6b6] Initial commit 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 fooInitial commitmaster ✔ /tmp/myapp $
    22. 22. Create a repository!/tmp $ cd myapp/tmp/myapp $ git initInitialized empty Git repository in /private/tmp/myapp/.git/master ✗ /tmp/myapp $ git add .master ✗ /tmp/myapp $ git commit -a -m Initial commit[master (root-commit) 030c6b6] Initial commit 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 fooInitial commitmaster ✔ /tmp/myapp $
    23. 23. Create a repository!/tmp $ cd myapp/tmp/myapp $ git initInitialized empty Git repository in /private/tmp/myapp/.git/master ✗ /tmp/myapp $ git add .master ✗ /tmp/myapp $ git commit -a -m Initial commit[master (root-commit) 030c6b6] Initial commit 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 fooInitial commitmaster ✔ /tmp/myapp $
    24. 24. Create a repository!/tmp $ cd myapp/tmp/myapp $ git initInitialized empty Git repository in /private/tmp/myapp/.git/master ✗ /tmp/myapp $ git add .master ✗ /tmp/myapp $ git commit -a -m Initial commit[master (root-commit) 030c6b6] Initial commit 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 fooInitial commitmaster ✔ /tmp/myapp $
    25. 25. Create a repository!/tmp $ cd myapp/tmp/myapp $ git initInitialized empty Git repository in /private/tmp/myapp/.git/master ✗ /tmp/myapp $ git add .master ✗ /tmp/myapp $ git commit -a -m Initial commit[master (root-commit) 030c6b6] Initial commit 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 fooInitial commitmaster ✔ /tmp/myapp $
    26. 26. The resultmaster ✔ /tmp/myapp $ git logcommit 030c6b691993e0f43d78119d9ff1c9e759120d11Author: Reuven Lerner <reuven@lerner.co.il>Date: Thu Jun 30 12:29:29 2011 +0300 I
    27. 27. Committing in stages• You can commit all modified files (“git commit -a”)• You can add files to be committed (“git add foo.rb”) over time• Using the staging area gives you tremendous flexibility before committing
    28. 28. Remote branches• A local branch can “track” a remote branch• Different branches can be on different servers — and then you can merge across them• One possible workflow: Read from one remote branch, and write to another
    29. 29. Integration• Git is all small Unix commands• Easily integrated into text editors, IDEs, cron jobs, monitoring, and system tasks• Example: Continuous integration servers• Example: Code-analysis tools• Also: Front ends to SVN and others!
    30. 30. git blame• Shows the commit, user, and timestamp of when each line of a file was changed• Useful when you want to know who broke the build• Also useful for deflecting blame from clients, who think you broke something!
    31. 31. a23c6415 (Magnus Hagander 2009-07-30 09:28:00 +0000 29)a23c6415 (Magnus Hagander 2009-07-30 09:28:00 +0000 30) #ifdef WIN3265e806cb (Bruce Momjian 2010-02-26 02:01:40 +0000 31) #define FD_SETSIZE 1024a23c6415 (Magnus Hagander 2009-07-30 09:28:00 +0000 32) #endif /* ! WIN32 */a23c6415 (Magnus Hagander 2009-07-30 09:28:00 +0000 33)d08741ea (Tom Lane 2001-02-10 02:31:31 +0000 34) #include "postgres_fe.h"a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 35)a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 36) #include "libpq-fe.h"a8a198b1 (Itagaki Takahiro 2010-01-06 01:30:03 +0000 37) #include "libpq/pqsignal.h"3da0dfb4 (Tatsuo Ishii 2009-08-03 15:18:14 +0000 38) #include "portability/instr_time.h"a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 39)d156e1f8 (Tom Lane 2005-10-07 15:34:17 +0000 40) #include <ctype.h>d156e1f8 (Tom Lane 2005-10-07 15:34:17 +0000 41)a8a198b1 (Itagaki Takahiro 2010-01-06 01:30:03 +0000 42) #ifndef WIN32a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 43) #include <sys/time.h>a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 44) #include <unistd.h>ffda6747 (Tom Lane 2007-09-27 20:39:43 +0000 45) #endif /* ! WIN32 */
    32. 32. Commit a23c6415 (Magnus Hagander 2009-07-30 09:28:00 +0000 29) a23c6415 (Magnus Hagander 2009-07-30 09:28:00 +0000 30) #ifdef WIN32 65e806cb (Bruce Momjian 2010-02-26 02:01:40 +0000 31) #define FD_SETSIZE 1024 a23c6415 (Magnus Hagander 2009-07-30 09:28:00 +0000 32) #endif /* ! WIN32 */ a23c6415 (Magnus Hagander 2009-07-30 09:28:00 +0000 33) d08741ea (Tom Lane 2001-02-10 02:31:31 +0000 34) #include "postgres_fe.h" a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 35) a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 36) #include "libpq-fe.h" a8a198b1 (Itagaki Takahiro 2010-01-06 01:30:03 +0000 37) #include "libpq/pqsignal.h" 3da0dfb4 (Tatsuo Ishii 2009-08-03 15:18:14 +0000 38) #include "portability/instr_time.h" a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 39) d156e1f8 (Tom Lane 2005-10-07 15:34:17 +0000 40) #include <ctype.h> d156e1f8 (Tom Lane 2005-10-07 15:34:17 +0000 41) a8a198b1 (Itagaki Takahiro 2010-01-06 01:30:03 +0000 42) #ifndef WIN32 a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 43) #include <sys/time.h> a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 44) #include <unistd.h> ffda6747 (Tom Lane 2007-09-27 20:39:43 +0000 45) #endif /* ! WIN32 */
    33. 33. Commit User a23c6415 (Magnus Hagander 2009-07-30 09:28:00 +0000 29) a23c6415 (Magnus Hagander 2009-07-30 09:28:00 +0000 30) #ifdef WIN32 65e806cb (Bruce Momjian 2010-02-26 02:01:40 +0000 31) #define FD_SETSIZE 1024 a23c6415 (Magnus Hagander 2009-07-30 09:28:00 +0000 32) #endif /* ! WIN32 */ a23c6415 (Magnus Hagander 2009-07-30 09:28:00 +0000 33) d08741ea (Tom Lane 2001-02-10 02:31:31 +0000 34) #include "postgres_fe.h" a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 35) a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 36) #include "libpq-fe.h" a8a198b1 (Itagaki Takahiro 2010-01-06 01:30:03 +0000 37) #include "libpq/pqsignal.h" 3da0dfb4 (Tatsuo Ishii 2009-08-03 15:18:14 +0000 38) #include "portability/instr_time.h" a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 39) d156e1f8 (Tom Lane 2005-10-07 15:34:17 +0000 40) #include <ctype.h> d156e1f8 (Tom Lane 2005-10-07 15:34:17 +0000 41) a8a198b1 (Itagaki Takahiro 2010-01-06 01:30:03 +0000 42) #ifndef WIN32 a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 43) #include <sys/time.h> a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 44) #include <unistd.h> ffda6747 (Tom Lane 2007-09-27 20:39:43 +0000 45) #endif /* ! WIN32 */
    34. 34. Commit User Timestamp a23c6415 (Magnus Hagander 2009-07-30 09:28:00 +0000 29) a23c6415 (Magnus Hagander 2009-07-30 09:28:00 +0000 30) #ifdef WIN32 65e806cb (Bruce Momjian 2010-02-26 02:01:40 +0000 31) #define FD_SETSIZE 1024 a23c6415 (Magnus Hagander 2009-07-30 09:28:00 +0000 32) #endif /* ! WIN32 */ a23c6415 (Magnus Hagander 2009-07-30 09:28:00 +0000 33) d08741ea (Tom Lane 2001-02-10 02:31:31 +0000 34) #include "postgres_fe.h" a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 35) a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 36) #include "libpq-fe.h" a8a198b1 (Itagaki Takahiro 2010-01-06 01:30:03 +0000 37) #include "libpq/pqsignal.h" 3da0dfb4 (Tatsuo Ishii 2009-08-03 15:18:14 +0000 38) #include "portability/instr_time.h" a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 39) d156e1f8 (Tom Lane 2005-10-07 15:34:17 +0000 40) #include <ctype.h> d156e1f8 (Tom Lane 2005-10-07 15:34:17 +0000 41) a8a198b1 (Itagaki Takahiro 2010-01-06 01:30:03 +0000 42) #ifndef WIN32 a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 43) #include <sys/time.h> a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 44) #include <unistd.h> ffda6747 (Tom Lane 2007-09-27 20:39:43 +0000 45) #endif /* ! WIN32 */
    35. 35. Commit User Timestamp Line # and code a23c6415 (Magnus Hagander 2009-07-30 09:28:00 +0000 29) a23c6415 (Magnus Hagander 2009-07-30 09:28:00 +0000 30) #ifdef WIN32 65e806cb (Bruce Momjian 2010-02-26 02:01:40 +0000 31) #define FD_SETSIZE 1024 a23c6415 (Magnus Hagander 2009-07-30 09:28:00 +0000 32) #endif /* ! WIN32 */ a23c6415 (Magnus Hagander 2009-07-30 09:28:00 +0000 33) d08741ea (Tom Lane 2001-02-10 02:31:31 +0000 34) #include "postgres_fe.h" a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 35) a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 36) #include "libpq-fe.h" a8a198b1 (Itagaki Takahiro 2010-01-06 01:30:03 +0000 37) #include "libpq/pqsignal.h" 3da0dfb4 (Tatsuo Ishii 2009-08-03 15:18:14 +0000 38) #include "portability/instr_time.h" a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 39) d156e1f8 (Tom Lane 2005-10-07 15:34:17 +0000 40) #include <ctype.h> d156e1f8 (Tom Lane 2005-10-07 15:34:17 +0000 41) a8a198b1 (Itagaki Takahiro 2010-01-06 01:30:03 +0000 42) #ifndef WIN32 a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 43) #include <sys/time.h> a765db40 (Tatsuo Ishii 2000-01-15 12:38:09 +0000 44) #include <unistd.h> ffda6747 (Tom Lane 2007-09-27 20:39:43 +0000 45) #endif /* ! WIN32 */
    36. 36. git bisect• You introduced a bug, but don’t know where? Git can find it! • Give two endpoints • Git does a binary search between them • For each commit, tell Git whether it is “good” or “bad” • This finds the bug very quickly
    37. 37. Stash• Temporary storage space• Useful if you have done enough work to keep, but not enough for a commit• Emergency fixes in the middle of working on something else• If you need, put the stash into a new branch• Oh, you can have multiple stashes
    38. 38. Hooks• Execute arbitrary code when things happen• Example: Update submodules automatically• Example: Send e-mail after a commit• Example: Heroku uses hooks to deploy a new version of your Web app when you push to them!
    39. 39. Workflows• Git supports many, many workflows • Traditional centralized server • BDFL and users • BDFL and Lieutenants• Do what works for you!
    40. 40. TraditionalSource: ProGit.org
    41. 41. Integration-managerSource: ProGit.org
    42. 42. Large, BDFLSource: ProGit.org
    43. 43. Cherry picking• You can merge specific commits, or parts of commits• Amazingly powerful
    44. 44. Rebase• An alternative to regular merging• First merge all external commits, then replay your changes on top• Helps to keep you aligned with remote branches• Avoids some merge-conflict issues
    45. 45. Submodules• A Git repository can point to other repositories — submodules• Break a project into smaller projects• Git puts the pieces together for you!
    46. 46. Amending commits• Commits are not sacred in Git• Rather, they are a tool to manage history• Change, amend, and edit commits• Yes, this can be dangerous!• Also avoids hundreds of “fixed typo” commits in a row...
    47. 47. Commercial hosting• You can host Git repositories on your own• Want to go commercial? GitHub, Gitorious, and many others work great• GitHub is free for open-source projects, and thus very popular
    48. 48. GUIs• Yes, there are now GUIs for Git• Windows, Mac, and Unix versions all exist• Integration with Emacs and other editors for hard-core hacker-nerds• Also: Shell-prompt integration for Unix
    49. 49. In short• Git has completely changed how I develop code, both alone and with others• The speed and easy branching/merging are game-changers• It’s really not that hard to start using...• ... and once you start, you’ll never want to go back to CVS or SVN
    50. 50. Want to learn more?• Mailing lists, wikis, and blogs • http://git-scm.com/ • http://progit.org/ • http://gitimmersion.com/• I’m probably going to offer Git training soon — let me know if you’re interested!
    51. 51. Thanks!(Any questions?) reuven@lerner.co.il http://www.lerner.co.il/ 054-496-8405“reuvenlerner” on Skype/AIM
    1. A particular slide catching your eye?

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

    ×