Managing and deploying projects with Git

The most powerful git feature is branching. It allows you to weave code together and work on multiple features as a team. Git Flow and GitHub Flow are two similar git workflows designed to make us more productive.

Anything in the master branch is deployable

You never commit to the master branch. Instead new features are created in branches. Once a feature is complete, a pull request is opened (on github or bitbucket), a colleague does a review and once it’s approved, the branch can be merged into master and is then deleted.

Every time you merge in to master an automatic deploy should be made . This is to emphasize This includes bumping the version number.

If you develop features directly in the master branch, you won’t be able to deploy because it will contain unfinished code.

To achieve this, we use git branches. All the work you do should be done in a branch. Never work in master. Master is only used to merge in other branches and to deploy from. Use a descriptive name for your branch.

Git Flow versus Github Flow

There are two popular workflows, the original Git Flow and Github Flow. The main difference being that Git Flow works with master and develop branches. All new features are branched off develop. Hotfixes are branched off master.

Github Flow on the other hand doesn’t have a develop branch. Everything is branched off master and when a branch is finished, a pull request is opened to review and finally merged back into master. Once in master we should deploy automatically.

Git Flow is more work and if you’re deploying several times a day it can be really tedious. On the other hand it provides a develop branch where you can rest and test all branches together before deploying. Interestingly Github does not use Git Flow for any projects. And if it’s enough for developing Github I’m sure it’s enough for what we do.

http://stackoverflow.com/questions/18188492/what-are-the-pros-and-cons-of-git-flow-vs-github-flow

Workflow example

Create a branch of master

  • git checkout master
  • git checkout -b my-feature

Finish your feature/fix or whatever you are doing

  • git commit -m "Add new feature"

Get a review on your code using a BitBucket pull request (or someone looking over your shoulder. This includes proper testing.

Merge it into master

  • git checkout master
  • git merge my-feature --no-ff

Deploying

Once everything is merged and you’re ready to deploy, it’s important to tag the release using git tags (and in package.json) to know, which version was deployed. This makes it a lot easier to track down bugs but only works, if everyone follows the pattern.

Required reading

https://www.atlassian.com/git/tutorials/comparing-workflows/ https://guides.github.com/introduction/flow/ https://www.atlassian.com/git/tutorials/comparing-workflows/feature-branch-workflow https://github.com/petervanderdoes/gitflow-avh http://jeffkreeftmeijer.com/2010/why-arent-you-using-git-flow/ https://gist.github.com/jbenet/ee6c9ac48068889b0912 https://www.nczonline.net/blog/2013/05/21/github-workflows-inside-of-a-company/

Git Flow

To work on something new, create a descriptively named branch off of master (ie: new-sidebar-design). Commit to that branch locally and regularly push your work to the same named branch on the server. When you need feedback or help, or you think the branch is ready for merging, open a pull request. After someone else has reviewed and signed off on the feature, you can merge it into master. Once it is merged and pushed to ‘master’, you can and should deploy immediately

Pasting tools