I'm not a fan of squashed merges myself, because you lose the history, which can often contain useful check-in comments.
My preferred github workflow is to make a new local branch before starting any change, push that to a branch in my fork of the project on github, and then send a pull request. I don't do subsequent work on the same branch (unless the maintainer wants further changes before accepting the pull request), so I don't run into the problem where pull requests build on each other. Having said that, I'm talking about code, not documentation. There may be some reason I'm not aware of why documentation works better with a different workflow. -- Stephen Turner -----Original Message----- From: williamstev...@gmail.com [mailto:williamstev...@gmail.com] On Behalf Of Will Stevens Sent: 22 May 2014 21:36 To: dev@cloudstack.apache.org; Sebastien Goasguen; Pierre-Luc Dion Subject: [DOCS] Git Flow Hey All, In the the README.rst files in the documentation, it refers to this page if you want to contribute: http://cloudstack.apache.org/developers.html I am not sure those instructions are actually up-to-date or valid for contributing to the documentation. I originally tried to use this process ( https://help.github.com/articles/syncing-a-fork) to keep my documentation fork up-to-date with the upstream/master, but after the first pull request the commits have to be cherry-picked because the pull requests will always take everything I have committed in my fork rather than the changes since the last pull request. This got annoying quickly. When contributing to the actual CloudStack code I used a squashed patch approach which worked very well. I have written up that flow as well as a similar flow for working with Github pull requests. I would like you to review what I have written. If you guys approve of the flow, I would like to add it to the README.rst files in the different documentation repositories to make it easier for people to contribute to the documentation. I know I found it really hard to figure out how to contribute to the documentation initially. We want to lower the bar a bit on this so more people feel comfortable helping with the documentation. Let me know what you think. Cheers, Will ---- Contributing to the documentation ================================= Initial setup of your local fork -------------------------------- First, fork the original documentation repository to your Github account. Then on your computer, do the following... .. code:: bash $ git clone `url of your forked repo` $ cd `git repo directory` $ git remote add upstream `url of the original repo` $ git checkout master $ git fetch upstream $ git merge upstream/master Making changes -------------- You will be making changes on a new `dev` branch which is only in your local git repository. .. code:: bash $ git checkout -b dev (make your changes) $ git add . $ git commit -a -m "commit message for your changes" .. note:: The `-b` specifies that you want to create a new branch called `dev`. You only specify `-b` the first time because you are creating a new branch. Once the `dev` branch exists, you can later switch to it with `git checkout dev`. Merging `upstream/master` into your `dev` branch ------------------------------------------------ .. code:: bash $ git checkout master $ git fetch upstream $ git merge upstream/master $ git checkout dev $ git pull . master .. note:: Now your `dev` branch is up-to-date with everything from `upstream/master`. Making a squashed patch for `upstream/master` --------------------------------------------- .. note:: Make sure you have merged `upstream/master` into your `dev` branch before you do this. .. code:: bash $ git checkout master $ git checkout -b squashed $ git merge --squash dev $ git commit -a -m "commit message for this squashed patch" $ git format-patch master $ git checkout master $ git branch -D squashed Upload the resulting patch file to a committer and move it out of your working tree. Continue working on the `dev` branch. When your changes are committed to the `upstream/master`, they will end up in your `master` branch when you re-sync your local `master` with the `upstream/master`. The next time you create a squashed patch between the `dev` branch and `master`, it will only include the changes that are not already in the `upstream/master` branch. Making a squashed pull request for `upstream/master` ---------------------------------------------------- .. note:: Make sure you have merged `upstream/master` into your `dev` branch before you do this. .. code:: bash $ git checkout master $ git checkout -b squashed $ git merge --squash dev $ git commit -a -m "commit message for this squashed pull request" $ git push origin master $ git push origin squashed Create a pull request on the `squashed` branch in your forked git repo on github to contribute it back to `upstream/master`. Continue working on the `dev` branch. When your changes are committed to the `upstream/master`, they will end up in your `master` branch when you re-sync your local `master` with the `upstream/master`. The next time you create a squashed pull request between the `dev` branch and `master`, it will only include the changes that are not already in the `upstream/master` branch. Once the `squashed` branch is committed into the `upstream/master` branch, your local `squashed` branch and the `origin/squashed` branch are not needed anymore (until you want to do the process again). You can delete them with the following... .. code:: bash $ git checkout master $ git branch -D squashed $ git push origin :squashed