<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Software Configuration Management and Agile Software Development &#187; branches</title>
	<atom:link href="http://accurev.com/blog/tag/branches/feed/" rel="self" type="application/rss+xml" />
	<link>http://accurev.com/blog</link>
	<description>SCM and Agile Software Development Blog</description>
	<lastBuildDate>Thu, 17 May 2012 15:00:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Why Create Branches?</title>
		<link>http://accurev.com/blog/2012/02/20/why-create-branches-2/</link>
		<comments>http://accurev.com/blog/2012/02/20/why-create-branches-2/#comments</comments>
		<pubDate>Mon, 20 Feb 2012 15:45:54 +0000</pubDate>
		<dc:creator>clucca</dc:creator>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[branches]]></category>
		<category><![CDATA[branching and merging]]></category>
		<category><![CDATA[merge hell]]></category>
		<category><![CDATA[workflow]]></category>

		<guid isPermaLink="false">http://accurev.com/blog/?p=3028</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2012/02/20/why-create-branches-2/' addthis:title='Why Create Branches? ' ><a href="//addthis.com/bookmark.php?v=250&#38;username=xa-4d2b47597ad291fb" class="addthis_button_compact">Share</a><span class="addthis_separator">&#124;</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div>Branching and merging is one of the most critical things a development team must work on over the course of a software release cycle. But there’s a funny thing about branching and merging &#8211; it’s usually not thought of as part of the development process. How often do you see a user story called “as [...]<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2012/02/20/why-create-branches-2/' addthis:title='Why Create Branches? '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2012/02/20/why-create-branches-2/' addthis:title='Why Create Branches? ' ><a href="//addthis.com/bookmark.php?v=250&amp;username=xa-4d2b47597ad291fb" class="addthis_button_compact">Share</a><span class="addthis_separator">|</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div><p><a href="http://www.accurev.com/whitepaper/guide-branching-merging-patterns">Branching and merging</a> is one of the most critical things a development team must work on over the course of a software release cycle. But there’s a funny thing about branching and merging &#8211; it’s usually not thought of as part of the development process. How often do you see a user story called “as a developer I want to merge code to trunk”?</p>
<p>The fact that we often don’t follow a process for the branching and merging of code leads to disarray and pain.  It really shouldn’t be that hard! Teams end up in “<a href="http://accurev.com/blog/2011/03/23/from-merge-hell-to-merge-master/">merge hell</a>” and deliver changes late to schedule. This problem stems from the way branches are created. They’re often not part of the process and are created from a specific business need, not a from a development practice.</p>
<p>When development teams do create a branching pattern, it’s usually drawn out on a white board or in a Visio document, and is used as a model for the overall development process. While the intention is good, many times these plans become quite complex for reasons that can’t be foreseen.</p>
<h2>So, why even create branches, if they’re too complex, and unaccounted for?</h2>
<p>Create branches the right way, and use them as:</p>
<ul>
<li>Development Branch – A branch created for a development code configurations and builds</li>
<li>Integration Branch – A special branch for parallel teams to integrate code</li>
<li>QA Branch – QA branches for QA teams to create builds and environments</li>
<li>BETA – A preproduction branch for customer sign-off, etc…</li>
<li>Production – All of the content that ends up in prod</li>
</ul>
<p>If we take a more philosophical view of what branches represent, beyond business needs, they actually serve as <a href="http://www.accurev.com/whitepaper/stream_based_architecture.htm">workflows for different aspects</a> of the software development process.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2012/02/20/why-create-branches-2/' addthis:title='Why Create Branches? '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></content:encoded>
			<wfw:commentRss>http://accurev.com/blog/2012/02/20/why-create-branches-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stable Builds as Stories are Completed</title>
		<link>http://accurev.com/blog/2010/06/18/stable-builds-stories-complete/</link>
		<comments>http://accurev.com/blog/2010/06/18/stable-builds-stories-complete/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 15:13:15 +0000</pubDate>
		<dc:creator>damonpoole</dc:creator>
				<category><![CDATA[AccuRev]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Integrations]]></category>
		<category><![CDATA[Product Review]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[branches]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[Damon Poole]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[streams]]></category>
		<category><![CDATA[waterfall]]></category>

		<guid isPermaLink="false">http://www.accurev.com/blog/?p=1902</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2010/06/18/stable-builds-stories-complete/' addthis:title='Stable Builds as Stories are Completed ' ><a href="//addthis.com/bookmark.php?v=250&#38;username=xa-4d2b47597ad291fb" class="addthis_button_compact">Share</a><span class="addthis_separator">&#124;</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div>One of the questions I hear a lot from Agile teams is “how can we have a stable build to test stories as they are completed?” Often, the only time the build is stable is towards the end of the iteration. That then squeezes the QA folks or sometimes even has them testing the previous [...]<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2010/06/18/stable-builds-stories-complete/' addthis:title='Stable Builds as Stories are Completed '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2010/06/18/stable-builds-stories-complete/' addthis:title='Stable Builds as Stories are Completed ' ><a href="//addthis.com/bookmark.php?v=250&amp;username=xa-4d2b47597ad291fb" class="addthis_button_compact">Share</a><span class="addthis_separator">|</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div><p>One of the questions I hear a lot from Agile teams is <strong>“how can we have a stable build to test stories as they are completed?”</strong> Often, the only time the build is stable is towards the end of the iteration. That then squeezes the QA folks or sometimes even has them testing the previous iteration’s stories in the current iteration. Hmm. That sounds a bit like our old friend Waterfall.</p>
<p>Usually, when the question is asked, the team is creating and automating unit tests and doing continuous integration. That’s not the issue. (If you are not doing those things, stop everything and implement these three practices immediately!) But let’s assume for the moment that you are doing these three practices.</p>
<p>The problem is getting a build which consists of only stories that are considered “complete,” but still need a bit more work done on them, such as exploratory testing, load testing, usability testing, demo for customer feedback, etc. You might say, “but you can’t do that until the end of the iteration.” Ok, but then you are back to the problem of a compressed QA cycle and having development either sit on their hands or move on to the next iteration, neither of which represent <a href="http://www.accurev.com/agile-software-development.html" target="_blank">Agile</a> thinking.</p>
<p>There’s a simple solution to this problem, which you may have “thrown out with the bath water.” <strong>Branches</strong><strong>! </strong>Or, in AccuRev parlance, <a href="http://www.accurev.com/whitepaper/stream_based_architecture.htm" target="_blank">streams</a> (though I’ll stick with branches for simplicity). Each process stage gets its own branch. That doesn’t mean that you can’t write code and tests at the same time, only that code can’t advance to the next branch until it meets the criteria of that branch, such as “coding is done” and “all tests are written and passing.” I know, you cringe at the thought of<a href="http://www.accurev.com/accurev-branching-merging.html" target="_blank"> branching and merging,</a> but that’s probably because you are thinking of branches that contain long-lived changes. We’re not going to do that here.</p>
<p>The idea presented here is to advance changes through the set of branches as quickly as is practical. As changes get propagated to each branch, <a href="http://www.accurev.com/continuous-integration.html" target="_blank">CI</a> is done against that branch.  If it succeeds, it gets promoted to the next branch. If it does not succeed, then that developer (possibly with help from her teammates) fixes the branch. This is similar to how stopping the line works in a modern lean manufacturing facility.</p>
<p>In <a href="http://www.accurev.com/" target="_blank">AccuRev</a>, this process is greatly simplified. You can create a set of streams instead of branches, and streams can model your exact process. Promoting work from stream to stream is a simple drag and drop operation.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1909" title="One of the questions I hear a lot from Agile teams is “how can we have a stable build to test stories as they are completed?” In this diagram, there are streams for each of the stages from “wip” to “done.” Since each stage is a stream, you can run continuous integration at each stage." src="http://www.accurev.com/blog/wp-content/uploads/2010/06/New-Picture-1.png" alt="Getting Stable Builds as Stories are Completed" width="615" height="302" /></p>
<p>In the diagram above, there are streams for each of the stages from “wip” to “done.” Since each stage is a stream, you can run continuous integration at each stage. You can also do builds, for instance from the “tested” and “done” streams to do things like exploratory testing. By definition, a build from the “done” stream only contains changes which are built; integrated together; have unit and other tests written, automated and passing; and whatever other criteria you have for “done.”</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2010/06/18/stable-builds-stories-complete/' addthis:title='Stable Builds as Stories are Completed '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></content:encoded>
			<wfw:commentRss>http://accurev.com/blog/2010/06/18/stable-builds-stories-complete/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Developing in streams, releasing from streams</title>
		<link>http://accurev.com/blog/2008/09/25/developing-in-streams-releasing-from-streams/</link>
		<comments>http://accurev.com/blog/2008/09/25/developing-in-streams-releasing-from-streams/#comments</comments>
		<pubDate>Thu, 25 Sep 2008 17:24:42 +0000</pubDate>
		<dc:creator>matthew d. laudato</dc:creator>
				<category><![CDATA[AccuRev]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[version control]]></category>
		<category><![CDATA[branches]]></category>
		<category><![CDATA[change management]]></category>
		<category><![CDATA[JIRA]]></category>
		<category><![CDATA[SCCM]]></category>
		<category><![CDATA[SCM]]></category>
		<category><![CDATA[Software Configuration Management]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[software development process]]></category>
		<category><![CDATA[streams]]></category>
		<category><![CDATA[tags]]></category>

		<guid isPermaLink="false">http://accurev.wordpress.com/?p=366</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2008/09/25/developing-in-streams-releasing-from-streams/' addthis:title='Developing in streams, releasing from streams ' ><a href="//addthis.com/bookmark.php?v=250&#38;username=xa-4d2b47597ad291fb" class="addthis_button_compact">Share</a><span class="addthis_separator">&#124;</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div>By Matthew Laudato When I read the following blog, Developing in branches, releasing from trunk about a software configuration management development process that was constrained and tortured by branches, I had an &#8216;aha&#8217; moment. Actually, I had three moments. They went something like this: 1. Branches are obsolete, so why does anyone still use them? 2. People [...]<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2008/09/25/developing-in-streams-releasing-from-streams/' addthis:title='Developing in streams, releasing from streams '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2008/09/25/developing-in-streams-releasing-from-streams/' addthis:title='Developing in streams, releasing from streams ' ><a href="//addthis.com/bookmark.php?v=250&amp;username=xa-4d2b47597ad291fb" class="addthis_button_compact">Share</a><span class="addthis_separator">|</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div><p><strong>By Matthew Laudato</strong></p>
<p>When I read the following blog, <a href="http://www.woloszyn.org/2008/09/12/developing-in-branches-releasing-from-trunk/" target="_blank">Developing in branches, releasing from trunk</a> about a <a href="http://www.accurev.com/software-configuration-management-resources.htm" target="_blank">software configuration management</a> development process that was constrained and tortured by branches, I had an &#8216;aha&#8217; moment. Actually, I had three moments. They went something like this:</p>
<p>1. Branches are obsolete, so why does anyone still use them?</p>
<p>2. People use them because they are unaware of the alternatives &#8211; specifically streams.</p>
<p>3. I must act quickly to save my coding comrades from any further branch related pain.</p>
<p>If there is a cyberspace equivalent of shouting from the rooftops, then this blog post is it. My goal is to help the author to simplify his development process, and to free him and his team from the time-wasting, error-prone, outdated branch-induced hysteria that is clearly evident in his post. OK, so maybe that last sentence was a little hysterical, but you get the point.</p>
<p>In the post (which I encourage you to <a title="Developing in branches, releasing from trunk" href="http://www.woloszyn.org/2008/09/12/developing-in-branches-releasing-from-trunk/" target="_blank">read first</a>), the author outlines a branch-centric process that goes something like this:</p>
<p>- create issues in JIRA for feature (defect, etc) work</p>
<p>- create a Subversion branch for each JIRA issue, named by the JIRA issue ID (eg, SUP-3452). Developers write code on these feature branches.</p>
<p>- create a JIRA release (for example, R4.2) and target the issues created above to this release</p>
<p>- create a Subversion branch (off of the &#8216;trunk&#8217;) with the same name &#8216;R4.2&#8242;.</p>
<p>- Write a bunch of scripts that look at the JIRA release, find all the issues for that release, look at Subversion for the branches that are named for said issues, merge these branches to the release (R4.2) branch.</p>
<p>- Do some testing on the R4.2 branch</p>
<p>- Tag the release R4.2 branch</p>
<p>- Release software</p>
<p>- Merge the R4.2 tag back into the trunk</p>
<p>Rinse, repeat for the next release.</p>
<p>For some reason, I&#8217;m reminded at this point of a character in Tom Robbins&#8217; &#8220;Even Cowgirls Get the Blues&#8221;. The character had a little business card that he would hand to people. One one side it read, &#8216;I believe in everything, nothing is sacred&#8217;. On the other side it read, &#8216;I believe in nothing, everything is sacred&#8217;. When I think about the author&#8217;s process, one side of my brain says &#8216;there is nothing wrong with this process&#8217;, and almost immediately, the other side screams &#8216;there is everything wrong with this process&#8217;. The truth is somewhere in the middle, and it all comes down to branches.</p>
<p>The problem with this process is that branches get in the way. The idea of isolating features in your <a href="http://www.accurev.com/software-configuration-management-resources.htm" target="_blank">SCM tool</a> is a good one. Although I don&#8217;t personally agree with the idea of dedicating an SCM construct per-feature, there are plenty of people who do. (See <a title="Stream-per-task paradigm" href="http://blog.accurev.com/2007/10/11/stream-per-task-paradigm-with-accurev-software-configuration-management/" target="_blank">Stream-per-task paradigm</a>, for example by Dave Thomas). But that&#8217;s not the point. Whether you put one feature or ten in it, a branch constrains your ability to work efficiently. Once you create a branch, it loses all contact with the outside world, most importantly, with its own history and its relationship to other branches. The author even admits jokingly that a &#8216;release manager&#8217; will likely be needed to handle the merges. Ya think?</p>
<p>Here&#8217;s an alternative process that uses AccuRev streams:</p>
<p>- <a href="http://www.accurev.com/webinar/200706-jira" target="_blank">Create issues in JIRA</a> as before for the desired features and fixes and assign to developers. Use AccuBridge for JIRA to sync those issues into AccuRev</p>
<p>- Create a stream for R4.2</p>
<p>- Create (or reparent existing) developer workspaces off of this stream.</p>
<p>- When developers finish coding, they use &#8216;promote to issue&#8217; to push the code to the R4.2 stream (automatically creating a change package that associates the code changes with the JIRA issue, and automatically updating the JIRA issue with an annotation about said code changes).</p>
<p>At this point, the R4.2 stream contains everything that you want to release. If you decide to back out a feature, you can use the revert by change package feature to remove it from the stream. The code changes are always available in the developer&#8217;s workspace if you need to revive them in the future. Once it is time to release, you can create a snapshot of the R4.2 stream to preserve it, and then you can go about working on the next release. If R4.2 and R5.0 (The Next Big Release) are happening in parallel, you could create an R5.0 stream as a child of R4.2, so that the R5.0 stream automatically inherits all of the R4.2 changes.</p>
<p>The advantages are many:</p>
<p>- Fewer and simpler merges</p>
<p>- Right-sized feature isolation and management</p>
<p>- <a href="http://www.accurev.com/scm_comparisons.html" target="_blank">Inherent parallelism through code inheritence</a></p>
<p>- Fewer process steps</p>
<p>- Built-in automation and thus fewer opportunities for manual errors.</p>
<p>I could go on, but I hear the footsteps in the hallway. There are people out there who don&#8217;t want you to know about streams. &#8220;We&#8217;ve always used branches,&#8221; they&#8217;ll say. &#8220;We&#8217;re too smart to use some vendor&#8217;s solution,&#8221; others will say. I say, don&#8217;t listen to them. Fight the power. Walk right up to them and say &#8220;Why branch when you can stream?&#8221; And then go ahead and watch your team spend less time fighting with branches and merges, and more time writing features and fixes for your customers.</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2008/09/25/developing-in-streams-releasing-from-streams/' addthis:title='Developing in streams, releasing from streams '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></content:encoded>
			<wfw:commentRss>http://accurev.com/blog/2008/09/25/developing-in-streams-releasing-from-streams/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

