@lemiorhan
#DevoxxPL
Platinum Sponsor:
GITANTI
PATTERNS
How To Mess Up With Git and Love It Again
LEMi ORHAN ERGiN Agile Software Craftsman, iyzico
Slide 2
Slide 2 text
/lemiorhan
lemiorhanergin.com
@lemiorhan
meetup.scturkey.org
agileturkey.org
slideshare.net/lemiorhan
dev.iyzipay.com
LEMi ORHAN ERGiN
agile software craftsman @ iyzico
agile practice lead at iyzico
developing software since 2001
ex-Sony and ex-eBay employee
consultant, architect, trainer, developer
founder of Software Craftsmanship Turkey
ex community leader of Agile Turkey
got 1 million+ views for his slides
Slide 3
Slide 3 text
git is powerful
but you have to know using it properly
Slide 4
Slide 4 text
Are you using git
if all you do is commit-push-pull
use dropbox instead
ANTIPATTERN DANGER
as if it is dropbox ?
Slide 5
Slide 5 text
learn how git works
no worries, I will cover how git behaves
Slide 6
Slide 6 text
the way it keeps
FILES & FOLDERS
working copy
staging area
objects database
repository
the way it keeps
REFERENCES
directed acyclic graph
keeping snapshots
traversing graph
branches, tags, heads
git has 2 mechanisms
Slide 7
Slide 7 text
Source Code
Working Copy
you want to version changes
Slide 8
Slide 8 text
Source Code
Working Copy
$ git init
Object Database
.git Folder / Object Database
Cache
Staging Area / The Index
initializing repo
Slide 9
Slide 9 text
Source Code
Working Copy
$ git init --bare
Object Database
.git Folder / Object Database
Cache
Staging Area / The Index
Remote
Upstream Repo / Remote Repo
Server
initializing bare repo
Slide 10
Slide 10 text
Object Database
.git Folder / Object Database
Cache
Staging Area / The Index
Remote
Upstream Repo / Remote Repo
Server
Source Code
Working Copy
$ git add .
preparing commits
Object Database
.git Folder / Object Database
Cache
Staging Area / The Index
Remote
Upstream Repo / Remote Repo
Server
Source Code
Working Copy
$ git add .
preparing commits
Slide 13
Slide 13 text
Object Database
.git Folder / Object Database
Cache
Staging Area / The Index
Remote
Upstream Repo / Remote Repo
Server
Source Code
Working Copy
$ git commit -m “initial commit”
commi!ing
Slide 14
Slide 14 text
$ git commit -m “initial commit”
commi!ing
folder
folder
folder
file
file
file
commit
branch
HEAD
For more details, refer to book
Git Internals by Scott Chacon
Slide 15
Slide 15 text
folder
folder
folder
file
file
file
commit
$ git commit -m “second commit”
commi!ing
folder
commit
branch
HEAD
folder
file
folder
For more details, refer to book
Git Internals by Scott Chacon
Slide 16
Slide 16 text
folder
folder
folder
file
file
file
commit
$ git commit -m “third commit”
commi!ing
folder
commit
folder
file
folder
folder
commit
branch
HEAD
file
For more details, refer to book
Git Internals by Scott Chacon
Slide 17
Slide 17 text
Object Database
.git Folder / Object Database
Cache
Staging Area / The Index
Remote
Upstream Repo / Remote Repo
Server
Source Code
Working Copy
$ git commit -m “initial commit”
commi!ing
Slide 18
Slide 18 text
Object Database
.git Folder / Object Database
Cache
Staging Area / The Index
Remote
Upstream Repo / Remote Repo
Server
Source Code
Working Copy
$ git remote add origin http://upstream.repo
$ git push -u origin master
pushing to remote
Slide 19
Slide 19 text
Object Database
.git Folder / Object Database
Cache
Staging Area / The Index
Remote
Upstream Repo / Remote Repo
Server
Source Code
Working Copy
new changes from others are pushed
Slide 20
Slide 20 text
Object Database
.git Folder / Object Database
Cache
Staging Area / The Index
Remote
Upstream Repo / Remote Repo
Server
Source Code
Working Copy
$ git fetch
fetching changes
Slide 21
Slide 21 text
Object Database
.git Folder / Object Database
Cache
Staging Area / The Index
Remote
Upstream Repo / Remote Repo
Server
Source Code
Working Copy
$ git merge FETCHED_HEAD
updating working copy
Slide 22
Slide 22 text
Object Database
.git Folder / Object Database
Cache
Staging Area / The Index
Remote
Upstream Repo / Remote Repo
Server
Source Code
Working Copy
$ git pull
git fetch + git merge
ge!ing changes to source code
Slide 23
Slide 23 text
Object Database
.git Folder / Object Database
Cache
Staging Area / The Index
Remote
Upstream Repo / Remote Repo
Server
Source Code
Working Copy
want to update last commit
Slide 24
Slide 24 text
Object Database
.git Folder / Object Database
Cache
Staging Area / The Index
Remote
Upstream Repo / Remote Repo
Server
Source Code
Working Copy
$ git reset --soft $ git commit --amend
/ so" reseting
cannot be reached
Only the cache for
the commit you reseted
is removed from staging area
for your current branch
Slide 25
Slide 25 text
folder
folder
folder
file
file
file
commit
folder
commit
folder
file
folder
folder
commit
branch
HEAD
file
For more details, refer to book
Git Internals by Scott Chacon
$ git reset --soft $ git commit --amend
/ so" reseting
Slide 26
Slide 26 text
folder
folder
folder
file
file
file
commit
folder
commit
folder
file
folder
folder
commit
branch
HEAD
file
For more details, refer to book
Git Internals by Scott Chacon
$ git reset --soft $ git commit --amend
/ so" reseting
Slide 27
Slide 27 text
Object Database
.git Folder / Object Database
Cache
Staging Area / The Index
Remote
Upstream Repo / Remote Repo
Server
Source Code
Working Copy
want to squash or change last commits
Slide 28
Slide 28 text
Object Database
.git Folder / Object Database
Cache
Staging Area / The Index
Remote
Upstream Repo / Remote Repo
Server
Source Code
Working Copy
$ git reset --mixed mixed reseting
cannot be reached
entries for commits, files
and folders are removed
from staging area
Slide 29
Slide 29 text
Object Database
.git Folder / Object Database
Cache
Staging Area / The Index
Remote
Upstream Repo / Remote Repo
Server
Source Code
Working Copy
want to get rid of last commits
Slide 30
Slide 30 text
Object Database
.git Folder / Object Database
Cache
Staging Area / The Index
Remote
Upstream Repo / Remote Repo
Server
Source Code
Working Copy
$ git reset --hard hard reseting
cannot be reached
removed from staging area
removed from working copy
Slide 31
Slide 31 text
are you brave enough to
jump to any commit ?
jump to a branch
create a branch from a commit
create a branch from a tag
ANTIPATTERN DANGER
$ git checkout feature/PA-121
$ git checkout -b fix/missing-sign-parameter 2449be8
$ git checkout -b hotfix/v1.1 tags/v1
Slide 32
Slide 32 text
are you sure?
are you brave enough to
jump to any commit ?
Slide 33
Slide 33 text
do you have
loooooong living
topic branches ?
ANTIPATTERN DANGER
Slide 34
Slide 34 text
do you have
loooooong living
topic branches ?
welcome to
merge hell
Slide 35
Slide 35 text
before merging
do you validate commits
back to source ?
ANTIPATTERN DANGER
code review, continuous integration, automated testing…
Slide 36
Slide 36 text
before merging
do you validate commits
back to source ? are you
sure?
Slide 37
Slide 37 text
merge and unmerge
do you o!en want to
just before releases ?
ANTIPATTERN DANGER
Slide 38
Slide 38 text
merge and unmerge
do you o!en want to
just before releases ?
master
HEAD
TAG/v13
version 14
$ git cherry-pick Every-Single-Commit-We-Want-To-Deploy
Slide 39
Slide 39 text
the commit graph ?
do you fully understand
ANTIPATTERN DANGER
Slide 40
Slide 40 text
the commit graph ?
do you fully understand
topic and shared branches, tracking branches, tags, HEADs, merge commits, reverted commits…
Slide 41
Slide 41 text
Cure?
Slide 42
Slide 42 text
Commit Early, Commit O"en
Perfect Later, Publish Once
Slide 43
Slide 43 text
STEP 0
split your big feature into
mini shippable tasks
master
HEAD
TOPIC
ORIGIN/master
refactorings
tasks, like rest endpoints
testable, deployable
each task will have a
branch, not a feature
Slide 44
Slide 44 text
STEP 1
commit early
commit o!en
no need to compile
no need for CI
it’s only for versioning
do not push
master
HEAD
TOPIC
ORIGIN/master
Slide 45
Slide 45 text
always pull with rebase
$ git pull --rebase origin master
to get forced pushes securely
to rebase your commits
master
HEAD
TOPIC
STEP 2
ORIGIN/master
Slide 46
Slide 46 text
always pull with rebase
$ git pull --rebase origin master
to get forced pushes securely
to rebase your commits
master
HEAD
TOPIC
STEP 2
ORIGIN/master
Slide 47
Slide 47 text
always pull with rebase
$ git pull --rebase origin master
to get forced pushes securely
to rebase your commits
master
HEAD
TOPIC
STEP 2
ORIGIN/master
if you branch is pushed already
$ git push -f
Slide 48
Slide 48 text
always pull with rebase
$ git pull --rebase origin master
to get forced pushes securely
to rebase your commits
master
HEAD
TOPIC
STEP 2
ORIGIN/master
if you branch is pushed already
$ git push -f
Sync source branch a!erwards
$ git fetch origin master:master
Slide 49
Slide 49 text
perfect later
make it single commit
$ git reset HEAD~3
or
$ git rebase -i HEAD~3
HEAD
TOPIC
STEP 3
ORIGIN/master
tests are passing
app is working
code is reviewed (*)
master
Slide 50
Slide 50 text
$ git reset HEAD~3 (then commit)
or
$ git rebase -i HEAD~3
HEAD
TOPIC
STEP 3
ORIGIN/master
perfect later
make it single commit
tests are passing
app is working
code is reviewed (*)
master
Slide 51
Slide 51 text
Use feature flags/toggles
HEAD
TOPIC
STEP 4
ORIGIN/master
if feature should be disabled
merge back to source
$ git checkout master
$ git merge topic
master
Slide 52
Slide 52 text
Use feature flags/toggles
master
HEAD
TOPIC
STEP 4
ORIGIN/master
if feature should be disabled
merge back to source
$ git checkout master
$ git merge topic
Slide 53
Slide 53 text
Continuous Integration
validates master branch
continuously
master
HEAD
TOPIC
ORIGIN/master
Pull requests can be
used to review code
and to validate before
merging back to master
Scrum tasks are
mapped to commits,
not stories
Github Flow can be
used to govern overall
TAMING
THE POWER OF GIT
make git the king again
Feature flags should be
used whenever possible
Commit early & o"en
perfect later, publish
once philosophy
Deliver frequently
be prepared to send
every single commit
Deleting branches a"er
merge will make your
commit graph readable
Slide 54
Slide 54 text
Any Other Cures?
Slide 55
Slide 55 text
use terminal
GUIs are prison balls of developers
it’s ok to use GUIs while checking diffs,
resolving conflicts and viewing commit graph
Slide 56
Slide 56 text
do not lose
take extra care while using hard reset
$ git reset --merge HEAD~
Use stash $ git stash save “updates local settings to keep db safe”
$ git reset --hard HEAD~
$ git stash apply stash@{0}
Create a new branch $ git checkout -b feature/PA-121
$ git add settings.xml
$ git commit -m “adds new settings config”
Use hard reset
with merge
and commit into it
uncommited changes
Slide 57
Slide 57 text
TOPIC
HEAD
MASTER
long living branches with care
handle
Squash all commits in your topic branch and
make them available in working copy
$ git merge --squash fix
Squash commit -- not updating HEAD
Automatic merge went well; stopped before committing as requested
$ git add .
$ git commit -m “adds a feature”
$ git branch -D topic
Slide 58
Slide 58 text
long living branches with care
handle
TOPIC
HEAD
MASTER
$ git merge --squash fix
Squash commit -- not updating HEAD
Automatic merge went well; stopped before committing as requested
$ git add .
$ git commit -m “adds a feature”
$ git branch -D topic
Squash all commits in your topic branch and
make them available in working copy
Slide 59
Slide 59 text
stop adding
prevent commits from being big ball of muds
every change
Slide 60
Slide 60 text
stop adding
prevent commits from being big ball of muds
every change
local change sets at JetBrains IDEs
Slide 61
Slide 61 text
stop adding every change
partial add
Slide 62
Slide 62 text
messages
are
read!
# WHAT
# (this commit will...)
# WHY and HOW
# Explain why this change is being made
# RELATED
# Provide links or keys to any relevant issues or other resources
# REMEMBER
# use lower case in the subject line
# start with a verb in imperative tone in the subject line
# do not end the subject line with a period
# separate subject from body with a blank line
# use the body to explain what and why vs. how
# can use multiple lines with "-" for bullet points in body
$ git config --global commit.template ~/.git-commit-template.txt
$ git config --global commit.cleanup strip
.git-commit-template.txt
use git commit
templates to
create be"er
commit messages
com
t
m
i
Slide 63
Slide 63 text
messages
are
read!
use git commit
templates to
create be"er
commit messages
com
t
m
i
Slide 64
Slide 64 text
RECAP
what was really
happened at that time?
LET’S
Slide 65
Slide 65 text
master
TAG/v1.1
login
HEAD
DETACHED HEAD STATE
$ git checkout cecd95914
Note: checking out 'cecd95914'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
Slide 66
Slide 66 text
master
TAG/v1.1
login
HEAD
DETACHED HEAD STATE
$ git rebase (and conflicts happen)
$ git checkout HEAD~2
$ git checkout 43e3ab01
$ git checkout tags/v1.1
WHEN IT HAPPENS
Slide 67
Slide 67 text
master
TAG/v1.1
login
HEAD
poor little developer...
Slide 68
Slide 68 text
master
TAG/v1.1
login
HEAD
$ git checkout master
Slide 69
Slide 69 text
master
TAG/v1.1
login
HEAD
$ git reflog
aa67e3a2c HEAD@{0}: rebase finished: returning to refs/heads/fix/java-sql-Date-violates-LSR
aa67e3a2c HEAD@{1}: rebase: fixes UnsupportedOperationException while calling toIstant() method of java.sql.Date
a45f3c4e5 HEAD@{2}: rebase: checkout develop
630ddad6e HEAD@{3}: checkout: moving from develop to fix/java-sql-Date-violates-LSR
b26cf7a1a HEAD@{4}: rebase: checkout develop
630ddad6e HEAD@{5}: checkout: moving from develop to fix/java-sql-Date-violates-LSR
b26cf7a1a HEAD@{6}: pull: Fast-forward
8b59f8f50 HEAD@{7}: checkout: moving from fix/java-sql-Date-violates-LSR to develop
Slide 70
Slide 70 text
$ git reflog
630ddad6e
the one we are
searching for
master
TAG/v1.1
login
HEAD
aa67e3a2c HEAD@{0}: rebase finished: returning to refs/heads/fix/java-sql-Date-violates-LSR
aa67e3a2c HEAD@{1}: rebase: fixes UnsupportedOperationException while calling toIstant() method of java.sql.Date
a45f3c4e5 HEAD@{2}: rebase: checkout develop
630ddad6e HEAD@{3}: checkout: moving from develop to fix/java-sql-Date-violates-LSR
b26cf7a1a HEAD@{4}: rebase: checkout develop
630ddad6e HEAD@{5}: checkout: moving from develop to fix/java-sql-Date-violates-LSR
b26cf7a1a HEAD@{6}: pull: Fast-forward
8b59f8f50 HEAD@{7}: checkout: moving from fix/java-sql-Date-violates-LSR to develop
Slide 71
Slide 71 text
master
typofix
TAG/v1.1
login
HEAD
$ git branch typofix 630ddad6e
Slide 72
Slide 72 text
master
typofix
TAG/v1.1
login
HEAD
$ git branch typofix 630ddad6e
KEEP CALM, NOTHING WILL BE LOST
Slide 73
Slide 73 text
LEMi ORHAN ERGiN
agile software craftsman @ iyzico
/lemiorhan
lemiorhanergin.com
@lemiorhan
DO NOT FORGET
VIA MY DEVOXX MOBILE APP
TO GIVE FEEDBACK TO LEMI