This document provides an overview of Git and some common Git commands. It begins with an introduction to distributed version control and how Git stores data as objects in a repository.
The document then covers some important Git commands for adding, committing, checking status and differences, viewing logs and history, tagging, branching, merging, rebasing, searching files, managing remotes and pushing/pulling changes. It also discusses resolving conflicts, interactive rebasing, stashing work, and using blame to view change history on files.
The goal is to give the reader a high-level understanding of Git's architecture and data model as well as expose them to some of the most commonly used commands for basic version control workflows.
4. Distributed Version Control
Remote Repository Repository Repository
(public or privat)
push
pull
Workspace Workspace Workspace
Local Repository Repository Repository
Alice Bob Charlie
14. The most important
commands
● add ● fetch ● rebase
● bisec ● grep ● remote
● branch ● init ● reset
● checkout ● log ● rm
● clone ● merge ● show
● commit ● mv ● stash
● config ● pull ● status
● diff ● push ● tag
15. Configuration in
$HOME/.gitconfig
git config --global user.name "Some name"
git config --global user.email some@email
git config --global color.branch auto
git config --global color.diff auto
git config --global color.interactive auto
git config --global color.status auto
git config --global merge.tool meld
git config --global core.editor vim
16. Initializing a repository
● Create a new repository
git init
● Clone an existing repository
git clone <url>
● Possible URLs:
● local directory, ssh://, git://, rsync://,
ftp:// etc.
17. Show the status
● Simply call git status
● This will show the lifecycle of the files
➔ A file which is indexed and modified afterwards, must be
added explicitly to the index again!
18. The Index
Working Copy Index Repository
git add,
git commit
rm, mv
● Buffer between working copy and repository
● Describes what's commited next
● Shortcut: git commit -a
19. Commit
● Changes stored in the index are written into the
repository and get a new SHA1 checksum
● The HEAD-reference points to the new commit
● The last commit can be changed and re-committed
using the --amend parameter, e.G. typos in the
comment, missed changes to be commited etc.
git commit --amend
20. Show differences
● Between workspace and index
git diff
● Between index and the last commit
git diff --staged
● Between the workspace and the last commit
git diff HEAD
● Between two commits
git diff $commit $commit
● Between current branch and another one
git diff branch_name
21. Object references
● SHA1: d37f32a8058b2c4b5d1b1c55c4cab41611899cb3
● Short SHA1: d37f32a
● Tags: v1.5.1
● Local branch: master
● Remote branch: origin/master
● Checkout: HEAD
● Last Fetch: LAST_FETCH
● Previous Head: ORIG_HEAD
22. Object references
● Parents: Name^, Name^^^, Name~10, Name^2, …
● What was yesterday? Name@{yesterday}
● What was on ...? Name@{1 June}
● What was … days before?Name@{3}
● What happened since...? --since=“2 weeks ago“
● What was until ...? --until=“1 week ago“
● Who has...? --committer=pattern
● What was between...? name1..name2
23. Show me the commit
● Prints the diffs in a commit
● Shows diffs as well as statistics
● git show
● git show --stat
● Can be used with all object references
24. Reset
● git reset modifies different elements:
● Variant 1: --hard
The HEAD, the index and all local modifications in
the workspace will be erased!
● Variant 2: --soft
The HEAD will be overwritten. Previous commits will
change to „changes to be committed“
● Variante 3: --mixed (default)
The HEAD and the index are overwritten
● The HEAD is just a reference to a specific commit
25. Logs
● Shows the commit logs
● git log
● git log -10
● Can be used with all object references
● git log -3 master@{15 July}
● git log --author=Max Mustermann
● git log --grep=pattern
26. Search in files
● git provides a grep integration
● MUCH faster than standard grep
git grep -e pattern -- some/file
git grep -e pattern branch -- some/file
27. Tags
● Tags are named references to commits
● There are annotated and lightweight tags
● Creation of a tag
● Lightweight: git tag <name>
● Annotated: git tag -a <name> -m „message“
● Show all tags: git tag
28. Create and change
branches
● Branches are references to commits
● The default-branch is called master
● Create: git branch name [commit]
● Change: git checkout name
● Create and change: git checkout -b name
● The HEAD will be adapted accordingly
29. Delete branches
● Branches can be deleted every time
● To delete a merged branch
git branch -d branch_name
● To delete a non-merged branch
git branch -D branch_name
30. Show all branches
● Local ones
git branch
● Remote ones
git branch -r
● All branches
git branch -a
● All non-merged branches
git branch --no-merged
31. Conflicts and merging
● Merge as many branches as you want at the same time
git merge branch_a branch_b
● Merged branches can also be deleted
● Conflict markers indicates auto-merge problems
● Show with git status or git mergetool
● Use editor or mergetool to fix the conflict
● Stash the resolved conflict on the index
● Do a commit
32. Cherry-pick
● Sometimes you only want to merge specific commits into
another branch
● Git allows this cherry picking
git cherry-pick <commit>
33. Rebase
● Alternative to git merge
● Simple rebase pushes the branch onto the HEAD
git merge master test git rebase master test
f e'
e d' e
d d
master c master c
b b
a a
34. Interactive rebase
● git rebase -i master
● Handles multiple commits:
f t(e+f) master
● delete
e
● ignore
d s(d)
● edit
c
● squash together
b b
● You can squash multiple commits
a
into one to have a clean history
35. Remote Branches
● Clone creates a new local branch within a namespace:
remotes/origin/<branch name>
● Default-name for remote server is origin
● Can be changed using git remote
● Checkout a remote branch using
git checkout -b <remote_name>/<branch>
● Remote branches are Tracking Branches
36. Adding remotes
● Unlimited number of remotes
● Modifications with git remote
● Typing git remote will list all remotes
➔ Team members can add other team members remotes
for easy code exchange
37. Pull the changes
● Tracking-branches know the SHA1 from the remote since
the last pull
● Changes are fetched using
git fetch remote:branch
➔ Note, these changes are not merged yet!
● Shortcut: Do a pull
git pull remote:branch
= git fetch + git merge
38. Provide your changes
● Store the commits on a central repository server
● Not all local branches must be pushed → private stuff
keeps private!
git push remote:branch
➔ NEVER change the history of distributed changes using
rebase!
39. Stashing
● Common problem:
● Current work must be pushed asside but the changes
shouldn't be commited yet
● Changes in the workspace/index must be transfered
in another branch
● Solution: The index and changed files are cached and
the workspace and index is resetted
git stash save „description“
git stash apply
git stash pop # apply and drop
40. Stashing episode II
● Advantage: Stashing indexes the files and write them
into the reflog
● Even if these changes are never commited, you can get
them back
git stash list
git log stash@{10}
git show stash@{26}
git checkout -b old_work stash@{32}
● Use stashes simply like branches
➔ The reflog exists independent from the commits
41. Blame
● Problem: You don't know who implemented the code
snippet
● Solution: git blame -- file shows a list of changes for
a file and when and who modified it