CINXE.COM

The essence of branch-based workflows - Work Life by Atlassian

<!doctype html> <html lang="en-US"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="profile" href="http://gmpg.org/xfn/11"> <meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' /> <!-- This site is optimized with the Yoast SEO plugin v23.6 - https://yoast.com/wordpress/plugins/seo/ --> <link media="all" href="https://atlassianblog.wpengine.com/wp-content/cache/autoptimize/css/autoptimize_4417afc2057836acb62c67c3e40a8515.css" rel="stylesheet"><title>The essence of branch-based workflows - Work Life by Atlassian</title> <link rel="canonical" href="https://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows" /> <meta property="og:locale" content="en_US" /> <meta property="og:type" content="article" /> <meta property="og:title" content="The essence of branch-based workflows - Work Life by Atlassian" /> <meta property="og:description" content="Two weeks ago I had the pleasure of speaking at the Jazoon conference in Switzerland about Git workflows. One particular..." /> <meta property="og:url" content="https://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows" /> <meta property="og:site_name" content="Work Life by Atlassian" /> <meta property="article:publisher" content="https://www.facebook.com/Atlassian" /> <meta property="article:published_time" content="2013-11-14T10:55:25+00:00" /> <meta property="article:modified_time" content="2019-04-19T23:47:45+00:00" /> <meta property="og:image" content="https://www.atlassian.com/blog/wp-content/uploads/git-merges-32.png" /> <meta property="og:image:width" content="1670" /> <meta property="og:image:height" content="382" /> <meta property="og:image:type" content="image/png" /> <meta name="author" content="Stefan Saasen" /> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:creator" content="@Atlassian" /> <meta name="twitter:site" content="@Atlassian" /> <meta name="twitter:label1" content="Written by" /> <meta name="twitter:data1" content="Stefan Saasen" /> <meta name="twitter:label2" content="Est. reading time" /> <meta name="twitter:data2" content="10 minutes" /> <script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"WebPage","@id":"https://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows","url":"https://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows","name":"The essence of branch-based workflows - Work Life by Atlassian","isPartOf":{"@id":"https://www.atlassian.com/blog/#website"},"primaryImageOfPage":{"@id":"https://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows#primaryimage"},"image":{"@id":"https://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows#primaryimage"},"thumbnailUrl":"https://atlassianblog.wpengine.com/wp-content/uploads/git-merges-32.png","datePublished":"2013-11-14T10:55:25+00:00","dateModified":"2019-04-19T23:47:45+00:00","author":{"@id":"https://www.atlassian.com/blog/#/schema/person/6e671e855aa531bc062c7c1d45a1f347"},"breadcrumb":{"@id":"https://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows#primaryimage","url":"https://atlassianblog.wpengine.com/wp-content/uploads/git-merges-32.png","contentUrl":"https://atlassianblog.wpengine.com/wp-content/uploads/git-merges-32.png","width":1670,"height":382},{"@type":"BreadcrumbList","@id":"https://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://www.atlassian.com/blog"},{"@type":"ListItem","position":2,"name":"The essence of branch-based workflows"}]},{"@type":"WebSite","@id":"https://www.atlassian.com/blog/#website","url":"https://www.atlassian.com/blog/","name":"Work Life by Atlassian","description":"Unleashing the potential of all teams with tips, tools, and practices","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://www.atlassian.com/blog/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https://www.atlassian.com/blog/#/schema/person/6e671e855aa531bc062c7c1d45a1f347","name":"Stefan Saasen","url":"https://www.atlassian.com/blog/author/ssaasen"}]}</script> <!-- / Yoast SEO plugin. --> <link rel='dns-prefetch' href='//atl-global.atlassian.com' /> <link rel='dns-prefetch' href='//stats.wp.com' /> <link rel="alternate" type="application/rss+xml" title="Work Life by Atlassian &raquo; Feed" href="https://www.atlassian.com/blog/feed" /> <link rel="alternate" type="application/rss+xml" title="Work Life by Atlassian &raquo; Comments Feed" href="https://www.atlassian.com/blog/comments/feed" /> <link rel="alternate" type="application/rss+xml" title="Work Life by Atlassian &raquo; The essence of branch-based workflows Comments Feed" href="https://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows/feed" /> <script type="text/javascript"> /* <![CDATA[ */ window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/15.0.3\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/15.0.3\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/atlassianblog.wpengine.com\/wp-includes\/js\/wp-emoji-release.min.js"}}; /*! This file is auto-generated */ !function(i,n){var o,s,e;function c(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function p(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data),r=(e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0),new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data));return t.every(function(e,t){return e===r[t]})}function u(e,t,n){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\uddfa\ud83c\uddf3","\ud83c\uddfa\u200b\ud83c\uddf3")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!n(e,"\ud83d\udc26\u200d\u2b1b","\ud83d\udc26\u200b\u2b1b")}return!1}function f(e,t,n){var r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):i.createElement("canvas"),a=r.getContext("2d",{willReadFrequently:!0}),o=(a.textBaseline="top",a.font="600 32px Arial",{});return e.forEach(function(e){o[e]=t(a,e,n)}),o}function t(e){var t=i.createElement("script");t.src=e,t.defer=!0,i.head.appendChild(t)}"undefined"!=typeof Promise&&(o="wpEmojiSettingsSupports",s=["flag","emoji"],n.supports={everything:!0,everythingExceptFlag:!0},e=new Promise(function(e){i.addEventListener("DOMContentLoaded",e,{once:!0})}),new Promise(function(t){var n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"}),a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=function(e){c(n=e.data),a.terminate(),t(n)})}catch(e){}c(n=f(s,u,p))}t(n)}).then(function(e){for(var t in e)n.supports[t]=e[t],n.supports.everything=n.supports.everything&&n.supports[t],"flag"!==t&&(n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&n.supports[t]);n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&!n.supports.flag,n.DOMReady=!1,n.readyCallback=function(){n.DOMReady=!0}}).then(function(){return e}).then(function(){var e;n.supports.everything||(n.readyCallback(),(e=n.source||{}).concatemoji?t(e.concatemoji):e.wpemoji&&e.twemoji&&(t(e.twemoji),t(e.wpemoji)))}))}((window,document),window._wpemojiSettings); /* ]]> */ </script> <script type="text/javascript" id="jetpack_related-posts-js-extra"> /* <![CDATA[ */ var related_posts_js_options = {"post_heading":"h4"}; /* ]]> */ </script> <link rel="https://api.w.org/" href="https://atlassianblog.wpengine.com/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://atlassianblog.wpengine.com/wp-json/wp/v2/posts/27023" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://atlassianblog.wpengine.com/xmlrpc.php?rsd" /> <link rel='shortlink' href='https://wp.me/pfEAH6-71R' /> <link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://atlassianblog.wpengine.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.atlassian.com%2Fblog%2Fgit%2Fthe-essence-of-branch-based-workflows" /> <link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://atlassianblog.wpengine.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.atlassian.com%2Fblog%2Fgit%2Fthe-essence-of-branch-based-workflows&#038;format=xml" /> <!-- Stream WordPress user activity plugin v4.0.2 --> <script src="https://atl-onetrust-wrapper.atlassian.com/assets/atl-onetrust-wrapper.min.js" data-domain="ed42d30f-c9f0-408c-b65a-cd77205ecdf5" data-test="false" data-geofence="false" data-sync="false" ></script> <meta name="google-site-verification" content="HNNnCkeVQ-w56fqPpX2TTEMRmta5QJ-bDunwoaUep-o" /> <meta name="google-site-verification" content="ayWGqoaWJhTnahPSpfLcla5clD7xdAgDPBxf8r9CXJ0" /> <!-- OneTrust Cookies Consent Notice (Production CDN, www.atlassian.com, en-GB) start --> <script> function OptanonWrapper() {} </script> <!-- OneTrust Cookies Consent Notice (Production CDN, www.atlassian.com, en-GB) end --> <link rel="amphtml" href="https://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows/amp"><link rel="preload" as="style" href="https://atlassianblog.wpengine.com/wp-content/plugins/code-prettify/prettify/prettify.css" /><link rel="icon" href="https://atlassianblog.wpengine.com/wp-content/uploads/2017/10/android-chrome-256x256-96x96.png" sizes="32x32" /> <link rel="icon" href="https://atlassianblog.wpengine.com/wp-content/uploads/2017/10/android-chrome-256x256.png" sizes="192x192" /> <link rel="apple-touch-icon" href="https://atlassianblog.wpengine.com/wp-content/uploads/2017/10/android-chrome-256x256.png" /> <meta name="msapplication-TileImage" content="https://atlassianblog.wpengine.com/wp-content/uploads/2017/10/android-chrome-256x256.png" /> </head> <body class="post-template-default single single-post postid-27023 single-format-standard group-blog"> <div id="page" class="site"> <a href="#content" class="skip-link screen-reader-text"data-event-container="skipToContentLink"data-event-component="link"data-label="Skip to main content"data-uuid="2335d4db1ab0b27c90e41ea660a98f94"data-event="clicked"data-schema-version="1" >Skip to main content</a> <header id="masthead" class="site-header product-news-header" role="banner"> <div class="top-bar"> <div class="container"> <div class="site-branding"> <p class="site-title"><a class="site-title__link" href="https://www.atlassian.com/"><span class="screen-reader-text">Atlassian</span></a></p> </div> <nav class="top-bar__menu"><ul id="main-top-nav" class="menu"><li id="menu-item-50464" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-50464"><a href="https://www.atlassian.com/blog" data-event-container="top-bar-blue-menu" data-event-component="link" data-label="Work Life" data-uuid="2be34ea2b466d57d286057a3d7d4462d" data-event="clicked" data-schema-version="1">Work Life</a> <div class="top-bar__description"> </div> </li> <li id="menu-item-50465" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-50465"><a href="https://www.atlassian.com/blog/product-news" data-event-container="top-bar-blue-menu" data-event-component="link" data-label="Products &amp; news" data-uuid="8a33a553749344705bfbaf63182236bb" data-event="clicked" data-schema-version="1">Products &#038; news</a> <div class="top-bar__description"> </div> </li> <li id="menu-item-50466" class="top-bar__menu-item-hover-arrow menu-item menu-item-type-custom menu-item-object-custom menu-item-50466"><a target="_blank" rel="noopener" href="https://www.atlassian.com/team-playbook" data-event-container="top-bar-blue-menu" data-event-component="link" data-label="Team Playbook" data-uuid="e0ef38224bbbc252de5b5e3c6ee7d28a" data-event="clicked" data-schema-version="1">Team Playbook</a> <div class="top-bar__description"> </div> </li> <li id="menu-item-50467" class="top-bar__menu-item-hover-arrow menu-item menu-item-type-custom menu-item-object-custom menu-item-50467"><a target="_blank" rel="noopener" href="https://atlassian.com/community" data-event-container="top-bar-blue-menu" data-event-component="link" data-label="Community" data-uuid="859a71bf49ae9e23fd1b0bf47f4cebcf" data-event="clicked" data-schema-version="1">Community</a> <div class="top-bar__description"> </div> </li> </ul></nav> <div class="top-bar__mobile"> <button class="top-bar__toggle"> More from Atlassian </button> </div> </div> </div> <div class="main-bar"> <div class="container"> <div class="site-header__home site-header__phoenix-product-news"> <a href="https://www.atlassian.com/blog/product-news" class="site-header__phoenix" rel="home"> <span>Products &amp; news</span> </a> </div> <div class="site-header__nav"> <div class="menu-product-news-container"><ul id="main-nav" class="product-news main-nav"><li class="closed menu-item-has-slider menu-slider-type-li menu-slider-count-3 slide-of-four menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children"><a href="https://www.atlassian.com/blog/product-news" class="nav-menu-item-title"><span>Products</span></a><div class="sub-menu"><div class="sub-menu__list-wrapper"><ul><li class="atlassian-apps-blue menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/add-ons" class=""><span>Apps</span></a></li><li class="atlassian-access menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/access" class=""><span>Atlassian Guard</span></a></li><li class="atlassian-bamboo menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/bamboo" class=""><span>Bamboo</span></a></li><li class="atlassian-bitbucket menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent"><a href="https://www.atlassian.com/blog/bitbucket" class=""><span>Bitbucket</span></a></li><li class="atlassian-confluence menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/confluence" class=""><span>Confluence</span></a></li><li class="atlassian-crowd menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/crowd" class=""><span>Crowd</span></a></li><li class="atlassian-crucible menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/crucible" class=""><span>Crucible</span></a></li><li class="atlassian-fisheye menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/fisheye" class=""><span>Fisheye</span></a></li><li class="atlassian-halp menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/halp" class=""><span>Halp</span></a></li><li class="atlassian-jira menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/jira" class=""><span>Jira</span></a></li><li class="atlassian-jira-align menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/jira-align" class=""><span>Jira Align</span></a></li><li class="atlassian-jira-service menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/jira-service-management" class=""><span>Jira Service Management</span></a></li><li class="atlassian-opsgenie menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/opsgenie" class=""><span>Opsgenie</span></a></li><li class="atlassian-sourcetree menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/sourcetree" class=""><span>Sourcetree</span></a></li><li class="atlassian-statuspage menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/statuspage" class=""><span>Statuspage</span></a></li><li class="atlassian-trello menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/trello" class=""><span>Trello</span></a></li></ul></div></div></li><li class="closed menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children"><a href="#" class="nav-menu-item-title"><span>Topics</span></a><div class="sub-menu"><div class="sub-menu__list-wrapper"><ul><li class="topic-ai menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/artificial-intelligence" class=""><span>AI</span></a></li><li class="topic-agile menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/agile" class=""><span>Agile</span></a></li><li class="topic-engineering menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/atlassian-engineering" class=""><span>Atlassian Engineering</span></a></li><li class="topic-continuous-delivery menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/continuous-delivery" class=""><span>Continuous Delivery</span></a></li><li class="topic-developers menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/developer" class=""><span>Developers</span></a></li><li class="topic-devops menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/devops" class=""><span>DevOps</span></a></li><li class="topic-enterprise menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/enterprise" class=""><span>Enterprise</span></a></li><li class="topic-git menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent"><a href="https://www.atlassian.com/blog/git" class=""><span>Git</span></a></li><li class="topic-it-service-management menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/it-service-management" class=""><span>IT Service Management</span></a></li><li class="topic-inside-atlassian menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/inside-atlassian" class=""><span>Inside Atlassian</span></a></li><li class="topic-project-management menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/project-management" class=""><span>Project Management</span></a></li><li class="topic-work-management menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/work-management" class=""><span>Work Management</span></a></li></ul></div></div></li><li class="topic-company-news menu-item menu-item-type-taxonomy menu-item-object-category"><a href="https://www.atlassian.com/blog/announcements" class="nav-menu-item-title"><span>Company News</span></a></li></ul></div> </div> <div class="site__subscribe"> <div class="menu-subscribe-container"><ul id="subscribe-menu" class="menu"><li id="menu-item-42251" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42251"><a href="#" data-toggle="modal" data-target="#atlassian-modal" data-event-container="subscribe" data-event-component="link" data-label="Subscribe" data-uuid="ad96f4fde8863234742f428d8a544f6b" data-event="clicked" data-schema-version="1">Subscribe</a></li> </ul></div> </div> <div class="site__search"> <button class="search-toggle"> <i class="icon-search"></i> <span class="screen-reader-text">Search</span> </button> </div> <div class="site-header__menu-toggle"> <button class="hamburger menu-toggle" type="button" aria-controls="primary-menu" aria-expanded="false"> <span class="screen-reader-text">Primary Menu</span> <span class="hamburger-box"> <span></span> <span></span> <span></span> </span> </button> </div> </div> </div> <div class="search-wrapper"> <form class="search-form" action="https://www.atlassian.com/blog/" method="get"> <label class="screen-reader-text" for="search">Search in https://www.atlassian.com/blog/</label> <div class="row"> <div class="col-10"> <input type="text" class="search-input" name="s" id="search" placeholder="Search for something" value="" /> </div> <div class="col-1 offset-1"> <button class="search-submit" type="submit" data-event-container="searchForm" data-event-component="button" data-label="Search" data-uuid="37eb57a28d5b7f62ec52c63351f74e55" > <i class="icon-search" aria-hidden="true"></i> <span class="screen-reader-text">Search</span> </button> </div> </div> </form> </div> <nav id="site-navigation" class="main-navigation mobile-main-menu main-nav-mobile" role="navigation"> <div class="menu-products-news-mobile-container"><ul id="menu-products-news-mobile" class="mobile-nav"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-42255"><a href="#"><span>Products</span></a><div class='sub-menu__mobile'><ul><li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-42477"><a href="https://www.atlassian.com/blog/product-news"><span>All Products</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-42257"><a href="https://www.atlassian.com/blog/add-ons"><span>Apps</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-42709"><a href="https://www.atlassian.com/blog/access"><span>Atlassian Guard</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-42258"><a href="https://www.atlassian.com/blog/bamboo"><span>Bamboo</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-item-42259"><a href="https://www.atlassian.com/blog/bitbucket"><span>Bitbucket</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-42260"><a href="https://www.atlassian.com/blog/confluence"><span>Confluence</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-42261"><a href="https://www.atlassian.com/blog/crowd"><span>Crowd</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-42262"><a href="https://www.atlassian.com/blog/crucible"><span>Crucible</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-42263"><a href="https://www.atlassian.com/blog/fisheye"><span>Fisheye</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-47068"><a href="https://www.atlassian.com/blog/halp"><span>Halp</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-62328"><a href="https://www.atlassian.com/blog/jira"><span>Jira</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-44717"><a href="https://www.atlassian.com/blog/jira-align"><span>Jira Align</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-47569"><a href="https://www.atlassian.com/blog/jira-service-management"><span>Jira Service Management</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-42300"><a href="https://www.atlassian.com/blog/opsgenie"><span>Opsgenie</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-42268"><a href="https://www.atlassian.com/blog/sourcetree"><span>Sourcetree</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-42269"><a href="https://www.atlassian.com/blog/statuspage"><span>Statuspage</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-59774"><a href="https://www.atlassian.com/blog/trello"><span>Trello</span></a></li></ul></div></li><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-42256"><a href="#"><span>Topics</span></a><div class='sub-menu__mobile'><ul><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-61663"><a href="https://www.atlassian.com/blog/artificial-intelligence"><span>AI</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-42270"><a href="https://www.atlassian.com/blog/agile"><span>Agile</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-42272"><a href="https://www.atlassian.com/blog/continuous-delivery"><span>Continuous Delivery</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-61615"><a href="https://www.atlassian.com/blog/developer"><span>Developer</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-42273"><a href="https://www.atlassian.com/blog/devops"><span>DevOps</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-42274"><a href="https://www.atlassian.com/blog/enterprise"><span>Enterprise</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-item-42275"><a href="https://www.atlassian.com/blog/git"><span>Git</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-42277"><a href="https://www.atlassian.com/blog/it-service-management"><span>IT Service Management</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-42276"><a href="https://www.atlassian.com/blog/inside-atlassian"><span>Inside Atlassian</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-59775"><a href="https://www.atlassian.com/blog/project-management"><span>Project Management</span></a></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-62329"><a href="https://www.atlassian.com/blog/work-management"><span>Work Management</span></a></li></ul></div></li><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-42271"><a href="https://www.atlassian.com/blog/announcements"><span>Company News</span></a></li><li class="product-news menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-42478"><a href="https://www.atlassian.com/blog/"><span>Blog</span></a></li></ul></div> </nav> </header> <div id="content" class="site-content"> <div id="primary" class="content-area"> <main id="main" class="site-main" role="main"> <article id="post-27023" class="post-27023 post type-post status-publish format-standard has-post-thumbnail hentry category-bitbucket category-git category-software-teams tag-git-branching"> <header class="post-hero hero-large"> <div class="container"> <div class="post-wrapper"> <div class="post-hero-image"> <img width="1560" height="382" src="https://atlassianblog.wpengine.com/wp-content/uploads/git-merges-32-1560x382.png" class="attachment-hero-large size-hero-large wp-post-image" alt="" decoding="async" fetchpriority="high" /> </div> <div class="post-info"> <div class="d-lg-none"> <div class="post-date">Published November 14, 2013 in <a href="https://www.atlassian.com/blog/git" data-event-container="postMeta" data-event-component="link" data-label="Git" data-uuid="13dcb37e4c41943df14c2fd081e788c7" data-event="clicked" data-schema-version="1">Git</a></div> </div> <div class="post-hero-body"> <h1 class="post-title">The essence of branch-based workflows</h1> </div> <div class="post-meta"> <div class="post-date">Published <time class="entry-date published updated" datetime="2013-11-14T02:55:25-08:00">November 14, 2013</time> in <a href="https://www.atlassian.com/blog/git" data-event-container="postMeta" data-event-component="link" data-label="Git" data-uuid="13dcb37e4c41943df14c2fd081e788c7" data-event="clicked" data-schema-version="1">Git</a></div><div class="post-author-card"><div class="post-author-image"><img src="https://secure.gravatar.com/avatar/5ed938c0fc01d6e63e73676e328d640b?s=400&#038;d=https%3A%2F%2Fatlassianblog.wpengine.com%2Fwp-content%2Fthemes%2Fatlassianblogs%2Fassets%2Fimages%2Fdefault-avatar.jpg&#038;r=pg" alt="Stefan Saasen" class="rounded-circle" width="400" height="400" /></div><div class="post-author-info"><span class="post-author-link"><a href="https://www.atlassian.com/blog/author/ssaasen" data-event-container="postAuthor" data-event-component="link" data-label="Stefan Saasen" data-uuid="36a086ca49653b5a26cff156195e26fc" data-event="clicked" data-schema-version="1">Stefan Saasen</a></span><p class="post-author-meta"></p></div></div> </div> </div> </div> </div> </header> <div class="container"> <div class="row"> <div class="col-lg-8"> <div class="entry-content"> <p>Two weeks ago I had the pleasure of speaking at the <a href="http://jazoon.com/conference/agenda/">Jazoon conference</a> in Switzerland about Git workflows. One particular piece that seemed to resonate well with the audience was the idea of looking at the underlying rules when it comes to branch based workflows.</p> <h3>Workflows</h3> <p>A workflow defines steps that represent how your team agrees to get code into production. The workflow being used needs to support a number of different use cases. How do I fix a bug in an old release, how can I make a hotfix of the code that is running in production, how do I do feature development, is the feature done, is the code compiling, are the tests running against the correct changes and so on? Those are questions involving a number of different concerns but the way developers interact with their version control system is an important piece of that puzzle. Therefore when we talk about workflows here we focus only on the source code management. And&nbsp;specifically how to use branches to help your team deliver software.</p> <p>There are a number of different branch based workflows out there. There is the well-known <a href="http://nvie.com/posts/a-successful-git-branching-model/">Gitflow</a> workflow or <a href="https://www.atlassian.com/git/workflows#!workflow-feature-branch">feature branch based workflows</a> similar to the way we <a href="http://atlassianblog.wpengine.com/2013/10/inside-atlassian-feature-branching-on-the-stash-team/">in the Stash team use branches</a>. Those workflows usually provide a number of useful advantages:</p> <ul> <li>Rules for <strong>branch creation</strong> (where do I branch off from) and <strong>merging</strong> branches (where, when and how do I merge changes back)</li> <li>A <strong>naming convention</strong> for the branches that conveys the purpose of the different branches and gives your team a common vocabulary (&#8220;never merge master into the release branch&#8221;)</li> <li>A <strong>shared understanding</strong> of what the various branches represent and what their expected life time is (long lived production branch vs. short lived feature branch)</li> </ul> <p>While this is very useful, looking at the underlying rules will help with understanding and more importantly enabling you to create a workflow from scratch or more likely adapt an existing workflow to fit your needs.</p> <h2>Significant branches</h2> <p>Before we try to understand the rules around working with branches in Git it is important to acknowledge that there are different <em>types</em> of branches.</p> <p>Significant branches map to a concept in the outside world. It may be a past release, a particular environment (staging, production) or a role (integrator). Those branches are long-running and stable whereas feature or more generally development branches are short lived and volatile. Short lived branches can be deleted after they have been merged as they are usually not important for the overall history of the project (and the merge commit will point to the tip of the merged branch anyway).</p> <h2>The merge protocol</h2> <p>The most important contribution the various workflow models have made, is a clear understanding of the merging rules that apply. But underlying all those different workflows is a set of very general rules that govern how branches should be merged.</p> <p>Those merge rules require an understanding of how one branch relates to another branch. Here we are specifically looking at how one branch relates to <em>its baseline</em>. The <strong>baseline</strong> is the branch where the new branch was originally branched off of, will be merged back into or more likely both.</p> <p>For the relationship between those two branches, we use the concept of <em>stableness</em>. Although there is no good concrete definition of stableness, it&#8217;s easy to have an intuition for it that applies in most cases. The main idea is that a branch is more stable than another branch if using (or deploying) the software on that branch poses less risk. That usually goes hand in hand with more testing done against that branch, less work in progress and/or mainly stabilizing changes like bug fixes or hardening work.</p> <p>Taking the relationship between two branches and the concept of stableness, we can define the merge rules between the branches. The following approach is based on the <a href="http://www.youtube.com/watch?v=AJ-CpGsCpM0">&#8220;Flow of changes&#8221;</a> presentation from Laura Wingerd and what she calls the &#8220;baseline protocol&#8221;.</p> <p>Here I will call it the merge protocol as it really centers around merging branches and the rules around doing that.</p> <p><img decoding="async" src="https://atlassianblog.wpengine.com/wp-content/uploads/merge-protocol1.png" alt="Merge Rules" width="600"></p> <h3>If a branch is less stable than its baseline</h3> <p>Let&#8217;s look at the case where a branch is&nbsp;<em>less</em>&nbsp;stable compared to its baseline. This applies for example to any feature or development branch. For feature development you would branch off of your main development branch, start development and commiting changes as you go. Most of the time your feature branch would be less stable as it contains work in progress that needs to be finished and then tested and deployed. Merging the feature branch into the baseline would therefore only happen when the code is complete.</p> <p>Merging from the baseline into the feature branch on the other hand&nbsp;<em>can</em>&nbsp;happen whenever necessary as it will bring in the bug fixes and completed features that are already on master. This may be helpful if master contains changes that are required for the development but isn&#8217;t strictly necessary if changes on master are unrelated.</p> <p><img decoding="async" src="https://atlassianblog.wpengine.com/wp-content/uploads/git-merges-32.png" alt="git-merges-3" width="600"></p> <h3>If a branch is more stable than its baseline</h3> <p>An example for a branch that is more stable than its baseline is a release branch.</p> <p>A release branch will be branched off of the main development branch (e.g. master) prior to a release. After branching off the release branch will only receive bug fixes or hardening changes to stabilize the software on the branch until it is ready to be released (which usually involves tagging a certain commit to be able to easily identify the release version). When looking at the merge rules it doesn&#8217;t really matter if&nbsp;the release branch is long-running (i.e. it will still be available after the release was done for further maintenance/bug fix releases) or short lived.</p> <p>If we look at the first case where changes flow from the more stable branch to its baseline (i.e. from the release branch to master) we can see that we can continually merge the stable release branch into the baseline. This intuitively makes sense. As the release branch only receives bug fixes or more generally stabilizing changes we need to ensure that those changes are also present in the next version. It also poses very little risk to let the stabilizing changes flow into the baseline. Hence merging the release branch into master continually has a number of benefits:</p> <ul> <li>It ensures that bug fixes are always present in the baseline branch as well (see <a href="https://www.atlassian.com/blog/2013/05/git-automatic-merges-with-server-side-hooks-for-the-win/">https://www.atlassian.com/blog/2013/05/git-automatic-merges-with-server-side-hooks-for-the-win/</a> for an approach that even uses automated cascading merges)</li> <li>It lets the SCM (i.e. Git) track this fact for us. There is no need to define processes other than merging regularly to ensure that bug fixes are also applied to the baseline branch.</li> </ul> <p><img decoding="async" src="https://atlassianblog.wpengine.com/wp-content/uploads/git-merges-11.png" alt="git-merges-3" width="600"></p> <p>Changes from the baseline to the more stable branch on the other hand are a no-no. You should never merge back from the baseline into the more stable branch! Again, looking at how the changes evolve this makes sense. Consider a long-running release branch that was created to release version 1.1 of your software. Your current development branch &#8220;master&#8221; will slowly evolve and receive various changes (new features, general development, bug fixes related to the new feature work that is happening) that will ultimately end up in the next version of the software (e.g. 1.2). If you would merge master into the release branch it would receive all those in progress changes and features that are slated for the next release, something you want to avoid at all cost on your release branch for the older version.</p> <h4>Never is a strong word</h4> <p>An additional rule helps with scenarios where changes that happened on master need to be applied to the more stable branch. While following the merge protocol prohibits&nbsp;you from <em>merging</em> the changes, using <tt>git cherry-pick</tt>&nbsp;can be used to backport changes one by one. This will help you in scenarios where a bug was fixed on master and only after the fact you decide that it should have been applied to older release as well.</p> <p><img decoding="async" src="https://atlassianblog.wpengine.com/wp-content/uploads/git-merges-41.png" alt="git-merges-4" width="600"></p> <h3>Merge tips</h3> <p>With a simple set of rules, a merge based workflows can be easily understood and more importantly extended. But in addition to thinking about the merge <em>rules</em>, merging itself needs to work for your given project. A couple of Git&nbsp;tips may help you make merge based workflows work for your team.</p> <h4>Merge always</h4> <p>You will&nbsp;hopefully see the benefits of merging a stable release branch into your master. But looking at your current project&nbsp;you may be thinking about challenges that prevent you from applying this merge based workflow to your project. Whether it is meta information that you store in your repository that relates to a particular branch (e.g. version numbers) or specific changes you don&#8217;t want to merge into the baseline (e.g. bugs were fixed in features that aren&#8217;t even present anymore in the newer version). Sometimes a change cannot be applied or would have to be immediately reverted which prevents you from continually merging your changes.</p> <p>A specific example of a change that you cannot merge is versioning information (although it&#8217;s debatable whether that should be stored as content in the repository). In Stash we use the Maven release plugin which at release time updates all the Maven pom XML files with the new release version (e.g. <tt>2.4.2</tt>), commits the change, tags the commit, updates the pom files again with the next development version (e.g. <tt>2.4.3-SNAPSHOT</tt>), commits the change and pushes the changes back into the repository.</p> <p><img decoding="async" src="https://atlassianblog.wpengine.com/wp-content/uploads/git-merges-51.png" alt="git-merges-5" width="600"></p> <p>This is a set of changes you <em>don&#8217;t</em> want to merge to the baseline as the baseline is usually ahead (e.g. <tt>2.5.0-SNAPSHOT</tt>) and shouldn&#8217;t be updated with &#8220;older&#8221; version numbers.</p> <h4>Merge strategies</h4> <p>Enter merge strategies. Git abstracts the way it merges changes by enabling different merge strategies.</p> <p>The simplest merge strategy (called <tt>resolve</tt>) is the traditional three-way merge. When merging a branch foo&nbsp;into master, Git&nbsp;resolves the common ancestor between <tt>master</tt> and foo&nbsp;and conceptually applies the changes from the common ancestor to the tip of branch foo&nbsp;to master.</p> <p><img decoding="async" src="https://atlassianblog.wpengine.com/wp-content/uploads/git-merges-strat1.png" alt="git-merges-strat" width="600"></p> <p>An alternative merge strategy that comes in handy for the particular problem we face is called <tt>ours</tt>. The <tt>ours</tt> merge strategy creates a proper merge commit (i.e. the commit points to both the tips of <tt>master</tt> and branch foo&nbsp;at the time of the merge) but <em>discards all the changes</em> from the source branch. This is important to stress, only use the&nbsp;<tt>ours</tt> strategy if you&nbsp;<strong>don&#8217;t</strong> want any changes to be merged into the target branch.</p> <p>In our case we continually merge from the release branch into master to get all the bug fixes, do the release and then merge the two release commits (e.g. the <tt>2.4.2</tt>&nbsp;and <tt>2.4.3-SNAPSHOT</tt> changes) using the <tt>ours</tt> strategy. We, therefore, don&#8217;t get the changes we <em>don&#8217;t</em> want to apply to the baseline but as Git records a proper merge commit, all the future merges won&#8217;t attempt to apply those changes either and we can keep merging the bug fixes we do want.</p> <p>[cclN_bash]<br /> $ git checkout master<br /> $ git merge -s ours foo # Merge foo into master, discarding any changes on foo<br /> [/cclN_bash]</p> <h4>Make sense of merge history</h4> <p>A common complaint of merge based workflows is the perceived difficulty of making sense of the history. Nicola touched on this in his post on <a href="http://atlassianblog.wpengine.com/2013/10/git-team-workflows-merge-or-rebase/">merge vs rebase based workflows</a>.</p> <p><tt>git log</tt> and the <tt>--first-parent</tt> option cannot only be used to simplify an unwieldy merge history, hence making it easier to understand what happened:</p> <p><img decoding="async" src="http://atlassianblog.wpengine.com/wp-content/uploads/merge-view.png" alt="first-parent-view" width="500"></p> <p><img decoding="async" src="http://atlassianblog.wpengine.com/wp-content/uploads/first-parent-view.png" alt="first-parent-view" width="500"></p> <p>The <tt>--first-parent</tt> option is also a good tool to check whether you and your team are doing the right thing. In a branch based workflow the history as shown by looking at the first parent only should show you mostly merge commits (e.g. where you merged changes in via pull requests) and only some trivial changes directly applied to the main branch.</p> <h2>Summary</h2> <p>With a simple set of merge rules, you can not only explain the plethora of workflows that are being used, you can also use the rules to extend existing workflows and to adapt them to the needs of your team.</p> <p>&nbsp;</p> <blockquote> <p style="text-align: center;line-height: 5px">Anyone can be good, but awesome takes teamwork.</p> <p style="text-align: center;line-height: 4px">Find tools to help your team work better together in&nbsp;our <a href="https://www.atlassian.com/solutions/git-essentials/">Git Essentials</a> solution.</p> </blockquote> </div><!-- .entry-content --> </div> </div> </div> <footer class="entry-footer"> <div class="container"> <div class="post-footer"> <div class="row"> <div class="col-lg-4"> <div class="post-footer-meta"> <span class="post-footer-label">About this Article</span> <div class="post-date-artist-credit"> <div class="post-date large-date">Published November 14, 2013</div> </div> <span class="post-footer-label">About the Author</span> <div class="post-author-footer"> <p> <span class="post-author-link"> <a href="https://www.atlassian.com/blog/author/ssaasen" data-event-container="postAuthorFooter"data-event-component="link"data-label="Stefan Saasen"data-uuid="46cfb05fe363fbd3cdffc205ff1db3ab"data-event="clicked"data-schema-version="1" >Stefan Saasen</a> </span> <span class="author-info"></span> </p> </div> <ul class="social-media-list"> <li> <a data-event-container="postFootersocialMediaList" data-event-component="image" data-label="Facebook" data-uuid="a6e9f9eff7b4d5647f71f8d83a9695e0" data-event="clicked" data-schema-version="1" href="https://www.facebook.com/sharer/sharer.php?u=https://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows" class="social-popup social-icon facebook" > <span class="screen-reader-text">Facebook</span> </a> </li> <li> <a data-event-container="postFootersocialMediaList" data-event-component="image" data-label="Twitter" data-uuid="bfd1eb33d0c7e5e47e847cac402909e3" data-event="clicked" data-schema-version="1" href="https://twitter.com/intent/tweet?text=https://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows" class="social-popup social-icon twitter" > <span class="screen-reader-text">Twitter</span> </a> </li> <li> <a data-event-container="postFootersocialMediaList" data-event-component="image" data-label="Linkedin" data-uuid="8a0f53b4df7dc27ea3006c7288d7a280" data-event="clicked" data-schema-version="1" href="https://www.linkedin.com/shareArticle?mini=true&#038;url=https://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows&#038;title=The%20essence%20of%20branch-based%20workflows" class="social-popup social-icon linkedin" > <span class="screen-reader-text">Linkedin</span> </a> </li> <li> <a data-event-container="postFootersocialMediaList" data-event-component="image" data-label="Pocket" data-uuid="2be974c3484c4bbcc3cec6f03f768f04" data-event="clicked" data-schema-version="1" href="https://getpocket.com/save?url=https://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows&#038;title=The%20essence%20of%20branch-based%20workflows" class="social-popup social-icon pocket" > <span class="screen-reader-text">Pocket</span> </a> </li> <li> <a data-event-container="postFootersocialMediaList" data-event-component="image" data-label="Email" data-uuid="aa1a21c0ae2d8e9f817b4a59d26f211b" data-event="clicked" data-schema-version="1" href="mailto:someone@example.com?subject=I%20thought%20you&#039;d%20like%20this%20article%20by%20Atlassian&#038;body=The%20essence%20of%20branch-based%20workflows%0D%0Ahttps://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows" class="social-icon email" > <span class="screen-reader-text">Email</span> </a> </li> </ul> </div> </div> <div class="col-lg-8"> <div class="post-footer-related"> <span class="post-footer-label">Related Content</span> <h3>More in <span class="post-footer-term">Git</span></h3> <section class="group-grid grid-count-4 "> <div class="row section-posts-row"> <div class="grid-column col-md-6"> <article id="post-28951-footer-related" class="card card-300x118 h-100 post-28951 post type-post status-publish format-standard has-post-thumbnail hentry category-git category-software-teams category-sourcetree tag-coding tag-git-branching tag-sourcetree-tips"> <div class="card-image" > <a data-event-container="postCardThumbnail" data-event-component="image" data-label="Post Thumbnail" data-uuid="031bc150a800117270ab04f3008d1474" data-event="clicked" data-schema-version="1" aria-label="Interactive rebase in Sourcetree" href="https://www.atlassian.com/blog/sourcetree/interactive-rebase-sourcetree" > <img width="192" height="192" src="https://atlassianblog.wpengine.com/wp-content/uploads/2017/02/interactive-rebase-in-sourcetree0a@3x-192x192.png" class="card-img-top wp-post-image" alt="Branching illustration" decoding="async" srcset="https://atlassianblog.wpengine.com/wp-content/uploads/2017/02/interactive-rebase-in-sourcetree0a@3x-192x192.png 192w, https://atlassianblog.wpengine.com/wp-content/uploads/2017/02/interactive-rebase-in-sourcetree0a@3x-400x400.png 400w, https://atlassianblog.wpengine.com/wp-content/uploads/2017/02/interactive-rebase-in-sourcetree0a@3x-760x760.png 760w, https://atlassianblog.wpengine.com/wp-content/uploads/2017/02/interactive-rebase-in-sourcetree0a@3x-96x96.png 96w" sizes="(max-width: 192px) 100vw, 192px" /> </a> </div> <div class="card-body"> <div class="entry-category"> <span class="post-category "> <a href="https://www.atlassian.com/blog/sourcetree" data-event-container="postCategory" data-event-component="link" data-label="Sourcetree" data-uuid="11881" data-event="clicked" data-schema-version="1">Sourcetree</a> </span> </div> <h4 class="entry-title card-title "> <a data-event-container="postTitle" data-event-component="link" data-label="Interactive rebase in Sourcetree" data-uuid="93abd55ed2ba2fcb0d0577e3b36000c2" data-event="clicked" data-schema-version="1" href="https://www.atlassian.com/blog/sourcetree/interactive-rebase-sourcetree" rel="bookmark" > Interactive rebase in Sourcetree </a> </h4> </div> </article><!-- #post-28951 --> </div><!-- .grid-column --> <div class="grid-column col-md-6"> <article id="post-35091-footer-related" class="card card-300x118 h-100 post-35091 post type-post status-publish format-standard has-post-thumbnail hentry category-bitbucket category-git category-software-teams tag-code-review tag-pull-requests"> <div class="card-image" > <a data-event-container="postCardThumbnail" data-event-component="image" data-label="Post Thumbnail" data-uuid="dd2d7d31cd426f81b7a38c097d5ca36a" data-event="clicked" data-schema-version="1" aria-label="The (written) unwritten guide to pull requests" href="https://www.atlassian.com/blog/git/written-unwritten-guide-pull-requests" > <img width="192" height="192" src="https://atlassianblog.wpengine.com/wp-content/uploads/2016/07/the-written-unwritten-guide-to-pull-requests0d@3x-192x192.png" class="card-img-top wp-post-image" alt="" decoding="async" srcset="https://atlassianblog.wpengine.com/wp-content/uploads/2016/07/the-written-unwritten-guide-to-pull-requests0d@3x-192x192.png 192w, https://atlassianblog.wpengine.com/wp-content/uploads/2016/07/the-written-unwritten-guide-to-pull-requests0d@3x-400x400.png 400w, https://atlassianblog.wpengine.com/wp-content/uploads/2016/07/the-written-unwritten-guide-to-pull-requests0d@3x-760x760.png 760w, https://atlassianblog.wpengine.com/wp-content/uploads/2016/07/the-written-unwritten-guide-to-pull-requests0d@3x-96x96.png 96w" sizes="(max-width: 192px) 100vw, 192px" /> </a> </div> <div class="card-body"> <div class="entry-category"> <span class="post-category "> <a href="https://www.atlassian.com/blog/git" data-event-container="postCategory" data-event-component="link" data-label="Git" data-uuid="11890" data-event="clicked" data-schema-version="1">Git</a> </span> </div> <h4 class="entry-title card-title "> <a data-event-container="postTitle" data-event-component="link" data-label="The (written) unwritten guide to pull requests" data-uuid="feb0b87827a724dbaebaa350a23eec61" data-event="clicked" data-schema-version="1" href="https://www.atlassian.com/blog/git/written-unwritten-guide-pull-requests" rel="bookmark" > The (written) unwritten guide to pull requests </a> </h4> </div> </article><!-- #post-35091 --> </div><!-- .grid-column --> <div class="grid-column col-md-6"> <article id="post-43858-footer-related" class="card card-300x118 h-100 post-43858 post type-post status-publish format-standard has-post-thumbnail hentry category-bitbucket category-enterprise category-git"> <div class="card-image" > <a data-event-container="postCardThumbnail" data-event-component="image" data-label="Post Thumbnail" data-uuid="cd90777db84acf37e6a5df079efbdcbd" data-event="clicked" data-schema-version="1" aria-label="Get rid of hacky workarounds and speed up your work with Bitbucket 6.3" href="https://www.atlassian.com/blog/bitbucket/eliminate-workarounds-with-bitbucket-6-3" > <img width="192" height="192" src="https://atlassianblog.wpengine.com/wp-content/uploads/2019/06/bitbucket-6.3-hero-productivity-192x192.png" class="card-img-top wp-post-image" alt="" decoding="async" loading="lazy" srcset="https://atlassianblog.wpengine.com/wp-content/uploads/2019/06/bitbucket-6.3-hero-productivity-192x192.png 192w, https://atlassianblog.wpengine.com/wp-content/uploads/2019/06/bitbucket-6.3-hero-productivity-400x400.png 400w, https://atlassianblog.wpengine.com/wp-content/uploads/2019/06/bitbucket-6.3-hero-productivity-760x760.png 760w" sizes="(max-width: 192px) 100vw, 192px" /> </a> </div> <div class="card-body"> <div class="entry-category"> <span class="post-category "> <a href="https://www.atlassian.com/blog/bitbucket" data-event-container="postCategory" data-event-component="link" data-label="Bitbucket" data-uuid="11880" data-event="clicked" data-schema-version="1">Bitbucket</a> </span> </div> <h4 class="entry-title card-title "> <a data-event-container="postTitle" data-event-component="link" data-label="Get rid of hacky workarounds and speed up your work with Bitbucket 6.3" data-uuid="a973e57e43ad71ffdcf0e2b95c9daa2a" data-event="clicked" data-schema-version="1" href="https://www.atlassian.com/blog/bitbucket/eliminate-workarounds-with-bitbucket-6-3" rel="bookmark" > Get rid of hacky workarounds and speed up your work with Bitbucket 6.3 </a> </h4> </div> </article><!-- #post-43858 --> </div><!-- .grid-column --> <div class="grid-column col-md-6"> <article id="post-41152-footer-related" class="card card-300x118 h-100 post-41152 post type-post status-publish format-standard has-post-thumbnail hentry category-bitbucket category-enterprise category-git tag-bitbucket-tips tag-distributed-teams tag-enterprise"> <div class="card-image" > <a data-event-container="postCardThumbnail" data-event-component="image" data-label="Post Thumbnail" data-uuid="2ad1ac192d9d3ce66abd13946bf82fac" data-event="clicked" data-schema-version="1" aria-label="The distributed team&#8217;s guide to Git mirrors" href="https://www.atlassian.com/blog/bitbucket/enterprise-distributed-teams-guide-git-mirrors" > <img width="192" height="192" src="https://atlassianblog.wpengine.com/wp-content/uploads/2018/08/git-mirroring_featured@2x-192x192.png" class="card-img-top wp-post-image" alt="" decoding="async" loading="lazy" srcset="https://atlassianblog.wpengine.com/wp-content/uploads/2018/08/git-mirroring_featured@2x-192x192.png 192w, https://atlassianblog.wpengine.com/wp-content/uploads/2018/08/git-mirroring_featured@2x-400x400.png 400w, https://atlassianblog.wpengine.com/wp-content/uploads/2018/08/git-mirroring_featured@2x-96x96.png 96w" sizes="(max-width: 192px) 100vw, 192px" /> </a> </div> <div class="card-body"> <div class="entry-category"> <span class="post-category "> <a href="https://www.atlassian.com/blog/bitbucket" data-event-container="postCategory" data-event-component="link" data-label="Bitbucket" data-uuid="11880" data-event="clicked" data-schema-version="1">Bitbucket</a> </span> </div> <h4 class="entry-title card-title "> <a data-event-container="postTitle" data-event-component="link" data-label="The distributed team&#8217;s guide to Git mirrors" data-uuid="d940decd5d86726667059acd08ee293d" data-event="clicked" data-schema-version="1" href="https://www.atlassian.com/blog/bitbucket/enterprise-distributed-teams-guide-git-mirrors" rel="bookmark" > The distributed team&#8217;s guide to Git mirrors </a> </h4> </div> </article><!-- #post-41152 --> </div><!-- .grid-column --> </div> </section> </div> </div> </div> </div> </div> <div class="more-collections"> <div class="container"> <div class="row"> <div class="col"> <h4 class="post-footer-label">More Collections</h4> </div> </div> </div> <section class="group-collections-grid"> <div class="container"> <div class="row"> <div class="col-12"> <div class="group-collections-carousel owl-carousel"> <div class="grid-item item"> <div class="card rich collection h-100 has-image bg-blue post-27023 post type-post status-publish format-standard has-post-thumbnail hentry category-bitbucket category-git category-software-teams tag-git-branching" style="background-image: url( https://atlassianblog.wpengine.com/wp-content/uploads/2023/01/brand-5667-assets-culture-of-innovation-ebook-linkedin-carousel-ad-4-1080x1080-1x-600x960.png );"> <a aria-labelledby="entry_cat67474cc3e5102 card_title67474cc3e5103" aria-describedby="collection_text67474cc3e5104" data-event-container="collectionCard" data-event-component="link" data-label="Company Culture" data-uuid="11981" data-event="clicked" data-schema-version="1" class="collection-link" href="https://www.atlassian.com/blog/collections/company-culture" > <div class="card-body"> <div class="entry-category"> <span class="collection-label" aria-hidden="true"> Collection </span> </div> <h3 class="card-title collection-title h2"> Company Culture </h3> <p class="collection-text">Embrace transparency, foster a sense of belonging, form connections – and have fun along the way.</p> </div> <div class="card-footer" aria-hidden="true"> View Collection </div> </a> </div><!-- #collection-11981 --> </div> <div class="grid-item item"> <div class="card rich collection h-100 has-image post-27023 post type-post status-publish format-standard has-post-thumbnail hentry category-bitbucket category-git category-software-teams tag-git-branching" style="background-image: url( https://atlassianblog.wpengine.com/wp-content/uploads/2023/01/mb-personalities_320x320@2x-600x641.png );"> <a aria-labelledby="entry_cat67474cc3e52f5 card_title67474cc3e52f6" aria-describedby="collection_text67474cc3e52f7" data-event-container="collectionCard" data-event-component="link" data-label="Your Personality at Work" data-uuid="12972" data-event="clicked" data-schema-version="1" class="collection-link" href="https://www.atlassian.com/blog/collections/personality-at-work" > <div class="card-body"> <div class="entry-category"> <span class="collection-label" aria-hidden="true"> Collection </span> </div> <h3 class="card-title collection-title h2"> Your Personality at Work </h3> <p class="collection-text">Navigating and celebrating the complexities of our individuality.</p> </div> <div class="card-footer" aria-hidden="true"> View Collection </div> </a> </div><!-- #collection-12972 --> </div> <div class="grid-item item"> <div class="card rich collection h-100 has-image bg-blue post-27023 post type-post status-publish format-standard has-post-thumbnail hentry category-bitbucket category-git category-software-teams tag-git-branching" style="background-image: url( https://atlassianblog.wpengine.com/wp-content/uploads/2023/01/320x320-blog-2x-600x640.png );"> <a aria-labelledby="entry_cat67474cc3e54b9 card_title67474cc3e54ba" aria-describedby="collection_text67474cc3e54bb" data-event-container="collectionCard" data-event-component="link" data-label="Earnings Reports" data-uuid="12907" data-event="clicked" data-schema-version="1" class="collection-link" href="https://www.atlassian.com/blog/collections/earnings-reports" > <div class="card-body"> <div class="entry-category"> <span class="collection-label" aria-hidden="true"> Collection </span> </div> <h3 class="card-title collection-title h2"> Earnings Reports </h3> <p class="collection-text">A look at what we&#039;re sharing with our investors and stakeholders each quarter.</p> </div> <div class="card-footer" aria-hidden="true"> View Collection </div> </a> </div><!-- #collection-12907 --> </div> </div> </div> </div> </div> </section> </div> </footer><!-- .entry-footer --> <div class="post-header-scrolled"> <progress aria-hidden="true" class="post-progress" value="0"></progress> <div class="post-header-scrolled-grid"> <div class="post-header-title"> <h4>The essence of branch-based workflows</h4> </div> <div class="post-header-subscribe"> <div class="menu-subscribe-container"><ul id="subscribe-menu-post" class="menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-42251"><a href="#" data-toggle="modal" data-target="#atlassian-modal" data-event-container="subscribe" data-event-component="link" data-label="Subscribe" data-uuid="ad96f4fde8863234742f428d8a544f6b" data-event="clicked" data-schema-version="1">Subscribe</a></li> </ul></div> </div> <div class="post-header-social"> <ul class="social-media-list"> <li> <a data-event-container="postHeadersocialMediaList" data-event-component="image" data-label="Facebook" data-uuid="7f55e7e4233989aca74556cd54eaf4c3" data-event="clicked" data-schema-version="1" href="https://www.facebook.com/sharer/sharer.php?u=https://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows" class="social-popup social-icon facebook" > <span class="screen-reader-text">Facebook</span> </a> </li> <li> <a data-event-container="postHeadersocialMediaList" data-event-component="image" data-label="Twitter" data-uuid="122496119cd573fd21cfb0f8570933a8" data-event="clicked" data-schema-version="1" href="https://twitter.com/intent/tweet?text=https://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows" class="social-popup social-icon twitter" > <span class="screen-reader-text">Twitter</span> </a> </li> <li> <a data-event-container="postHeadersocialMediaList" data-event-component="image" data-label="Linkedin" data-uuid="df31f65e3bc1afe30900e5bfea202e5a" data-event="clicked" data-schema-version="1" href="https://www.linkedin.com/shareArticle?mini=true&#038;url=https://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows&#038;title=The%20essence%20of%20branch-based%20workflows" class="social-popup social-icon linkedin" > <span class="screen-reader-text">Linkedin</span> </a> </li> <li> <a data-event-container="postHeadersocialMediaList" data-event-component="image" data-label="Pocket" data-uuid="1e8b1daa0793d75435f288d3cbf26759" data-event="clicked" data-schema-version="1" href="https://getpocket.com/save?url=https://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows&#038;title=The%20essence%20of%20branch-based%20workflows" class="social-popup social-icon pocket" > <span class="screen-reader-text">Pocket</span> </a> </li> <li> <a data-event-container="postHeadersocialMediaList" data-event-component="image" data-label="Email" data-uuid="aa1a21c0ae2d8e9f817b4a59d26f211b" data-event="clicked" data-schema-version="1" href="mailto:someone@example.com?subject=I%20thought%20you&#039;d%20like%20this%20article%20by%20Atlassian&#038;body=The%20essence%20of%20branch-based%20workflows%0D%0Ahttps://www.atlassian.com/blog/git/the-essence-of-branch-based-workflows" class="social-icon email" > <span class="screen-reader-text">Email</span> </a> </li> </ul> </div> </div> </div> </article><!-- #post-27023 --> </main><!-- #main --> </div><!-- #primary --> </div><!-- #content --> <footer class="footer-main"> <div class="container"> <div class="footer-top"> <div id="atlassian_subscribe_widget-4" class="widget atlassian-subscribe-widget"> <div class="subscribe-widget"> <div class="card-body"> <header class="subscribe-widget-header"> <span class="subscribe-label">Join over 150,000 working professionals</span> <img class="subscribe-image" src="https://atlassianblog.wpengine.com/wp-content/themes/atlassianblogs/assets/images/worklife-white.svg" alt="Work Life by Atlassian" /> </header> <div class="card-text"> <p>By <a href="https://atlassian.com" class="footer-logo-link"><span class="screen-reader-text">Atlassian</span></a></p> </div> <div class="card-callout"> <p>Culture, tech, teams, and tips, delivered twice a month</p> </div> <div class="card-button"> <button data-event-container="subscribeWidget" data-event-component="button" data-label="Sign me up!" data-uuid="8678b3962b8e2bc3f39f3cc2b7fd88d4" data-event="clicked" data-schema-version="1" type="button" class="button button__primary--yellow" data-toggle="modal" data-target="#atlassian-modal" > Sign me up! </button> </div> </div> </div> </div> </div> <div class="footer-bottom"> <div class="menu-links-container"><ul id="footer-menu" class="nav navbar-nav"><li id="menu-item-35191" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-35191"><a href="https://atlassian.com" data-event-container="links" data-event-component="link" data-label="Atlassian.com" data-uuid="9267967357866cc662353f695a812366" data-event="clicked" data-schema-version="1">Atlassian.com</a></li> <li id="menu-item-35192" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-35192"><a href="https://www.atlassian.com/legal/customer-agreement" data-event-container="links" data-event-component="link" data-label="Terms of Use" data-uuid="3b85d684d1802dbf1bb05742c75f106f" data-event="clicked" data-schema-version="1">Terms of Use</a></li> <li id="menu-item-35193" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-35193"><a href="https://www.atlassian.com/legal/privacy-policy" data-event-container="links" data-event-component="link" data-label="Privacy Policy" data-uuid="8e1da51d53ab1992ceebd4f81ac8de1b" data-event="clicked" data-schema-version="1">Privacy Policy</a></li> <li id="menu-item-54122" class="atl-policy-link atl-policy-link-text atl-policy-link-container menu-item menu-item-type-custom menu-item-object-custom menu-item-54122"><a href="https://www.atlassian.com/legal/privacy-policy#additional-disclosures-for-ca-residents" data-event-container="links" data-event-component="link" data-label="Notice at Collection" data-uuid="e9dd1c49cc0ac866f54eb500eb0c6a52" data-event="clicked" data-schema-version="1">Notice at Collection</a></li> <li class="menu-item copyright">Copyright &copy; 2024 Atlassian</li></ul></div> </div> </div> </footer> </div><!-- #page --> <div class="modal fade" id="atlassian-modal"> <div class="modal-dialog modal-dialog-centered" role="document"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close" data-event-container="modal" data-event-component="button" data-label="Close Modal" data-uuid="5b8f923808787e8951dfce7a535aec13" > <span aria-hidden="true"><i class="icon-close"></i></span> </button> </div> <div class="modal-body"> <div id="consenthub-form-wrapper"> <div class="card-body text-center"> <form method="post" enctype="multipart/form-data" id="consenthub-form"> <input type="hidden" name="action" value="atlassian_blog_process_consenthub" /> <header class="form-heading"> <span class="subscribe-label">Subscribe to Work Life</span> <h3 class="form-description">Advice, stories, and expertise about work life today.</h3> </header> <div id="consenthub_error_msg"></div> <div class="form-body"> <label class="sr-only" for="consenthub_email" >Email<span class="gfield_required">*</span></label> <div class="form-input-container form-input-container-email"> <input name="consenthub_email" id="consenthub_email" type="text" value="" class="large" tabindex="5" placeholder="Email Address" aria-required="true" aria-invalid="false" /> </div> </div> <div class="form-footer"> <input type="hidden" id="consenthub_key" value="atlassian.atlassianBlog" /> <input type="hidden" id="consenthub_success_msg" value="We know your inbox is protected space, so we promise to send only the good stuff, twice a month." /> <input type="submit" id="consenthub_form_submit" class="button button__primary--yellow" value="Subscribe" tabindex="6" /> </div> </form> </div> </div> </div> </div> </div> </div> <script type="text/javascript" id="code-prettify-js-before"> /* <![CDATA[ */ var codePrettifyLoaderBaseUrl = "https:\/\/atlassianblog.wpengine.com\/wp-content\/plugins\/code-prettify\/prettify"; /* ]]> */ </script> <script type="text/javascript" src="https://atlassianblog.wpengine.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1" id="jquery-core-js"></script> <script type="text/javascript" id="atlassian-components-script-js-extra"> /* <![CDATA[ */ var consenthub_settings = {"ajaxurl":"https:\/\/atlassianblog.wpengine.com\/wp-admin\/admin-ajax.php","error_msg":"Please enter a valid email address","fail_msg":"An error occurred when submitting your information. Please try again later.","configurl":"https:\/\/preferences.atlassian.com\/rest\/forms\/config","formurl":"https:\/\/www.atlassian.com\/blog\/git\/the-essence-of-branch-based-workflows","submiturl":"https:\/\/www.atlassian.com\/endpoint\/preferencesV2\/update"}; /* ]]> */ </script> <script type="text/javascript" id="atlassianblogs-script-js-extra"> /* <![CDATA[ */ var atlassian_banner_cookie = [""]; var search_url_base = {"url":"https:\/\/www.atlassian.com\/blog\/search"}; var current = {"url":"https:\/\/www.atlassian.com\/blog\/git\/the-essence-of-branch-based-workflows"}; var home_url_base = {"url":"https:\/\/atlassianblog.wpengine.com\/"}; /* ]]> */ </script> <script type="text/javascript" src="https://atl-global.atlassian.com/js/atl-global.min.js?ver=1.0" id="segment-io-script-js"></script> <script type="text/javascript" src="https://stats.wp.com/e-202448.js" id="jetpack-stats-js" data-wp-strategy="defer"></script> <script type="text/javascript" id="jetpack-stats-js-after"> /* <![CDATA[ */ _stq = window._stq || []; _stq.push([ "view", JSON.parse("{\"v\":\"ext\",\"blog\":\"231319216\",\"post\":\"27023\",\"tz\":\"-8\",\"srv\":\"atlassianblog.wpengine.com\",\"j\":\"1:13.9\"}") ]); _stq.push([ "clickTrackerInit", "231319216", "27023" ]); /* ]]> */ </script> <script> ace.analytics.Initializer.initWithPageAnalytics('kiv6wyh2nw'); </script> <script defer src="https://atlassianblog.wpengine.com/wp-content/cache/autoptimize/js/autoptimize_18a94bdfb73d215b21359cffeced1a0a.js"></script></body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10