125
GIT ANTI PATTERNS How To Mess Up With Git and Love It Again LEMi ORHAN ERGiN Agile Software Craftsman, iyzico /lemiorhan lemiorhanergin.com @lemiorhan 28 common git anti-patterns

Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Embed Size (px)

Citation preview

Page 1: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

GIT ANTIPATTERNS

How To Mess Up With Git and Love It Again

LEMi ORHAN ERGiNAgile Software Craftsman, iyzico

/lemiorhan lemiorhanergin.com @lemiorhan

28 common git anti-patterns

Page 2: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

DISCLOSUREThere is no formula for using git efficiently.

Opinions are my own. It means the opposites might work perfectly for your conditions.

GIT

Page 3: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

git is powerfulbut you have to know using it properly

Page 4: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Are you using git

if all you do is commit-push-pulluse dropbox instead

ANTIPATTERN DANGER

as if it is dropbox ?

1DROPBOX-ISH GIT ANTI-PATTERN

Page 5: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

learn how git worksno worries, I will cover how git behaves

Page 6: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

the way it keeps FILES & FOLDERS

working copy staging area

objects database repository

the way it keeps REFERENCESdirected acyclic graph keeping snapshots traversing graph branches, tags, heads

git has 2 mechanisms

Page 7: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Source CodeWorking Copy

you want to version changes

Page 8: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Source CodeWorking Copy

$ git init

Object Database.git Folder / Object Database

CacheStaging Area / The Index

initializing repo

Page 9: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Source CodeWorking Copy

$ git init --bare

Object Database.git Folder / Object Database

CacheStaging Area / The Index

RemoteUpstream Repo / Remote Repo

Server

initializing bare repo

Page 10: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Object Database.git Folder / Object Database

CacheStaging Area / The Index

RemoteUpstream Repo / Remote Repo

Server

Source CodeWorking Copy

$ git add . preparing commits

Page 11: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

folder

folder

folder

file

file

file

$ git add . preparing commits

Page 12: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Object Database.git Folder / Object Database

CacheStaging Area / The Index

RemoteUpstream Repo / Remote Repo

Server

Source CodeWorking Copy

$ git add . preparing commits

Page 13: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Object Database.git Folder / Object Database

CacheStaging Area / The Index

RemoteUpstream Repo / Remote Repo

Server

Source CodeWorking Copy

$ git commit -m “initial commit” commi!ing

Page 14: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

$ 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

Page 15: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

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

Page 16: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

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

Page 17: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Object Database.git Folder / Object Database

CacheStaging Area / The Index

RemoteUpstream Repo / Remote Repo

Server

Source CodeWorking Copy

$ git commit -m “initial commit” commi!ing

Page 18: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Object Database.git Folder / Object Database

CacheStaging Area / The Index

RemoteUpstream Repo / Remote Repo

Server

Source CodeWorking Copy

$ git remote add origin http://upstream.repo$ git push -u origin master pushing to remote

Page 19: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Object Database.git Folder / Object Database

CacheStaging Area / The Index

RemoteUpstream Repo / Remote Repo

Server

Source CodeWorking Copy

new changes from others are pushed

Page 20: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Object Database.git Folder / Object Database

CacheStaging Area / The Index

RemoteUpstream Repo / Remote Repo

Server

Source CodeWorking Copy

$ git fetch fetching changes

Page 21: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Object Database.git Folder / Object Database

CacheStaging Area / The Index

RemoteUpstream Repo / Remote Repo

Server

Source CodeWorking Copy

$ git merge FETCHED_HEAD updating working copy

Page 22: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Object Database.git Folder / Object Database

CacheStaging Area / The Index

RemoteUpstream Repo / Remote Repo

Server

Source CodeWorking Copy

$ git pullgit fetch + git merge

ge!ing changes to source code

Page 23: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Object Database.git Folder / Object Database

CacheStaging Area / The Index

RemoteUpstream Repo / Remote Repo

Server

Source CodeWorking Copy

want to update last commit

Page 24: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Object Database.git Folder / Object Database

CacheStaging Area / The Index

RemoteUpstream Repo / Remote Repo

Server

Source CodeWorking 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

Page 25: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

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

Page 26: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

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

Page 27: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Object Database.git Folder / Object Database

CacheStaging Area / The Index

RemoteUpstream Repo / Remote Repo

Server

Source CodeWorking Copy

want to squash or change last commits

Page 28: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Object Database.git Folder / Object Database

CacheStaging Area / The Index

RemoteUpstream Repo / Remote Repo

Server

Source CodeWorking Copy

$ git reset --mixed mixed reseting

cannot be reached

entries for commits, files

and folders are removed from staging area

Page 29: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Object Database.git Folder / Object Database

CacheStaging Area / The Index

RemoteUpstream Repo / Remote Repo

Server

Source CodeWorking Copy

want to get rid of last commits

Page 30: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Object Database.git Folder / Object Database

CacheStaging Area / The Index

RemoteUpstream Repo / Remote Repo

Server

Source CodeWorking Copy

$ git reset --hard hard reseting

cannot be reached

removed from staging area

removed from working copy

Page 31: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

are you brave enough tojump 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

2BROKEN TIME MACHINE ANTI-PATTERN

Page 32: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

are you sure?

are you brave enough tojump to any commit ?

Page 33: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

do you haveloooooong living

topic branches ?

ANTIPATTERN DANGER

3LONG LIVING BRANCHES ANTI-PATTERN

Page 34: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

do you haveloooooong living

topic branches ?

welcome tomerge hell

Page 35: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

before mergingdo you validate commits

back to source ?

ANTIPATTERN DANGER

code review, continuous integration, automated testing…

4TOO LATE TO VALIDATE ANTI-PATTERN

Page 36: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

before mergingdo you validate commits

back to source ? are you sure?

Page 37: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

merge and unmergedo you o!en want to

just before releases ?

ANTIPATTERN DANGER

5CHERRY-PICK OBSSESSION ANTI-PATTERN

Page 38: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

merge and unmergedo you o!en want to

just before releases ?

master

HEAD

TAG/v13

version 14

$ git cherry-pick Every-Single-Commit-We-Want-To-Deploy

Page 39: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

the commit graph ?do you fully understand

ANTIPATTERN DANGER

6DEATH ON COMMIT GRAPH ANTI-PATTERN

Page 40: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

the commit graph ?do you fully understand

topic and shared branches, tracking branches, tags, HEADs, merge commits, reverted commits…

Page 41: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Cure?

Page 42: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Commit Early, Commit O"en Perfect Later, Publish Once

Page 43: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

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

Page 44: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

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

Page 45: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

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

Page 46: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

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

Page 47: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

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

Page 48: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

always pull with rebase

$ git pull --rebase origin master

to get forced pushes securely to rebase your commitsmaster

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

Page 49: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

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

Page 50: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

$ 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

Page 51: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

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

Page 52: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

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

Page 53: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Continuous Integration validates master branch continuouslymaster

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 GITmake 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

Page 54: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

use terminalGUIs are prison balls of developers

it’s ok to use GUIs while checking diffs, resolving conflicts and viewing commit graph

BUTTON ADDICT ANTI-PATTERN7

ANTIPATTERN DANGER

Page 55: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

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

CODE LOSING SYNDROME ANTI-PATTERN8

ANTIPATTERN DANGER

Page 56: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

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

TRASH HOUSE ANTI-PATTERN9

long living branches with carehandleANTIPATTERN DANGER

Squash all commits in your topic branch and make them available in working copy

Page 57: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

long living branches with carehandle

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

Page 58: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

stop adding

prevent commits from being big ball of mudsevery change

OMNIBUS BILL ANTI-PATTERN10

ANTIPATTERN DANGER

Page 59: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

stop adding

prevent commits from being big ball of mudsevery change

local change sets at JetBrains IDEs

Page 60: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

stop adding every changepartial add

Page 61: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

messages areread!

# WHAT # <issue id> (this commit will...) <subject>

# 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

use git commit templates to create be"er commit messages

comt

mi

F*CKING COMMIT MESSAGES ANTI-PATTERN11

ANTIPATTERN DANGER

Page 62: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

messages areread!use git commit templates to create be"er commit messages

comt

mi

Page 63: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

by adding new commits ?do you rollback your mistakes

ANTIPATTERN DANGER

12MESS UP WITH THE ROLLBACK ANTI-PATTERN

Page 64: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

hard reset the merge commit$ git reset --hard HEAD~

if you haven't pushed yet

HEAD

MASTER

Bug fıx

Page 65: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

never force push and change the history

if you already pushed to shared branch

Bug fıx

HEAD

MASTER

Page 66: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

revert the merge commit$ git revert 8f937c6 -m 1

if you already pushedBug fıx

HEAD

MASTER

Page 67: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

is not the only methodpushing commits to server

ANTIPATTERN DANGER

for sharing your code

13CENTRALIZED GIT ANTI-PATTERN

Page 68: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Git Pong Pairing

$ git remote add personA <URL> $ git fetch personA $ git checkout personA/master $ git checkout -b feature/PA-231 add your changes and commit $ git push personA feature/PA-231

A B

$ git checkout feature/PA-231 add your changes and commit

$ git pull personA feature/PA-231

Page 69: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

with the ones in source branch ?

how do you sync your commits

ANTIPATTERN DANGER

14MERGE FANATIC ANTI-PATTERN

Page 70: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Bug fıx

ladder pa!ernoccurs when premature merge happens

HEAD

MASTER

Page 71: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

FIX

master

c1 c2 c3 c4 c7

HEAD

c5 c6c5 c6

use rebase $ git rebase master

Page 72: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

FIX

master

c1 c2 c3 c4 c7

HEAD

c5 c6c5 c6

use rebase $ git rebase master

Page 73: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

FIX

master

c1 c2 c3 c4 c7

HEAD

c5 c6c5 c6

use rebase $ git rebase master

Page 74: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

FIX

master

c1 c2 c3 c4 c7

HEAD

c5 c6c5 c6

use rebase $ git rebase master

c5

REPLAY #1

Page 75: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

FIX

master

c1 c2 c3 c4 c7

HEAD

c5 c6c5 c6

use rebase $ git rebase master

c5

REPLAY #2

c6c6

Page 76: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

FIX

master

c1 c2 c3 c4 c7

HEAD

c5 c6c5 c6

use rebase $ git rebase master

c5

REWIND

c6c6

Page 77: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

FIX

master

c1 c2 c3 c4 c7

HEAD

use rebase $ git rebase master

c5

FINALIZE

c6c6

Page 78: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

deleting branches?are you scared of

ANTIPATTERN DANGER

15BRANCH CEMETERY ANTI-PATTERN

Page 79: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

delete merged local branches$ git branch --merged | grep -v '^* master$' | grep -v '^  master$' | xargs git branch -d

delete remote branches$ git branch -r --merged | grep -v master | sed 's/origin\///'

| xargs -n 1 git push --delete origin

Page 80: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

delete all merged local branches$ git branch --merged | grep -v '^* master$' | grep -v '^  master$' | xargs git branch -d

delete all merged remote branches$ git branch -r --merged | grep -v master | sed 's/origin\///'

| xargs -n 1 git push --delete origin

Page 81: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

wri!en in any form?anyone can push any code

ANTIPATTERN DANGER

16UNCONTROLLED POWER ANTI-PATTERN

Page 82: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

use pre-receive hooks

Page 83: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Depend on each otherToo many repositories

ANTIPATTERN DANGER

for sharing your code

17WEB OF REPOSITORIES ANTI-PATTERN

Page 84: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Mono Repository SystemEven though our services are still developed and deployed independently, the code for all services lives in one repository

The repository contains more than one logical project (e.g. an iOS client and a web-application)

These projects are most likely unrelated, loosely connected or can be connected by other means (e.g via dependency management tools)

Twi#er, Facebook, Google, Digital Ocean, Foursquare, Etsy, Shippable, Plataformatec, Ravelin

Page 85: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

You can not do CI without using monorepos - Xebia

“When you start a new project,” Potvin tells WIRED, “you have a wealth of libraries already available to you. Almost everything has already been done.” - Rachel Potvin, Engineering Manager at Google

Our productivity has increased at least 5x. - Shippable

Page 86: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

v1, v2, v3…having branch for every release

ANTIPATTERN DANGER

18ORACLE SYNDROME ANTI-PATTERN

at the same time

Page 87: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Commit early & o"en perfect later, publish once philosophy

Deploy frequently be prepared to send every single commit

Newer keep release branches for a long time master branch should be enough for all your needs

Page 88: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

to git repoyou pushed confidential info

ANTIPATTERN DANGER

19WAITING FOR HACKERS ANTI-PATTERN

Page 89: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Ref: https://help.github.com/articles/remove-sensitive-data/

Page 90: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Do you know what evil merge is?

ANTIPATTERN DANGER

20EVIL MERGE ANTI-PATTERN

Page 91: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup
Page 92: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

do you use feature branches when there is no product at all

ANTIPATTERN DANGER

21BRANCH OVERDOSE ANTI-PATTERN

Page 93: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

use single branch topic branches simply make everything more

complex

Page 94: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Scared on using git commands

ANTIPATTERN DANGER

22CHUCKY THE COMMAND ANTI-PATTERN

Page 95: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

push

add

dosya güncelleme

committed

Track ediliyor

untracked unmodified pushedmodifiedstaged

Staging Alanında Local Repoda Uzak Repoda

added

add

commitcommit

Page 96: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

hard reset

committed

Track ediliyor

untracked unmodified pushedmodifiedstaged

Staging Alanında Local Repoda Uzak Repoda

added

hard reset

hard reset

mixed reset

mixed reset

soft reset

rm --cached

rmx

Page 97: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

h"ps://github.com/lemiorhan/git-kata

Page 98: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

no one knows git perfect do you suffer?

ANTIPATTERN DANGER

23NO HERO TO SAVE LIVES ANTI-PATTERN

Page 99: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

have a git-man at least one developer should expertise on git

for supporting the others

Page 100: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

Having duplicate commits &

Having irrelevant merge commits if you haven’t pushed yet

ANTIPATTERN DANGER

24DUPLICATE COMMITS ANTI-PATTERN

Page 101: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup
Page 102: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

UPSTREAMLOCAL

master

c1 c2 c3 c4 c7

c5 c6c5 c6

FIX

HEAD

master

c1 c2 c3 c4 c7

c5 c6c5 c6

FIX

rebase and push

Page 103: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

UPSTREAMLOCAL

master

c1 c2 c3 c4 c7

c5 c6c5’ c6’

FIX

HEAD

master

c1 c2 c3 c4 c7

c5 c6c5 c6

FIX

$ git rebase master

rebase and push

Page 104: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

UPSTREAMLOCAL

master

c1 c2 c3 c4 c7

c5 c6c5’ c6’

FIX

HEAD

master

c1 c2 c3 c4 c7

c5 c6c5’ c6’

FIX

$ git push -f

rebase and push

Page 105: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

UPSTREAMLOCAL

master

c1 c2 c3 c4 c7

c5 c6c5 c6

FIX

HEAD

master

c1 c2 c3 c4 c7

c5 c6c5’ c6’

FIX

pull rebased branch

Page 106: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

UPSTREAMLOCAL

master

c1 c2 c3 c4 c7

c5 c6c5’ c6’

FIX

HEAD

master

c1 c2 c3 c4 c7

c5 c6c5’ c6’

FIX

$ git pull --rebase

pull rebased branch

Page 107: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

UPSTREAMLOCAL

master

c1 c2 c3 c4 c7

c5 c6c5 c6

FIX

HEAD

master

c1 c2 c3 c4 c7

c5 c6c5’ c6’

FIX

c5 c6c5’ c6’

ORIGIN/FIX

$ git pull

pull rebased branch:(

Page 108: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

UPSTREAMLOCAL

c1 c2 c3 c4 c7

c5 c6c5 c6

master

c1 c2 c3 c4 c7

c5 c6c5’ c6’

FIX

c5 c6c5’ c6’

c8

$ git pull

master

FIX

HEAD

ORIGIN/FIX

pull rebased branch:(

Page 109: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

we commit when we have something big

ANTIPATTERN DANGER

25BIG FAT COMMIT ANTI-PATTERN

Page 110: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

use TDD style whenever tests pass, commit

that makes you commit early and o!en

Page 111: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

are you scared of using rebase?

ANTIPATTERN DANGER

26REBASE-FOBIA ANTI-PATTERN

Page 112: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

rebasenot to merge your unpushed

commits with the fetched ones

use pull with

prepared by @lemiorhan

rebaseto get rebased commits from upstream safely

use pull with

REBASEfeature branches to integrate

into public branches

that you pushed or that you pulled

from another person

Never use Rebase

USE

Page 113: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

do you know when we get conflicts and how to resolve it?

ANTIPATTERN DANGER

27CONFLICT-FOBIA ANTI-PATTERN

Page 114: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup
Page 115: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup
Page 116: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

RECAP

what was reallyhappened at that time?

LET’S

Page 117: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

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.

LIVING AT DETACHED HEAD STATE ANTI-PATTERN28

ANTIPATTERN DANGER

Page 118: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

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

Page 119: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

master

TAG/v1.1

login

HEAD

poor little developer...

Page 120: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

master

TAG/v1.1

login

HEAD

$ git checkout master

Page 121: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

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 630ddad6e HEAD@{8}: rebase: updating HEAD

Page 122: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

$ git reflog

630ddad6ethe 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 630ddad6e HEAD@{8}: rebase: updating HEAD

Page 123: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

master

typofix

TAG/v1.1

login

HEAD

$ git branch typofix 630ddad6e

Page 124: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

master

typofix

TAG/v1.1

login

HEAD

$ git branch typofix 630ddad6e

KEEP CALM, NOTHING WILL BE LOST

Page 125: Git Anti-Patterns - Extended Version With 28 Common Anti-Patterns) - SCTurkey Meetup

LEMi ORHAN ERGiNagile software craftsman @ iyzico

/lemiorhan lemiorhanergin.com @lemiorhan

ANTIPATTERN DANGER