Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Git Anti-Patterns: Extended Version With 28 Com...

Git Anti-Patterns: Extended Version With 28 Common Anti-Patterns

These are the slides containing 28 anti-patterns in Git. I present these slides at 2 hours meetups and seminars.

Lemi Orhan Ergin

July 15, 2017
Tweet

More Decks by Lemi Orhan Ergin

Other Decks in Programming

Transcript

  1. GITANTI 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
  2. DISCLOSURE There is no formula for using git efficiently. Opinions

    are my own. It means the opposites might work perfectly for your conditions.
  3. Are you using git if all you do is commit-push-pull

    use dropbox instead ANTIPATTERN DANGER as if it is dropbox ? 1 DROPBOX-ISH GIT ANTI-PATTERN
  4. 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
  5. Source Code Working Copy $ git init Object Database .git

    Folder / Object Database Cache Staging Area / The Index initializing repo
  6. 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
  7. 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
  8. 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
  9. 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
  10. $ 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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 2 BROKEN TIME MACHINE ANTI-PATTERN
  28. before merging do you validate commits back to source ?

    ANTIPATTERN DANGER code review, continuous integration, automated testing… 4 TOO LATE TO VALIDATE ANTI-PATTERN
  29. merge and unmerge do you o!en want to just before

    releases ? ANTIPATTERN DANGER 5 CHERRY-PICK OBSSESSION ANTI-PATTERN
  30. 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
  31. the commit graph ? do you fully understand topic and

    shared branches, tracking branches, tags, HEADs, merge commits, reverted commits…
  32. 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
  33. 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
  34. 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
  35. 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
  36. 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
  37. 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
  38. 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
  39. $ 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
  40. 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
  41. 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
  42. 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
  43. use terminal GUIs are prison balls of developers it’s ok

    to use GUIs while checking diffs, resolving conflicts and viewing commit graph BUTTON ADDICT ANTI-PATTERN 7 ANTIPATTERN DANGER
  44. 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-PATTERN 8 ANTIPATTERN DANGER
  45. 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-PATTERN 9 long living branches with care handle ANTIPATTERN DANGER Squash all commits in your topic branch and 
 make them available in working copy
  46. 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
  47. stop adding prevent commits from being big ball of muds

    every change OMNIBUS BILL ANTI-PATTERN 10 ANTIPATTERN DANGER
  48. stop adding prevent commits from being big ball of muds

    every change local change sets at JetBrains IDEs
  49. messages are read! # 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 com t m i F*CKING COMMIT MESSAGES ANTI-PATTERN 11 ANTIPATTERN DANGER
  50. by adding new commits ? do you rollback your mistakes

    ANTIPATTERN DANGER 12 MESS UP WITH THE ROLLBACK ANTI-PATTERN
  51. hard reset the merge commit $ git reset --hard HEAD~

    if you haven't pushed yet HEAD MASTER Bug fıx
  52. never force push and change the history if you already

    pushed to shared branch Bug fıx HEAD MASTER
  53. revert the merge commit $ git revert 8f937c6 -m 1

    if you already pushed Bug fıx HEAD MASTER
  54. is not the only method pushing commits to server ANTIPATTERN

    DANGER for sharing your code 13 CENTRALIZED GIT ANTI-PATTERN
  55. 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
  56. with the ones in source branch ? how do you

    sync your commits ANTIPATTERN DANGER 14 MERGE FANATIC ANTI-PATTERN
  57. FIX master c1 c2 c3 c4 c7 HEAD c5 c6

    c5 c6 use rebase $ git rebase master
  58. FIX master c1 c2 c3 c4 c7 HEAD c5 c6

    c5 c6 use rebase $ git rebase master
  59. FIX master c1 c2 c3 c4 c7 HEAD c5 c6

    c5 c6 use rebase $ git rebase master
  60. FIX master c1 c2 c3 c4 c7 HEAD c5 c6

    c5 c6 use rebase $ git rebase master c5 REPLAY #1
  61. FIX master c1 c2 c3 c4 c7 HEAD c5 c6

    c5 c6 use rebase $ git rebase master c5 REPLAY #2 c6 c6
  62. FIX master c1 c2 c3 c4 c7 HEAD c5 c6

    c5 c6 use rebase $ git rebase master c5 REWIND c6 c6
  63. FIX master c1 c2 c3 c4 c7 HEAD use rebase

    $ git rebase master c5 FINALIZE c6 c6
  64. 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
  65. 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
  66. wri!en in any form? anyone can push any code ANTIPATTERN

    DANGER 16 UNCONTROLLED POWER ANTI-PATTERN
  67. Depend on each other Too many repositories ANTIPATTERN DANGER for

    sharing your code 17 WEB OF REPOSITORIES ANTI-PATTERN
  68. Mono Repository System Even 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
  69. 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
  70. v1, v2, v3… having branch for every release ANTIPATTERN DANGER

    18 ORACLE SYNDROME ANTI-PATTERN at the same time
  71. 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
  72. do you use feature branches when there is no product

    at all ANTIPATTERN DANGER 21 BRANCH OVERDOSE ANTI-PATTERN
  73. push add dosya güncelleme committed Track ediliyor untracked unmodified pushed

    modified staged Staging Alanında Local Repoda Uzak Repoda added add commit commit
  74. hard reset committed Track ediliyor untracked unmodified pushed modified staged

    Staging Alanında Local Repoda Uzak Repoda added hard reset hard reset mixed reset mixed reset soft reset rm --cached rm x
  75. no one knows git perfect do you suffer? ANTIPATTERN DANGER

    23 NO HERO TO SAVE LIVES ANTI-PATTERN
  76. Having duplicate commits & Having irrelevant merge commits if you

    haven’t pushed yet ANTIPATTERN DANGER 24 DUPLICATE COMMITS ANTI-PATTERN
  77. UPSTREAM LOCAL master c1 c2 c3 c4 c7 c5 c6

    c5 c6 FIX HEAD master c1 c2 c3 c4 c7 c5 c6 c5 c6 FIX rebase and push
  78. UPSTREAM LOCAL master c1 c2 c3 c4 c7 c5 c6

    c5’ c6’ FIX HEAD master c1 c2 c3 c4 c7 c5 c6 c5 c6 FIX $ git rebase master rebase and push
  79. UPSTREAM LOCAL master c1 c2 c3 c4 c7 c5 c6

    c5’ c6’ FIX HEAD master c1 c2 c3 c4 c7 c5 c6 c5’ c6’ FIX $ git push -f rebase and push
  80. UPSTREAM LOCAL master c1 c2 c3 c4 c7 c5 c6

    c5 c6 FIX HEAD master c1 c2 c3 c4 c7 c5 c6 c5’ c6’ FIX pull rebased branch
  81. UPSTREAM LOCAL master c1 c2 c3 c4 c7 c5 c6

    c5’ c6’ FIX HEAD master c1 c2 c3 c4 c7 c5 c6 c5’ c6’ FIX $ git pull --rebase pull rebased branch
  82. UPSTREAM LOCAL master c1 c2 c3 c4 c7 c5 c6

    c5 c6 FIX HEAD master c1 c2 c3 c4 c7 c5 c6 c5’ c6’ FIX c5 c6 c5’ c6’ ORIGIN/FIX $ git pull pull rebased branch:(
  83. UPSTREAM LOCAL c1 c2 c3 c4 c7 c5 c6 c5

    c6 master c1 c2 c3 c4 c7 c5 c6 c5’ c6’ FIX c5 c6 c5’ c6’ c8 $ git pull master FIX HEAD ORIGIN/FIX pull rebased branch:(
  84. rebase not to merge your unpushed commits with the fetched

    ones use pull with prepared by @lemiorhan rebase to get rebased commits from upstream safely use pull with REBASE feature branches to integrate into public branches that you pushed or that you pulled from another person Never use Rebase USE
  85. do you know when we get conflicts and how to

    resolve it? ANTIPATTERN DANGER 27 CONFLICT-FOBIA ANTI-PATTERN
  86. 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-PATTERN 28 ANTIPATTERN DANGER
  87. 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
  88. 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
  89. $ 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