Development Freelancing WordPress

What’s your Git Strategy?

As a freelance WordPress developer/consultant I rarely work in a team environment. So my usage of Git is mostly for my own purposes of being able to have my code backed up somewhere and the ability to create branches to try out new pieces of functionality without affecting the ‘master’ code base.

Recently I was chatting to Simon Dowdles, another Cape Town based WordPress developer, about this. He is, in his own words, very strict about a Git workflow. We agreed that it would be a good idea to implement a better system, so we put his workflow into place.

  1. Development branch is where all UP TO DATE and approved code lives
  2. Master branch is the truth and is ALWAYS what is on production
  3. Feature/hotfix branches are branched off of develop and only come back into develop with a Pull Request
  4. Release branches are made off of develop for releases, the release is done, merged back into master and tagged with the appropriate version tag (ie 1.2.0)
  5. Release branch is deleted, and there is only ever one

On the surface this all seems very obvious but it is often something that one tends to dismiss when working alone on the code base. After working with it for a few days however I can already see the benefits.

Lets first look at a real work example of how this would work in practice.


Firstly the repository is going to need a develop branch. So inside the root of my project folder I’ll create the develop branch from the master branch.

git checkout -b develop

And then push the branch

git push -u origin develop

If the develop branch already exists I can just switch to it

git checkout develop

Now I will need to create my feature branch, to make my code changes. So while still on the develop branch, create a a feature branch

git checkout -b feature/my-cool-feature


I can now starting coding my changes, committing frequently. I tend to commit every time I complete a chunk of functionality. So if I fix a bug, I commit. If I add a function and its more or less complete I commit.

git commit -a

At the end of every day, or if I am going to leave my workstation for a period of time, I push all current commits to the feature branch.

git push -u origin feature/my-cool-feature

When I am convinced it is good to go, I will submit a pull request or PR. When I create my PR I will request that it is merged into the develop branch, NOT master.

As we are using GitHub for this project I prefer to use the web based tools to create a PR, but most of the other cloud based Git services provide similar tools.

The rest of the team will review this PR, which will involve testing. They will scrutinise my code and provide feedback and I will fix or alter things to suit the team/project coding style(s).

Each time I commit the above changes, the team in the PR is notified and will see the changes in the PR.

When everyone is happy, they approve the PR and I merge my PR into the develop branch. At the same time I can choose to delete my feature branch (which I typically do)

The develop branch now has more (stable) code in it, and part of my PR should have been a version bump. (for example let’s say to 1.0.1)


The team decides it is time to release version 1.0.1

First I need to make sure all my code is up to date

git pull

And then make sure I am in the develop branch. This is the branch that has all the approved code for the next release (1.0.1).

git checkout develop

I create a release branch called release/1.0.1 off of develop

git checkout -b release/1.0.1

The code gets deployed ( in this case its a WordPress plugin, so it means pushing all the code to the plugin repository, more on that another day 😉 )


I then merge the release/1.0.1 branch back into the master branch and tag it as release 1.0.1, again using all the GitHub PR, merging and tagging tools.

And we’re done, release 1.0.1 is in the wild and by following this approach, master is ALWAYS the truth. If for example release 1.0.2 were to fail, we simply roll everything back to master.

Wrap up

I’ve been working like this for three releases of the project so far and I have to say, once I had all the steps in my head, it did make developing, merging and releasing a lot smoother and more controlled.

Are you using Git as part of a team? If so I’d love to hear your comments on the idea of having a Git Workflow/Strategy.


A quick guide to some everyday Git commands

When I first started developing code the idea of version control was pretty much unknown, especially in the world of web development. As I progressed through my career and worked at different software companies I learned as much as I could and I’ve now settled into the daily routine of committing, branching, pushing and pulling. While this might sound vaguely naughty, if you are writing any sort of code, you should really look into version control. My current favourite is Git.

I’m not going to get into installing and setting up Git. This article is designed merely as a resource of common Git commands, mainly because I tend to forget them 😉 I’ll be adding commands to this list as I need (and discover) them.

If you are on a Mac or Unix type machine you will have a Bash style command line you can use, if you are on Windows I highly recommend using GitBash.

At the moment if you want to use version control and Git, you’re two big choices are GitHub and Bitbucket. I use both, GitHub for public projects and Bitbucket for private projects. Most of the commands listed below will be ones that I use for Bitbucket repositories, but they are also relevant to GitHub. Either or them gives you a step by step guide to creating, initialising and configuring your code folder to work with your repository.


git add –all

This allows you to add all new files to your git repository. It’s not 100% ideal as it might add files you don’t want to necessarily add at this point, but it’s quick and easy.

git commit -a

This command will commit your current changes to the repository and prompt you to enter a message for the commit. I prefer it to using the -m (message) swtich because I can see all the files that have changed for my commit message. If you are using GitBash, you will also need to know how to use Vim style editor commands.

git push -u origin master

This command will push all changes on the current master branch to the remote repository.

git checkout <branch_name>

Switches to the branch ‘branchname’

git checkout -b <branch_name>

Creates and switches to the branch ‘branchname’.

git push -u origin<branch_name>

Push all committed changes to the branch ‘branchame’ to the remote repository.

git push –all

Pushes all branches to the remote repository.

git pull

Pulls all changes from the remote repository. Useful once you have merged a pull request.

git push origin –delete <branch_name>

Delete a remote branch

git branch -D <branch_name>

Delete a local branch, which has NOT already been fully merged

git branch -d <branch_name>

Delete a local branch, which has already been fully merged

git branch -m new-name

Rename your local branch to new-name.

git branch -m old-name new-name

Rename a different branch to new-name

git push origin :old-name new-name

Delete the old-name remote branch and push the new-name local branch.

git push origin -u new-name

Reset the upstream branch for the new-name local branch.

git reset –hard [commit-id]

Reset a branch back to a specific commit (by id)

git push -f origin [branch]

Push changes reverted by the above command to the remote version of your local branch

git reset –hard [tag]
git push –force origin master

Force the remote branch (master) to be reset back to a specific tag

git checkout develop
git rebase master

This moves the entire develop branch to begin on the tip of the master branch, effectively incorporating all of the new commits that were included in master.

git checkout feature/branch
git merge develop

Move a commit to the correct branch, for example, committed to the develop branch instead of some feature branch

git checkout develop
git reset –hard HEAD~1

Update ~1 with the amount of commits you want to reset the develop branch by

git reset –hard origin/feature/branch

Reset the local feature/branch with the remote feature/branch, when the local branch has diverged.

git remote prune origin –dry-run

Lists branches that can be deleted/pruned on your local environment (ie merged/deleted on the remote)

git remote prune origin

Prune any merged/deleted branches from your local environment

(credit Fizer Khan)

git branch –merged | egrep -v “(^*|master|dev)” | xargs git branch -d

Delete all local branches that have been merged to master or dev

(credit Daine Mawer)

Other cool Git commands from people around the web

Because I always forget how to set up a new or existing git repository

Create a new repository
git clone
cd reponame
git add
git commit -m "add README"
git push -u origin master
Push an existing folder
cd existing_folder
git init
git remote add origin
git add .
git commit -m "Initial commit"
git push -u origin master
Push an existing Git repository
cd existing_repo
git remote rename origin old-origin
git remote add origin
git push -u origin --all
git push -u origin --tags

Setting the upstream for a fork

Syncing a fork