SlideShare a Scribd company logo
Carlos Duarte Do Nascimento
@chesterbr • http://chester.me
git fail --force
make it up with your pull requests
Let’s write some code!
Whoops...
WTF?
git fail --force (make it up with your pull requests)
git fail --force (make it up with your pull requests)
It’s either “git for dummies”...
git fail --force (make it up with your pull requests)
git fail --force (make it up with your pull requests)
Hovertext:“If that doesn't fix it, git.txt
contains the phone number of a friend
of mine who understands git.
Just wait through a few minutes of 'It's
really pretty simple, just think of
branches as...' and eventually you'll learn
the commands that will fix everything.”
Git - 30/Out/2015
https://xkcd.com/1597/
Neither rookie nor expert
Good professionals will try to become
proficient in their tools - not become
specialists in all of them
Expert Advice
● “Do a git pull once in a while”
● “Never use git pull”
● “Always rebase!”
● “Never rebase!!!”
● ...
How does that end?
Proposal
Revisit git concepts from the
perspective of a typical workflow,
avoiding theory overload and the
abuse of rules and cookbooks
Carlos Duarte Do Nascimento
(Chester)
@chesterbr • http://chester.me
Git non-specialist
https://www.shopify.com/careers
git fail --force (make it up with your pull requests)
Git
A system that allows people to work
with source code in an orderly and
simultaneous fashion
Commit
When a meaningful change is made,
you take it to the stage in order to
take a snapshot (commit)
A92347C2…1F2493E34: Increase submit button size
DescriptionID
Commit == snapshot
“Git is all about composing and saving
snapshots of your project and then
working with and comparing those
snapshots”
http://gitref.org/basic/
Branch
Successive commits form a timeline
One can commit into alternative
timelines (branches) and later integrate
those with the main timeline (master)
Group work
Your commits “live” in your local
repository (.git/)
You can push commits to other
people’s repositories (remotes), and
also pull commits from there
Organizing your group
This flow of commits/branches can be
organized in several ways (workflows)
A central repository that
enables code reviews by means
of pull requests helps a lot...
● Refresh master (remote ⇒ local)
● Create new branch from there
● Commits, commits, commits!
● Push, PR (my branch ⇒ master)
●
●
But what if...
● ...CI* fails?
● ...other devs suggest changes?
● ...master changed while I worked?
*Continuous Integration
Conflict!
Image © 1995 GAINAX/Project Eva.
Manual merge
$ git checkout master
$ git pull
$ git checkout my-branch
...
$ git commit
$ git push
...
$ git push --force
#NOT
It can get really bad
● Irreconcilable conflicts
● Alien commits on my PR
● Commit is there, code is not
● The @#%@ button is still grey
● ...
How can we fix/avoid that?
By understanding what is happening on
a pull request to identify (and avoid)
traps, or, as a last resource, to rebuild
our PR with minimal effort
Pull request
Pull Merge request
“wants to merge?”
git merge
Includes commits from another branch in
the current one, without changing them
(an extra commit at the end will
consolidate changes from both sides)
How can that go wrong?
Consolidating changes from two
different timelines becomes more
complex as they diverge
Avoid the problem
Whenever possible, create small,
isolated and short-living branches
If you can’t avoid it
There are several ways to make a
branch compatible with master again
Our workflow works well with rebase
git rebase
Rebuild the branch from its original
point (by default), creating new commits
identical to the original ones (by default)
(hint: these defaults won’t help you)
What can I do with rebase?
● (re-)base your changes on a more
recent master
(e.g.: git fetch; git rebase origin/master)
● Simplify your commits
(e.g.: git rebase --interactive master)
How can that go wrong?
Updating the branch and simplifying
commits at the same time is tricky
Rewriting a branch that is already
published causes incompatibilities
PR prep suggestion (1)
Recreate your branch from a
more recent master
(without changing the commits)
git checkout master
git pull
git checkout my-branch
git rebase master
PR prep suggestion (2)
Simplify your commits
(without changing the branch point)
git rebase –-interactive master
Suggestion ≠ rule
If the master didn’t change (much),
don’t botter updating
If your commits are clear,
don’t bother interacting
After the PR is created
New commits can be added to the
remote, just git push them
Rebase, however, isn’t that simple
(why?)
Rebases change the past!!!
(uhhh... so what?)
Image © Universal Studios.All rights Reserved
Is that a real problem?
A git push from a rebased branch has
to replace the remote branch history
(hence the --force requirement)
Workflow to the rescue
If the workflow says
only the creator
commits on a PR,
rebasing its branch
should not cause
any trouble
Image © 2016Twentieth Century Fox Film Corporation.
Avoiding further trouble
Just like before the first push, don’t
change the start point and
simplify commits at the same time
A new commit is always less
tricky than a rebase
Master is sacred
Branches / pull requests are only
relevant during their lifetime
It hit the fan - now what?
git cherry-pick
Reproduces in your branch the
changes from a single commit
(even a branch-less one)
git cherry-pick id
Cherry-pick good commits
Instead of recreating changes manually,
we can cherry-pick the original
commits into a fresh branch
But we need to find those commits...
git log x git reflog
git log lists commits created in the
current branch (lots of search options)
git reflog lists any operations that
affected the local repository in any way
git reflog
f84195a HEAD@{0}: checkout: moving from 1468-more-resilience-on-in
d5a8868 HEAD@{1}: commit: Log the invalid listing on offer-less of
79e7c98 HEAD@{2}: commit: Better test naming and more detailed log
31e2ac1 HEAD@{3}: checkout: moving from master to 1468-more-resili
f84195a HEAD@{4}: rebase finished: returning to refs/heads/master
f84195a HEAD@{5}: pull --rebase --autostash: checkout f84195a626e9
ac12705 HEAD@{6}: rebase finished: returning to refs/heads/master
ac12705 HEAD@{7}: pull --rebase --autostash: checkout ac127053051c
...
#howto
1. Find all the commits that were
supposed to be on your PR
git log • git reflog •
#howto
2. Sync your master with the server
and create a brand new branch from it
git checkout master
git pull
git checkout -b new-branch
#howto
3.Apply the commits
git cherry-pick id1 id2 id3...
#howto
4. Replace the old branch with the new
one (on local and remote repos)
git checkout master
git branch -D my-branch
git branch -m new-branch my-branch
git checkout my-branch
git push –-set-upstream origin my-branch
--force
Life is good again!
Conclusion (1)
You don’t need to know everything
about git, but it’s a good idea to have a
solid understanding of some concepts
(e.g.: commit, branch, merge, rebase)
Conclusion (2)
As long as it was committed, there is
always a way to recover your work.
Avoiding push accidents
Image © CAPCOM Ltd..All rights Reserved
Don’t use the --force, Luke
Make a habit of trying “vanilla” git
push before adding any arguments
(e.g., origin my-branch or --force)
On a new branch
$ git checkout -b new-branch
Switched to a new branch 'new-branch'
$ git commit -am "my changes"
[new-branch eabe2c9] my changes
1 file changed, 2 insertions(+)
$ git push
fatal: The current branch new-branch has no upstream branch
To push the current branch and set the remote as upstream,
use
git push --set-upstream origin new-branch
$ git push --set-upstream origin new-branch
After a rebase
$ git rebase -i master
Switched to a new branch 'new-branch'
$ git push
To github.com:Shopify/some-repo.git
! [rejected] new-branch -> new-branch (non-fast-forward)
error: failed to push some refs to 'github.com:Shopify/
some-repo.git'
hint: Updates were rejected because the tip of your current
branch is behind
$ git push --force
Know where you are
Always show the current branch on
your command line prompt (bash):
export PS1="h:W u[033[32m]
$(__git_ps1)[033[00m]$ "
MyComputer:myproject me (my-branch)$
GUI x CLI
Image CC BY-SAWikipedia user Sandstein
gitk
GitHub Desktop
Tig
git fail --force (make it up with your pull requests)
Stay fresh
Update your master to the latest
remote without leaving your branch
git pull --rebase --autostash
For git < 2.9, use the git-up gem
gem install git-up
git up
Non-brute force
Rewrite history, but only if no one else
added commits to the branch
git push --force-with-lease
Branch prefix shortcuts
git push --delete my-branch
git push --force my-branch
can be shortened to
git push :my-branch
git push +my-branch
(just be careful not to add + by habit)
Thank you!
Carlos Duarte Do Nascimento
@chesterbr • http://chester.me
shopify.com/careers
http://slideshare.net/chesterbr
This presentation is available under the Creative Commons “by-nc” 3.0 license
(available at https://creativecommons.org/licenses/by-nc/3.0/),
noticing the exceptions below.
Images and text from third parties were included (with due credits wherever possible)
under a fair use assumption (or, for Brazilian media, under Art. 46 of Law 9610/98)
and/or under their respective licenses. Omissions are unintended and corrections
welcome. Such content is excluded from the license above.
GitHub, the GitHub logo and mascot are trademarks of GitHub, Inc.
Shopify and the Shopify logo are trademaks of Shopify, Inc.
The opinions stated here belong solely to the author, not offically representing his
employer’s opinions, nor any of of the persons or companies mentioned in any extent.
Credits And License

More Related Content

PDF
Serving Pull Requests with Jenkins
PPTX
Git and git workflow best practice
PPT
Open Source Collaboration With Git And Git Hub
PPT
Git workflows presentation
PDF
Git and git hub
PDF
Git and git flow
PPTX
Git Flow and JavaScript Coding Style
KEY
Git Basics Philips
Serving Pull Requests with Jenkins
Git and git workflow best practice
Open Source Collaboration With Git And Git Hub
Git workflows presentation
Git and git hub
Git and git flow
Git Flow and JavaScript Coding Style
Git Basics Philips

What's hot (20)

PDF
Git basics for beginners
PDF
Advanced Git
PDF
沒有 GUI 的 Git
PDF
Git advanced
PPTX
Git flow
PDF
PDF
Wokshop de Git
PDF
Git workflows
PDF
How to use any static site generator with GitLab Pages.
PDF
Git flow Introduction
PPTX
My Git workflow
PDF
Git For The Android Developer
PDF
Git Educated About Git - 20 Essential Commands
PDF
XPDDS19: Will Robots Automate Your Job Away? Streamlining Xen Project Contrib...
PDF
Git workflow in agile development
PDF
GitHub Talk - Cody Carnachan
PPTX
Why Aren't You Using Git Flow?
PDF
Brief tutorial on Git
ODP
Git Flow - An Introduction
PPTX
A painless self-hosted Git service: Gitea
Git basics for beginners
Advanced Git
沒有 GUI 的 Git
Git advanced
Git flow
Wokshop de Git
Git workflows
How to use any static site generator with GitLab Pages.
Git flow Introduction
My Git workflow
Git For The Android Developer
Git Educated About Git - 20 Essential Commands
XPDDS19: Will Robots Automate Your Job Away? Streamlining Xen Project Contrib...
Git workflow in agile development
GitHub Talk - Cody Carnachan
Why Aren't You Using Git Flow?
Brief tutorial on Git
Git Flow - An Introduction
A painless self-hosted Git service: Gitea
Ad

Similar to git fail --force (make it up with your pull requests) (20)

PPTX
Git first steps
PDF
Don't fear the rebase
PPTX
MakingGitWorkForYou
PDF
Git and Github workshop ppt slide by slide
PDF
Git and Github slides.pdf
PPTX
Git presentation bixlabs
PDF
How to Really Get Git
PDF
GitWorkFlow
PPTX
Techoalien git
PPTX
Techoalien git
PPTX
Techoalien git
PDF
Git tutorial
PPTX
PPTX
Git like a pro EDD18 - Full edition
PDF
Git 101: Force-sensitive to Jedi padawan
PDF
Git with the flow
PDF
Advanced Git - Functionality and Features
PDF
Git basics
PDF
Did you git yet?
PPTX
Working with Git
Git first steps
Don't fear the rebase
MakingGitWorkForYou
Git and Github workshop ppt slide by slide
Git and Github slides.pdf
Git presentation bixlabs
How to Really Get Git
GitWorkFlow
Techoalien git
Techoalien git
Techoalien git
Git tutorial
Git like a pro EDD18 - Full edition
Git 101: Force-sensitive to Jedi padawan
Git with the flow
Advanced Git - Functionality and Features
Git basics
Did you git yet?
Working with Git
Ad

More from Carlos Duarte do Nascimento (11)

PDF
git fail --force (faça as pazes com seus pull requests)
PDF
ruby2600 - an Atari 2600 emulator written in Ruby
PDF
Atari 2600 VCS Programming
PDF
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
PDF
Programação para Atari 2600
PDF
Mashups: Criando Valor na Web 2.0 (BandTec)
PDF
Aplicativos Mobile: Da Idéia ao Produto (ou não)
PDF
Apontador API (para programadores Python)
PDF
Mashups: Criando Valor na Web 2.0
PDF
Cruzalinhas - Palestra Relâmpago no Fisl 11
PDF
SlideMeme - Habilitando o SlideShare dentro do Yahoo! Meme - Yahoo! Open Hack...
git fail --force (faça as pazes com seus pull requests)
ruby2600 - an Atari 2600 emulator written in Ruby
Atari 2600 VCS Programming
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Programação para Atari 2600
Mashups: Criando Valor na Web 2.0 (BandTec)
Aplicativos Mobile: Da Idéia ao Produto (ou não)
Apontador API (para programadores Python)
Mashups: Criando Valor na Web 2.0
Cruzalinhas - Palestra Relâmpago no Fisl 11
SlideMeme - Habilitando o SlideShare dentro do Yahoo! Meme - Yahoo! Open Hack...

Recently uploaded (20)

PPTX
Online Work Permit System for Fast Permit Processing
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PPTX
ai tools demonstartion for schools and inter college
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PDF
How Creative Agencies Leverage Project Management Software.pdf
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PPTX
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
PDF
System and Network Administraation Chapter 3
PDF
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
PDF
medical staffing services at VALiNTRY
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PDF
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
PPTX
Odoo POS Development Services by CandidRoot Solutions
PPTX
ISO 45001 Occupational Health and Safety Management System
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PDF
PTS Company Brochure 2025 (1).pdf.......
Online Work Permit System for Fast Permit Processing
2025 Textile ERP Trends: SAP, Odoo & Oracle
ai tools demonstartion for schools and inter college
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
How Creative Agencies Leverage Project Management Software.pdf
Adobe Illustrator 28.6 Crack My Vision of Vector Design
How to Choose the Right IT Partner for Your Business in Malaysia
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
Odoo Companies in India – Driving Business Transformation.pdf
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
System and Network Administraation Chapter 3
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
medical staffing services at VALiNTRY
Internet Downloader Manager (IDM) Crack 6.42 Build 41
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
Odoo POS Development Services by CandidRoot Solutions
ISO 45001 Occupational Health and Safety Management System
Design an Analysis of Algorithms I-SECS-1021-03
PTS Company Brochure 2025 (1).pdf.......

git fail --force (make it up with your pull requests)

  • 1. Carlos Duarte Do Nascimento @chesterbr • http://chester.me git fail --force make it up with your pull requests
  • 7. It’s either “git for dummies”...
  • 10. Hovertext:“If that doesn't fix it, git.txt contains the phone number of a friend of mine who understands git. Just wait through a few minutes of 'It's really pretty simple, just think of branches as...' and eventually you'll learn the commands that will fix everything.” Git - 30/Out/2015 https://xkcd.com/1597/
  • 11. Neither rookie nor expert Good professionals will try to become proficient in their tools - not become specialists in all of them
  • 12. Expert Advice ● “Do a git pull once in a while” ● “Never use git pull” ● “Always rebase!” ● “Never rebase!!!” ● ...
  • 14. Proposal Revisit git concepts from the perspective of a typical workflow, avoiding theory overload and the abuse of rules and cookbooks
  • 15. Carlos Duarte Do Nascimento (Chester) @chesterbr • http://chester.me Git non-specialist
  • 18. Git A system that allows people to work with source code in an orderly and simultaneous fashion
  • 19. Commit When a meaningful change is made, you take it to the stage in order to take a snapshot (commit) A92347C2…1F2493E34: Increase submit button size DescriptionID
  • 20. Commit == snapshot “Git is all about composing and saving snapshots of your project and then working with and comparing those snapshots” http://gitref.org/basic/
  • 21. Branch Successive commits form a timeline One can commit into alternative timelines (branches) and later integrate those with the main timeline (master)
  • 22. Group work Your commits “live” in your local repository (.git/) You can push commits to other people’s repositories (remotes), and also pull commits from there
  • 23. Organizing your group This flow of commits/branches can be organized in several ways (workflows) A central repository that enables code reviews by means of pull requests helps a lot...
  • 24. ● Refresh master (remote ⇒ local) ● Create new branch from there ● Commits, commits, commits! ● Push, PR (my branch ⇒ master) ● ●
  • 25. But what if... ● ...CI* fails? ● ...other devs suggest changes? ● ...master changed while I worked? *Continuous Integration
  • 26. Conflict! Image © 1995 GAINAX/Project Eva.
  • 27. Manual merge $ git checkout master $ git pull $ git checkout my-branch ... $ git commit $ git push ... $ git push --force
  • 28. #NOT
  • 29. It can get really bad ● Irreconcilable conflicts ● Alien commits on my PR ● Commit is there, code is not ● The @#%@ button is still grey ● ...
  • 30. How can we fix/avoid that? By understanding what is happening on a pull request to identify (and avoid) traps, or, as a last resource, to rebuild our PR with minimal effort
  • 33. git merge Includes commits from another branch in the current one, without changing them (an extra commit at the end will consolidate changes from both sides)
  • 34. How can that go wrong? Consolidating changes from two different timelines becomes more complex as they diverge
  • 35. Avoid the problem Whenever possible, create small, isolated and short-living branches
  • 36. If you can’t avoid it There are several ways to make a branch compatible with master again Our workflow works well with rebase
  • 37. git rebase Rebuild the branch from its original point (by default), creating new commits identical to the original ones (by default) (hint: these defaults won’t help you)
  • 38. What can I do with rebase? ● (re-)base your changes on a more recent master (e.g.: git fetch; git rebase origin/master) ● Simplify your commits (e.g.: git rebase --interactive master)
  • 39. How can that go wrong? Updating the branch and simplifying commits at the same time is tricky Rewriting a branch that is already published causes incompatibilities
  • 40. PR prep suggestion (1) Recreate your branch from a more recent master (without changing the commits) git checkout master git pull git checkout my-branch git rebase master
  • 41. PR prep suggestion (2) Simplify your commits (without changing the branch point) git rebase –-interactive master
  • 42. Suggestion ≠ rule If the master didn’t change (much), don’t botter updating If your commits are clear, don’t bother interacting
  • 43. After the PR is created New commits can be added to the remote, just git push them Rebase, however, isn’t that simple (why?)
  • 44. Rebases change the past!!! (uhhh... so what?) Image © Universal Studios.All rights Reserved
  • 45. Is that a real problem? A git push from a rebased branch has to replace the remote branch history (hence the --force requirement)
  • 46. Workflow to the rescue If the workflow says only the creator commits on a PR, rebasing its branch should not cause any trouble Image © 2016Twentieth Century Fox Film Corporation.
  • 47. Avoiding further trouble Just like before the first push, don’t change the start point and simplify commits at the same time A new commit is always less tricky than a rebase
  • 48. Master is sacred Branches / pull requests are only relevant during their lifetime
  • 49. It hit the fan - now what?
  • 50. git cherry-pick Reproduces in your branch the changes from a single commit (even a branch-less one) git cherry-pick id
  • 51. Cherry-pick good commits Instead of recreating changes manually, we can cherry-pick the original commits into a fresh branch But we need to find those commits...
  • 52. git log x git reflog git log lists commits created in the current branch (lots of search options) git reflog lists any operations that affected the local repository in any way
  • 53. git reflog f84195a HEAD@{0}: checkout: moving from 1468-more-resilience-on-in d5a8868 HEAD@{1}: commit: Log the invalid listing on offer-less of 79e7c98 HEAD@{2}: commit: Better test naming and more detailed log 31e2ac1 HEAD@{3}: checkout: moving from master to 1468-more-resili f84195a HEAD@{4}: rebase finished: returning to refs/heads/master f84195a HEAD@{5}: pull --rebase --autostash: checkout f84195a626e9 ac12705 HEAD@{6}: rebase finished: returning to refs/heads/master ac12705 HEAD@{7}: pull --rebase --autostash: checkout ac127053051c ...
  • 54. #howto 1. Find all the commits that were supposed to be on your PR git log • git reflog •
  • 55. #howto 2. Sync your master with the server and create a brand new branch from it git checkout master git pull git checkout -b new-branch
  • 56. #howto 3.Apply the commits git cherry-pick id1 id2 id3...
  • 57. #howto 4. Replace the old branch with the new one (on local and remote repos) git checkout master git branch -D my-branch git branch -m new-branch my-branch git checkout my-branch git push –-set-upstream origin my-branch --force
  • 58. Life is good again!
  • 59. Conclusion (1) You don’t need to know everything about git, but it’s a good idea to have a solid understanding of some concepts (e.g.: commit, branch, merge, rebase)
  • 60. Conclusion (2) As long as it was committed, there is always a way to recover your work.
  • 61. Avoiding push accidents Image © CAPCOM Ltd..All rights Reserved
  • 62. Don’t use the --force, Luke Make a habit of trying “vanilla” git push before adding any arguments (e.g., origin my-branch or --force)
  • 63. On a new branch $ git checkout -b new-branch Switched to a new branch 'new-branch' $ git commit -am "my changes" [new-branch eabe2c9] my changes 1 file changed, 2 insertions(+) $ git push fatal: The current branch new-branch has no upstream branch To push the current branch and set the remote as upstream, use git push --set-upstream origin new-branch $ git push --set-upstream origin new-branch
  • 64. After a rebase $ git rebase -i master Switched to a new branch 'new-branch' $ git push To github.com:Shopify/some-repo.git ! [rejected] new-branch -> new-branch (non-fast-forward) error: failed to push some refs to 'github.com:Shopify/ some-repo.git' hint: Updates were rejected because the tip of your current branch is behind $ git push --force
  • 65. Know where you are Always show the current branch on your command line prompt (bash): export PS1="h:W u[033[32m] $(__git_ps1)[033[00m]$ " MyComputer:myproject me (my-branch)$
  • 66. GUI x CLI Image CC BY-SAWikipedia user Sandstein
  • 67. gitk
  • 69. Tig
  • 71. Stay fresh Update your master to the latest remote without leaving your branch git pull --rebase --autostash For git < 2.9, use the git-up gem gem install git-up git up
  • 72. Non-brute force Rewrite history, but only if no one else added commits to the branch git push --force-with-lease
  • 73. Branch prefix shortcuts git push --delete my-branch git push --force my-branch can be shortened to git push :my-branch git push +my-branch (just be careful not to add + by habit)
  • 74. Thank you! Carlos Duarte Do Nascimento @chesterbr • http://chester.me shopify.com/careers http://slideshare.net/chesterbr
  • 75. This presentation is available under the Creative Commons “by-nc” 3.0 license (available at https://creativecommons.org/licenses/by-nc/3.0/), noticing the exceptions below. Images and text from third parties were included (with due credits wherever possible) under a fair use assumption (or, for Brazilian media, under Art. 46 of Law 9610/98) and/or under their respective licenses. Omissions are unintended and corrections welcome. Such content is excluded from the license above. GitHub, the GitHub logo and mascot are trademarks of GitHub, Inc. Shopify and the Shopify logo are trademaks of Shopify, Inc. The opinions stated here belong solely to the author, not offically representing his employer’s opinions, nor any of of the persons or companies mentioned in any extent. Credits And License