Git is a distributed version control system created by Linus Torvalds in 2005. It allows for non-linear development through features like branching and distributed collaboration. Git tracks content and file changes rather than file differences. The basic Git workflow involves initializing a repository, making changes to files, staging files, and committing changes with log messages. Files and changes can be shared between collaborators by adding remote repositories and pushing/pulling changes. Branches allow parallel development while merges integrate that work.
1. Git : Awesome Distributed Version Control SystemGit : Awesome Distributed Version Control System
Presenter : Raza.Z.Sayed
2. 2
History
● Linux kernel project
● Patch emailing system
● Bitkeeper from 2002 to 2005.
● Why the name Git ?
- “I’m an egotistical bastard, and I name all my
projects after myself.First Linux, now git.” – Linus
Torvalds
● First commit message : 'initial version of “git”,the
information manager from hell'-Linus 4/7/05
3. 3
Basic Concepts
●
Git is not like SVN (Subversion) and is fundamentally different . Git tracks
content not changes or deltas
●
Its like a filesystem. Its a collection of tools that implement tree history storage
and directory content management system.
● Non linear development, distributed development and efficient
- Ruby on Rails Git repository is around 13 Mb and Subversion repository of
the same is around 115 Mb !
● Not a binary but a toolkit design in spirit of unix philosophy (Write programs
that do one thing and do it well)
4. 4
Basic Concepts
●
Git Object Database → .git directory
●
Git Object Types → stored in .git/objects
1. Blob
2. Tree
3. Commit
4. Tag
●
Git Data Model
1. Git Object Types
2. References (Branches and Remotes) → stored in .git/refs
5. 5
Basic Git Workflow
● mkdir my_awesome_project
● cd my_awesome_project
● git init
● Create a file e.g. README.txt
● git status (Optional)
● git add README.txt (Add to staging)
● git commit -m “first commit”
6. 6
Basic Git Workflow
● Make some changes to README.txt
● Create a new file e.g. hello.rb
● git status
● git add hello.rb README.txt or git add . or git add --all
● git commit -m “another commit”
● Make changes to hello.rb
● git commit -a -m “added foo method” (Wont add
untracked files to staging. git add them separately)
7. 7
Different ways to add
● git add <list of files> (Add the list of files)
● git add --all (Add all files from the project.)
● git add . (Add all files from the project)
● git add *.txt (Add all txt files in current dir)
● git add “*.txt” (Add all txt files from the project)
● git add docs/*.txt (Add all txt files from docs dir)
● git add docs/ (Add all files from docs dir)
8. 8
Viewing changes
● git diff (Show unstaged changes since last
commit)
● git diff --staged (show staged changes since
last commit)
● git log (show project history)
9. 9
Undo unstaged changes
● git checkout . (Blow away all changes since
last commit)
● git checkout <list of files> (Blow away changes
to specified files since last commit)
10. 10
Unstage changes
● git reset HEAD (Unstage all staged files)
● git reset HEAD <list of files> (Unstage
particular files) e.g. git reset HEAD
README.txt or git reset HEAD README.txt
hello.rb
11. 11
Undo commits
● git reset soft HEAD^ (Undo last commit and move changes
back to staging) or git reset soft HEAD~1
● git reset soft HEAD^^ (Undo last two commits and move
changes back to staging) or git reset soft HEAD~2
● git reset hard HEAD^ (Undo last commit and blow away all
changes) or git reset hard HEAD~1
● git reset hard HEAD^^^ (Undo last three commits and blow
away all changes) or git reset hard HEAD~3
● git commit --amend -m “New commit message” (Change
the last commit message)
12. 12
Sharing and Collaborating
● Lots of different code hosting services to
choose from e.g. Unfuddle, Github, Bitbucket
etc. or setup your own server.
● Create a git repo on the server. This is called a
remote repository.
● Inside your project dir on your local machine :
git remote add <some arbit name for the
remote repo> <path of remote repo>
13. 13
Sharing and Collaborating
● git remote -v (show remote repositories
associated with the project)
● git push -u <remote repo name> <branch
name> e.g. git push -u origin master
● git pull (Pull changes from the remote repo)
● git remote rm <remote repo name> (Delete a
remote repo from the project)
14. 14
Sharing and Collaborating
● Types of git repo urls : https://.. (Read only or read
write depending upon permissions) , git://.. (Git read
only), git@.. (SSH read write)
● git clone <remote repo url> or git clone <remote repo
url> [local name]
● git clone does the following three things. 1) Downloads
the entire repo into a new directory 2) Adds origin
remote pointing it to clone url 3) checks out the master
branch i.e. sets local repo HEAD to point to the master
branch
15. 15
Branching
● Need to work on a new feature or fix a bug that
will take time ?. Create a new branch to work on
it.
● git branch <branch name> (Creates the branch)
● git checkout <branch name> (Switch to the
branch)
● git checkout -b <branch name> (Shortcut to
create and switch to a branch in one step)
16. 16
Basic Branching Workflow
● git checkout -b cool_feature
● echo “This is readme for the cool feature” >
README.txt
● git add README.txt
● git commit -m “first commit in cool_feature branch”
● git checkout master
● git merge cool_feature
● git branch -d cool_feature (Delete the branch as were
done with it)
17. 17
Types of Branch Merge
● Fast Forward Merge
● Non Fast Forward Merge (Recursive Merge)
● Recursive Merge creates an extra commit
automatically called a “Merge commit”
18. 18
Conflicts
● Can either arise during git push or while doing a
merge (merge conflict)
● git push conflict scenario. Do a git pull first to fix
● Two cases in which merge conflicts can arise. 1)
During merging a local branch 2) Doing a git pull
● git pull = git fetch+git merge. What is origin/master ?
● Resolving merge conflicts
19. 19
Sharing local branches
●
A wants to create a new branch and share it.
git checkout -b awesome_new_feature
git push origin awesome_new_feature
●
B wants to collaborate on the new branch.
git pull
git checkout awesome_new_feature
●
Listing remote branches : git branch -r
●
Getting detailed information about remote branches : git remote show origin
●
Deleting remote branches.
git push origin :awesome_new_feature
git branch -d awesome_new_feature. If this does not work then,
git branch -D awesome_new_feature
●
Cleaning up local references to deleted remote branches : git remote prune origin
20. 20
Tagging
● What are tags ?
● Listing all tags : git tag
● Creating a new tag : git tag -a v1.0 -m “version
1.0”
● Checkout code at a particular commit : git
checkout v1.0
● Sharing tags : git push --tags
21. 21
Rebase
● What is a rebase and why its better than a merge ?
● Dont do git pull ! . Instead do a fetch + rebase.
● Remote branch rebase workflow
git fetch
git rebase
● Local branch rebase workflow. e.g. To rebase branch new_feature into master
git checkout new_feature
git rebase master
git checkout master
git merge new_feature
22. 22
Ignoring Files
● Only for yourself
Put exclude patterns in .git/info/exclude file
● For everyone
Put exclude patterns in .gitignore file in the
project root directory
● Untracking files
git rm --cached <file name>
23. 23
References
● Git Community Book - http://git-scm.com/book
● Git Branching -
http://pcottle.github.com/learnGitBranching/
● Git for computer scientists -
http://eagain.net/articles/git-for-computer-scientists/
● Visual Git Reference -
http://marklodato.github.com/visual-git-guide/index-