{"id":1852,"date":"2023-04-06T09:32:09","date_gmt":"2023-04-06T09:32:09","guid":{"rendered":"https:\/\/www.infobip.com\/developers\/?p=1852"},"modified":"2023-09-11T14:29:42","modified_gmt":"2023-09-11T14:29:42","slug":"trunk-based-development-vs-feature-branching","status":"publish","type":"post","link":"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching","title":{"rendered":"Still using feature branching? Try trunk-based development instead.\u00a0"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/04\/Tree-trunk-development-1024x683.png\" alt=\"An image of a tree trunk\" class=\"wp-image-1859\" title=\"\" srcset=\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/04\/Tree-trunk-development-1024x683.png 1024w, https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/04\/Tree-trunk-development-300x200.png 300w, https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/04\/Tree-trunk-development-768x512.png 768w, https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/04\/Tree-trunk-development.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>After a year of\u202ftrunk-based development,<strong> I\u2019m giving up on pull requests and feature branching. &nbsp;<\/strong><\/p>\n\n\n\n<p>A year ago, my team needed to add a nontrivial functionality to production as fast as possible. Business as usual, nothing wrong with that. One thing that bothered me, though, and slowed us down was <strong>long pull request reviews <\/strong>(I&#8217;m talking about days).&nbsp;&nbsp;<\/p>\n\n\n\n<p>You are &#8220;nearly&#8221; done with a functionality but you have to wait for the PR review. So you start on the next one and switch focus, and then you start receiving notifications from the code repository with comments on the work you&#8217;ve just moved away from. In reality, it gets even more complicated because you are also reviewing other team members&#8217; PRs and have at least two more functionalities to finish.&nbsp;<\/p>\n\n\n\n<p>Another thing that rubbed me the wrong way was that <strong>nontrivial refactoring<\/strong>, which would improve code and simplify further development, <strong>was hard or &#8220;impossible&#8221; to do<\/strong>. Since other people were working on the same code, refactoring would break their code badly.&nbsp;<\/p>\n\n\n\n<p><strong>So we decided to try trunk-based development.<\/strong> I worked that way most of my career, but we didn&#8217;t have code reviews unless you asked for one. The reviews were then done live without using any tools. And that worked well \u2013 but this time around, we decided to adopt a somewhat different approach.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Feature-branching\">Feature branching&nbsp;<\/h2>\n\n\n\n<p>In the words of <a href=\"https:\/\/martinfowler.com\/bliki\/FeatureBranch.html\" target=\"_blank\" rel=\"noreferrer noopener\">Martin Fowler<\/a>:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>A feature branch is a source code branching pattern where a developer opens a branch when she starts working on a new feature. They do all the work on the feature on this branch and integrate the changes with the rest of the team when the feature is done.&nbsp;<\/p>\n<\/blockquote>\n\n\n\n<p>Feature branching works best <strong>in zero-trust environments<\/strong>, like open-source, where merging is done after pull request reviews are done asynchronously and during long periods (days and weeks, or even longer).&nbsp;&nbsp;<\/p>\n\n\n\n<p>When you have a team, or teams, however, working on a project together, feature branching creates problems. <strong>Team members should trust each other and be able to collaborate<\/strong> without using tolls for pull request reviews. Otherwise, that team has a bigger problem than their choice of a branching pattern.&nbsp;<\/p>\n\n\n\n<p>When a developer uses feature branching, their work is isolated from the changes other team members are doing, and it may look like it is more productive that way because there are no distractions. But<strong> there is also no feedback or collaboration until the developer creates a pull request<\/strong> and needs to merge changes to the trunk (also called master and mainline).&nbsp;&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Enter-the-merge-hell\">Enter the merge hell&nbsp;<\/h2>\n\n\n\n<p>The feedback through pull request reviews is too often not valuable enough or not as good as it should be, especially if a change is significant. Reviewing hundreds or more changed lines is hard, and a review can mean the developer needs to rewrite everything after they had spent days or even a whole sprint on that feature.&nbsp;<\/p>\n\n\n\n<p><strong>Merge hell is a well-known problem<\/strong>, and with feature branching, you will certainly encounter it. It\u2019s what happens when the code in your branch and the trunk diverges so much after other developers push their feature branches to the trunk that <strong>it becomes too complex to merge.<\/strong> Sometimes the simplest way to mitigate merge hell is to start over with development (without any guarantees you won\u2019t end up in a new merge hell).&nbsp;<\/p>\n\n\n\n<p>Refactoring also contributes to the creation of merge hell with branch development,&nbsp;since developers on the team make changes based on the code from the trunk, not the refactored code, which still needs to be merged into the trunk.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"A-better-alternative:-Trunk-based-development\">A better alternative: Trunk-based development&nbsp;<\/h2>\n\n\n\n<p><a href=\"https:\/\/trunkbaseddevelopment.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Trunk-based development<\/a>, on the other hand, <strong>practices continuously merging code into the trunk <\/strong>and avoiding long-lived feature branches. (<a href=\"https:\/\/cloud.google.com\/devops\/state-of-devops\" target=\"_blank\" rel=\"noreferrer noopener\">State of DevOps 2022 Report<\/a>):&nbsp;<\/p>\n\n\n\n<p>This means that developers push changes to the trunk at least daily, avoiding PRs, PR reviews, and merge hell problems. A 2018 book, <a href=\"https:\/\/learning.oreilly.com\/library\/view\/accelerate\/9781457191435\/\" target=\"_blank\" rel=\"noreferrer noopener\">Accelerate<\/a>, explored and documented that trunk-based development as a better alternative to feature branching:&nbsp;<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Our research also found that developing off trunk\/master rather than on long-lived feature branches was correlated with higher delivery performance. Teams that did well had fewer than three active branches at any time, their branches had very short lifetimes (less than a day) before being merged into trunk and never had \u201ccode freeze\u201d or stabilization periods. It\u2019s worth re-emphasizing that these results are independent of team size, organization size, or industry.<\/p>\n<\/blockquote>\n\n\n\n<p>That conclusion has been repeated every year since in the\u202f<a href=\"https:\/\/cloud.google.com\/devops\/state-of-devops\" target=\"_blank\" rel=\"noreferrer noopener\">State of DevOps Reports<\/a>.&nbsp;<\/p>\n\n\n\n<p>It\u2019s worth mentioning that trunk-based development is also<strong> a core practice in\u202f<\/strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Continuous_integration\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>continuous integration<\/strong><\/a><strong>.<\/strong> If developers don&#8217;t push changes to the trunk at least daily, then they are not doing continuous integration and are\u202f<a href=\"https:\/\/martinfowler.com\/articles\/continuousIntegration.html#BenefitsOfContinuousIntegration\" target=\"_blank\" rel=\"noreferrer noopener\">missing all the benefits<\/a>\u202fof it.&nbsp;&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Common-reservations\">Common reservations&nbsp;<\/h2>\n\n\n\n<p>Developers often think that pushing unfinished features to the trunk will cause problems in production since nobody wants incomplete features pushed to clients. Almost always, the solution is simple since deployment and feature release must be independent, using\u202f<a href=\"https:\/\/www.branchbyabstraction.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">branch by abstraction<\/a>\u202for feature toggles, etc.&nbsp;<\/p>\n\n\n\n<p>When I first used this practice we didn\u2019t do a lot of code reviews, but that doesn\u2019t mean it\u2019s not an option. The best solution is<strong> pair or mob programming<\/strong>, but you can also <strong>do reviews<\/strong><strong><em> after<\/em><\/strong><strong> the changes are pushed to the trunk.<\/strong>&nbsp;<\/p>\n\n\n\n<p>Refactoring can still cause problems for other developers, but this is mitigated if developers push changes often, multiple times a day (dozens times per day is OK).&nbsp;<\/p>\n\n\n\n<p>To be successful with trunk-based development, and continuous integration,<strong> an application must have automated tests you trust<\/strong>. And to use branch by abstraction or feature toggles without creating more problems than fixing, the application&#8217;s code should be modular, loosely coupled, etc. (quality). But that is a requirement for all successful development, regardless of the way of work.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"The-biggest-issue:-Changing-the-mindset\">The biggest issue: Changing the mindset&nbsp;<\/h2>\n\n\n\n<p>When we started to use trunk-based development, it wasn\u2019t without hesitation. What if my unfinished code breaks production? What does it mean to work in small batches?&nbsp;<\/p>\n\n\n\n<p>It turned out the biggest obstacle was changing our mindset. <a href=\"https:\/\/www.davefarley.net\/?p=220\" target=\"_blank\" rel=\"noreferrer noopener\">Test-driven development<\/a>\u202fhelped us to<strong> trust our code <\/strong>and<strong> work in small batches<\/strong> (dozens of commits daily per developer is typical). Many new features start in test code and end up in production code very late, sometimes when a feature is finished. We rarely needed to use feature flags.&nbsp;<\/p>\n\n\n\n<p>Besides unit tests, we had (and still do) <strong>integration tests covering most of the functionality<\/strong>. It&#8217;s not unusual that we develop a feature without starting the application even once. Automated tests will start the application, but there is no manual verification.&nbsp;<\/p>\n\n\n\n<p>Additionaly, <a href=\"https:\/\/martinfowler.com\/bliki\/PairProgramming.html\" target=\"_blank\" rel=\"noreferrer noopener\">pair and mob programming<\/a>\u202fhelped us further trust our code before we pushed it to the trunk. Continuous review works great too. Post-merge reviews also work well, but I prefer pair and mob programming, since they yield better results and come with some other benefits. &nbsp;<\/p>\n\n\n\n<p>Lately, we have also been exploring <strong>acceptance tests<\/strong> to further improve the quality of our code and enable faster development. There is some way to go yet, but we\u2019re happy to explore it and share what we learned.&nbsp;<\/p>\n\n\n\n<p>I will also be sharing our experiences with some of the topics mentioned above, like pair\/mob programming, TDD, and acceptance tests, so stay tuned.&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>After a year of\u202ftrunk-based development, I\u2019m giving up on pull requests and feature branching. \u00a0<\/p>\n","protected":false},"author":39,"featured_media":1859,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[28,254,252],"tags":[144,146],"coauthors":[181],"class_list":["post-1852","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-post","category-engineering-practices","category-tools","tag-developer-ecosystem","tag-development"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Still using feature branching? Try trunk-based development instead.\u00a0<\/title>\n<meta name=\"description\" content=\"After a year of\u202ftrunk-based development, I\u2019m happy to give up on pull requests and feature branching. Here&#039;s why.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Still using feature branching? Try trunk-based development instead.\u00a0\" \/>\n<meta property=\"og:description\" content=\"After a year of\u202ftrunk-based development, I\u2019m happy to give up on pull requests and feature branching. Here&#039;s why.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching\" \/>\n<meta property=\"og:site_name\" content=\"Infobip Developers Hub\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/infobip\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-04-06T09:32:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-09-11T14:29:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/04\/Tree-trunk-development.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"800\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Denis Kranjcec\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@InfobipDev\" \/>\n<meta name=\"twitter:site\" content=\"@InfobipDev\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Denis Kranjcec\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching\"},\"author\":{\"name\":\"Denis Kranjcec\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/fa06907dcf59f83ef428a9aea13899bc\"},\"headline\":\"Still using feature branching? Try trunk-based development instead.\u00a0\",\"datePublished\":\"2023-04-06T09:32:09+00:00\",\"dateModified\":\"2023-09-11T14:29:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching\"},\"wordCount\":1254,\"publisher\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/04\/Tree-trunk-development.png\",\"keywords\":[\"developer ecosystem\",\"development\"],\"articleSection\":[\"Blog Post\",\"Engineering Practices\",\"Tools\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching\",\"url\":\"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching\",\"name\":\"Still using feature branching? Try trunk-based development instead.\u00a0\",\"isPartOf\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/04\/Tree-trunk-development.png\",\"datePublished\":\"2023-04-06T09:32:09+00:00\",\"dateModified\":\"2023-09-11T14:29:42+00:00\",\"description\":\"After a year of\u202ftrunk-based development, I\u2019m happy to give up on pull requests and feature branching. Here's why.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching#primaryimage\",\"url\":\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/04\/Tree-trunk-development.png\",\"contentUrl\":\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/04\/Tree-trunk-development.png\",\"width\":1200,\"height\":800,\"caption\":\"An image of a tree trunk\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.infobip.com\/developers\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Still using feature branching? Try trunk-based development instead.\u00a0\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#website\",\"url\":\"https:\/\/www.infobip.com\/developers\/\",\"name\":\"Infobip Developers Hub\",\"description\":\"Build meaningful customer relationships across any channel\",\"publisher\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.infobip.com\/developers\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#organization\",\"name\":\"Infobip Developers Hub\",\"url\":\"https:\/\/www.infobip.com\/developers\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/03\/Infobip_logo_favicon.png\",\"contentUrl\":\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/03\/Infobip_logo_favicon.png\",\"width\":696,\"height\":696,\"caption\":\"Infobip Developers Hub\"},\"image\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/infobip\/\",\"https:\/\/x.com\/InfobipDev\",\"https:\/\/www.youtube.com\/channel\/UCUPSTy53VecI5GIir3J3ZbQ\",\"https:\/\/github.com\/infobip-community\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/fa06907dcf59f83ef428a9aea13899bc\",\"name\":\"Denis Kranjcec\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/image\/b581c4217284ee0687dd78cf8c30700a\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/459f494b0aeff6e37f634512fd758c31cdef0b9e749a300cd7ce56762c33f67f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/459f494b0aeff6e37f634512fd758c31cdef0b9e749a300cd7ce56762c33f67f?s=96&d=mm&r=g\",\"caption\":\"Denis Kranjcec\"},\"description\":\"Denis works at Infobip on the observability stack, using mainly Java as a language and platform of choice. He is also an experienced product manager, system architect, and developer of complex information systems. He is always looking for new ways to be a better software engineer.\",\"url\":\"https:\/\/www.infobip.com\/developers\/blog\/author\/denis-kranjcec\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Still using feature branching? Try trunk-based development instead.\u00a0","description":"After a year of\u202ftrunk-based development, I\u2019m happy to give up on pull requests and feature branching. Here's why.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching","og_locale":"en_US","og_type":"article","og_title":"Still using feature branching? Try trunk-based development instead.\u00a0","og_description":"After a year of\u202ftrunk-based development, I\u2019m happy to give up on pull requests and feature branching. Here's why.","og_url":"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching","og_site_name":"Infobip Developers Hub","article_publisher":"https:\/\/www.facebook.com\/infobip\/","article_published_time":"2023-04-06T09:32:09+00:00","article_modified_time":"2023-09-11T14:29:42+00:00","og_image":[{"width":1200,"height":800,"url":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/04\/Tree-trunk-development.png","type":"image\/png"}],"author":"Denis Kranjcec","twitter_card":"summary_large_image","twitter_creator":"@InfobipDev","twitter_site":"@InfobipDev","twitter_misc":{"Written by":"Denis Kranjcec","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching#article","isPartOf":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching"},"author":{"name":"Denis Kranjcec","@id":"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/fa06907dcf59f83ef428a9aea13899bc"},"headline":"Still using feature branching? Try trunk-based development instead.\u00a0","datePublished":"2023-04-06T09:32:09+00:00","dateModified":"2023-09-11T14:29:42+00:00","mainEntityOfPage":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching"},"wordCount":1254,"publisher":{"@id":"https:\/\/www.infobip.com\/developers\/#organization"},"image":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching#primaryimage"},"thumbnailUrl":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/04\/Tree-trunk-development.png","keywords":["developer ecosystem","development"],"articleSection":["Blog Post","Engineering Practices","Tools"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching","url":"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching","name":"Still using feature branching? Try trunk-based development instead.\u00a0","isPartOf":{"@id":"https:\/\/www.infobip.com\/developers\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching#primaryimage"},"image":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching#primaryimage"},"thumbnailUrl":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/04\/Tree-trunk-development.png","datePublished":"2023-04-06T09:32:09+00:00","dateModified":"2023-09-11T14:29:42+00:00","description":"After a year of\u202ftrunk-based development, I\u2019m happy to give up on pull requests and feature branching. Here's why.","breadcrumb":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching#primaryimage","url":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/04\/Tree-trunk-development.png","contentUrl":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/04\/Tree-trunk-development.png","width":1200,"height":800,"caption":"An image of a tree trunk"},{"@type":"BreadcrumbList","@id":"https:\/\/www.infobip.com\/developers\/blog\/trunk-based-development-vs-feature-branching#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.infobip.com\/developers\/"},{"@type":"ListItem","position":2,"name":"Still using feature branching? Try trunk-based development instead.\u00a0"}]},{"@type":"WebSite","@id":"https:\/\/www.infobip.com\/developers\/#website","url":"https:\/\/www.infobip.com\/developers\/","name":"Infobip Developers Hub","description":"Build meaningful customer relationships across any channel","publisher":{"@id":"https:\/\/www.infobip.com\/developers\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.infobip.com\/developers\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.infobip.com\/developers\/#organization","name":"Infobip Developers Hub","url":"https:\/\/www.infobip.com\/developers\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.infobip.com\/developers\/#\/schema\/logo\/image\/","url":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/03\/Infobip_logo_favicon.png","contentUrl":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/03\/Infobip_logo_favicon.png","width":696,"height":696,"caption":"Infobip Developers Hub"},"image":{"@id":"https:\/\/www.infobip.com\/developers\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/infobip\/","https:\/\/x.com\/InfobipDev","https:\/\/www.youtube.com\/channel\/UCUPSTy53VecI5GIir3J3ZbQ","https:\/\/github.com\/infobip-community"]},{"@type":"Person","@id":"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/fa06907dcf59f83ef428a9aea13899bc","name":"Denis Kranjcec","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/image\/b581c4217284ee0687dd78cf8c30700a","url":"https:\/\/secure.gravatar.com\/avatar\/459f494b0aeff6e37f634512fd758c31cdef0b9e749a300cd7ce56762c33f67f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/459f494b0aeff6e37f634512fd758c31cdef0b9e749a300cd7ce56762c33f67f?s=96&d=mm&r=g","caption":"Denis Kranjcec"},"description":"Denis works at Infobip on the observability stack, using mainly Java as a language and platform of choice. He is also an experienced product manager, system architect, and developer of complex information systems. He is always looking for new ways to be a better software engineer.","url":"https:\/\/www.infobip.com\/developers\/blog\/author\/denis-kranjcec"}]}},"_links":{"self":[{"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/posts\/1852","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/users\/39"}],"replies":[{"embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/comments?post=1852"}],"version-history":[{"count":11,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/posts\/1852\/revisions"}],"predecessor-version":[{"id":1928,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/posts\/1852\/revisions\/1928"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/media\/1859"}],"wp:attachment":[{"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/media?parent=1852"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/categories?post=1852"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/tags?post=1852"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/coauthors?post=1852"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}