{"id":44,"date":"2026-01-30T09:55:39","date_gmt":"2026-01-30T09:55:39","guid":{"rendered":"https:\/\/productive.io\/engineering\/blog\/"},"modified":"2026-01-30T09:55:39","modified_gmt":"2026-01-30T09:55:39","slug":"pull-requests-the-good-the-bad-and-really-not-that-ugly","status":"publish","type":"post","link":"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/","title":{"rendered":"Pull Requests\u2014The Good, the Bad and Really, Not That Ugly"},"content":{"rendered":"<p   > <a href='https:\/\/productive.io\/engineering\/category\/engineering\/'>Engineering<\/a><\/p> &#8211; <p   > {{minutes}} min read<\/p> <h1   > Pull Requests\u2014The Good, the Bad and Really, Not That Ugly<\/h1> <a href=\"https:\/\/productive.io\/engineering\/author\/ivan-lucin\/\"> <\/a> <a href=\"https:\/\/productive.io\/engineering\/author\/ivan-lucin\/\"> <p   > Ivan Lu\u010din<\/p><\/a> VP of Engineering @ Productive. Frontend engineer under the hood. Outside of working hours\u2014a happy husband, dad of two girls and a wannabe musician.<p   > January 30, 2026<\/p> <a aria-hidden=\"false\"   href=https:\/\/www.facebook.com\/sharer.php?u=https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly target=_blank rel=\"noopener noreferrer\" > <\/a><a aria-hidden=\"false\"   href=https:\/\/twitter.com\/intent\/tweet?text=Pull%20Requests%E2%80%94The%20Good%2C%20the%20Bad%20and%20Really%2C%20Not%20That%20Ugly&amp;url=https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly target=_blank rel=\"noopener noreferrer\" > <\/a><a aria-hidden=\"false\"   href=https:\/\/www.linkedin.com\/shareArticle?mini=true&amp;url=https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly target=_blank rel=\"noopener noreferrer\" > <\/a> <img  src=\"https:\/\/productive.io\/engineering\/wp-content\/uploads\/sites\/2\/2022\/11\/BP_pull_requests.png\"  alt=\"\" loading=lazy \/> <p   > Recently, I stumbled upon an article on\u00a0<a href=\"https:\/\/arkency.com\/\">arkency<\/a>\u2014<a href=\"https:\/\/blog.arkency.com\/disadvantages-of-pull-requests\/\">Disadvantages of pull requests<\/a>.<\/p> <p   > I soon realized this was interesting stuff, worth sharing with my colleagues. Immediately I started writing a follow-up article, debating every claim made in the text.<br><br>We practice PR review workflow in\u00a0<a href=\"http:\/\/productive.io\/\" rel=\"noreferrer noopener\" target=\"_blank\">Productive&#8217;s<\/a>\u00a0engineering team daily. This workflow helps us with:<\/p> <ul   > <li>Ensuring code quality and stability<\/li><li>Domain knowledge sharing in the team<\/li><li>Organized mentoring activities<\/li><\/ul> <p   > Productive&#8217;s Engineering team builds one SaaS product and works on two\u00a0<strong>massive codebases<\/strong>\u2014the backend (API) and the frontend (web app).<\/p> <img  src=\"https:\/\/productive.io\/wp-content\/uploads\/2022\/02\/1_UTUP1yGK_vdrxnhtxTlGog.png\"  alt=\"\" loading=lazy \/> <p   > Every process comes with overhead, and so does this one, but I\u2019ll argue it\u2019s worth it. <br><br>In this blog post, I\u2019ll quote key points from the mentioned article and give my thoughts on the matter.<br><br>Now, let\u2019s discuss the disadvantages of pull requests! <\/p> <h2   > 1. <strong>More Long-Living Branches, More Merge Conflicts<\/strong><\/h2> <p   > PRs promote developing code in branches, which increases the time and the amount of code staying in a divergent state, which increases chances of merge conflicts. And merge conflicts can be terrible, especially if the branch waited for a long time.<\/p> <p   > Yes, this is true. But it shouldn\u2019t be that big of an issue if you practice a good distribution of work in your team. <br><br>Most products consist of many modules which are usually different screens or sections in the app. You should always divide work across those modules, in a way that one PR doesn\u2019t interact with the other.<br><br>If your codebase is not that modularized, you can ensure a few good practices to avoid this issue:<\/p> <ul   > <li>Always split a big chunk of work into smaller, but functional PRs.<\/li><li>Rebase the branch daily and update it with new changes from the master\/develop (I usually do this before every code review).<\/li><li>Always separate preparatory refactorings and merge them before implementing the actual feature changes. This is great advice given in the original article!<\/li><\/ul> <p   > The most common mistake developers do is putting too much work into one PR, making both the review and merge process harder than it should be.<\/p> <h2   > 2. <strong>The Reviewability of a Change Decreases With Size<\/strong><\/h2> <p   > PRs tend to promote reviewing bigger chunks of code.<\/p> <p   > More often than not, developers fall into this trap. They think something like \u201cI\u2019ll just refactor this while I\u2019m already here\u201d or \u201cI need to complete the whole thing before sending it for review\u201d. This leads to oversized PRs and a slow development process.<br><br><strong>3 PRs with 100 lines are reviewed and merged faster than 1 PR of 300 lines.<\/strong><br><br>Of course, not all changes are the same. If we have 100 lines of boilerplate code, which is usually framework scaffolding, there\u2019s no complexity there. Tests take a lot of lines but should be easy to read. Code with fewer dependencies will always be easier to grasp too.<br><br>Basically, the more a developer is experienced and familiar with the codebase, the more lines he\/she is allowed to put in one PR. Less experienced developers on the project should strive to make their PRs as thin as possible.<\/p> <h2   > 3. <strong>Short Feedback Loop Makes Programming Fun<\/strong><\/h2> <p   > You code something up but it\u2019s nowhere close to being integrated and working. You now have to wait for the reviewer, go through his remarks, discuss them, change the code\u2026<\/p> <p   > I couldn\u2019t agree more. There\u2019s nothing more exciting in programming than getting a great idea, implementing it fast, and testing it out instantly.<br><br>The original author\u2019s claim is that PR reviews kill that short feedback loop which makes programming less fun. But if that\u2019s true, then it also means that:<\/p> <ul   > <li>Your team is producing large and overcomplicated pull requests.<\/li><li>You don\u2019t have a good deployment and review environment setup.<\/li><li>You\u2019re not coding features in safe-enough isolation.<\/li><\/ul> <p   > Again, it all revolves around making small and easily reviewable PRs, but we\u2019ve already acknowledged that, so let\u2019s move on.<br><br>If you do have a large PR waiting review, that doesn\u2019t mean you can\u2019t try it out in the wild. You could easily deploy the code to a staging environment, or even production, but on a separate domain so only you and your team can try out the new changes.<br><br>At Productive, for our main frontend app, we have an automated PR deployment setup. When you create a new PR on Github or push commits to an existing PR, a Github action is triggered that deploys the code to the \u201creview\u201d environment.<br><br>It takes the name of the git branch and deploys the frontend app to the subdomain with the same name. For example\u00a0<a href=\"https:\/\/cool-new-stuff.review.productive.io\/\" rel=\"noreferrer noopener\" target=\"_blank\">https:\/\/cool-new-stuff.review.productive.io<\/a>.<br><br>Voil\u00e0, now you can try your PR changes in the live environment two minutes after you\u2019ve created the PR. <br><br>Plus, there\u2019s another Github action that posts a comment with a test link, so you don\u2019t need to type it into the browser\u2019s URL bar manually:<\/p> <img  src=\"https:\/\/productive.io\/wp-content\/uploads\/2022\/02\/1_dlRh7wHgv9thSNAXIhV52w.png\"  alt=\"\" loading=lazy \/> <p   > This is a frontend app example hosted as a static asset on a CDN, but you could do it similarly with backend apps.<br><br>There\u2019s another mechanism for achieving a short feedback loop which is safe if done properly. With\u00a0<a href=\"https:\/\/martinfowler.com\/articles\/feature-toggles.html\" rel=\"noreferrer noopener\" target=\"_blank\">feature flags<\/a>, you can ensure that your PR is not introducing any breaking changes and that new code is implemented in isolation from existing features.<br><br>Feature flags allow you to try the new changes in an isolated scope, without changing anything in the rest of the system. The scope can be either one user, one account, or just one API request. It\u2019s a powerful mechanism that our team uses on a daily basis. It allows us to push new changes to the live environment rapidly, without worrying about breaking things.<\/p> <h2   > <strong>4. Reviews Tend To Be Superficial<\/strong><br><\/h2> <p   > Proper review takes the same amount of focus as actual coding. Why not pair-program instead?<\/p> <p   > I agree that PR reviews tend to be superficial, especially when there\u2019s too much to review. That only means that the reviewer is doing their job poorly. You can recognize this situation when you see a complex PR that only has code-style comments like \u201cFix naming\u201d or \u201cWrong indentation\u201d, etc.<br><br><strong>If the PR seems like it\u2019s too complicated\u2014why not pair-review instead?<\/strong><br><br>Pair programming (not to be confused with pair-reviewing) is useful for mentoring junior developers, but it\u2019s a waste of time in a lot of other cases. That\u2019s because you\u2019re not solving complex problems all the time.<br><br>A better way to do it is to pair-review the PR with the author after most of the boilerplate is done and proper research has been made. Then you only talk about the complex stuff and you can leave the author of the PR to explain their thought process in detail.<br><br>There\u2019s one more thing here&#8230; Programmers usually get this &#8220;feeling&#8221; when something stinks about their solution. They should be honest and leave comments in the PR, in every place where they feel they could be doing something wrong. That greatly increases the reviewability of the PR.<\/p> <h2   > 5. <strong>Merging Is Blocked by Remarks That Shouldn\u2019t Be Blocking<\/strong><\/h2> <p   > Remarks made by the reviewer can fall anywhere on the spectrum of whether they should block merging or not: from a mistake that\u2019ll bring production down to cosmetic suggestions or opinions.<\/p> <p   > These situations happen quite often with inexperienced reviewers. When commenting on the PR, you should tell the author if the comment is a merge-blocker or not, and never insist on details too much.<br><br>When I\u2019m working with inexperienced developers, I\u2019ll usually tell them exactly how to fix something, with an explanation. For non-blocking mistakes, I\u2019ll just comment to watch out for that in the next PR. Usually, I\u2019m the one to merge the PR, so they don\u2019t have to wonder whether the PR is finished or not.<br><br>When reviewing experienced dev\u2019s PR, I\u2019ll tell them what I think about the problematic places in the code, but I\u2019ll mostly approve the changes and leave them to the author to do the fixes the way they want to.<br><br><strong>Not everything the reviewer says is always correct or the right thing to do. The author should be the one to decide on the comments\u2014because it\u2019s their work.<\/strong><\/p> <h2   > 6. It\u2019s Easier To Fix Than To Explain the Fix<\/h2> <p   > The original author has to understand it first, agree with it, and then is expected to implement it. Often it\u2019s better to let the original author merge his thing, and let the reviewer implement his remark post-factum?<\/p> <p   > A lot of times it\u2019s hard to explain the fix to the author and it would be more\u00a0efficient\u00a0just to implement the fix yourself. But merging the unfinished PR could be dangerous, so I\u2019d never suggest that. You\u2019d also be missing the opportunity to educate the original author about the problem.<br><br>Pull requests don\u2019t have to be done by only one person. Why wouldn\u2019t you, the reviewer, just pull the branch, implement, and push the fixes back upstream? That way the author gets notified about what you did and you both have an opportunity to discuss the issue.<br><br>That\u2019s also an effective thing to do when there are a few simple fixes required on the PR. Let\u2019s say you notice a typo somewhere in the PR. It\u2019s much faster to fix it yourself than to leave a comment and wait for the author to do the fix. You could do that directly in Github and it would take like 30 seconds.<\/p> <h2   > 7. <strong>Developers Are Slower To Adapt the Responsibility Mindset<\/strong><\/h2> <p   > The second one knows that every line they write can screw up things for other developers or even bring production down. They watch their step, they know they are the only one responsible for this change. It shortens the delay between making a mistake and seeing the effect of it.<\/p> <p   > This is an interesting and important claim. Can your business afford to tear the live server down just to teach the developers some responsibility? Sometimes it\u2019s worth it, but in most cases, you wouldn\u2019t want to do that.<br><br>Code stability is not the only reason why we should be reviewing our PRs. There are also benefits of mentoring, knowledge sharing, better release organization, feature completeness, structured discussion around a diff, etc.<br><br>At Productive, we encourage people to self-merge PRs without a review when they\u2019re confident that the changes are fine. The developer should have the freedom to do that in the part of the codebase where they have more ownership. I believe this is how the responsibility mindset can be trained. When people build something from the ground up, they will feel the responsibility to keep everything in great shape.<\/p> <h2   > <strong>8. PRs Discourage Continuous Refactoring<\/strong><\/h2> <p   > It\u2019s good to follow boy scouts\u2019 rule: always leave the place better than it was before. With PRs, though, this rule is harder to apply.<\/p> <p   > PRs will slow you down on refactoring. When you realize that some refactoring is needed, you need to switch to another branch to implement the refactoring separately, submit the PR to review, wait for the approval and merge the changes back into the original branch.<br><br>But it\u2019s still better to do it that way, in my opinion. Refactoring PRs shouldn\u2019t be complicated to review since there shouldn\u2019t be any changes in the logic, only the code structure. That\u2019s especially true if you have good test coverage. If you don\u2019t, then maybe you should write the tests first? <br><br>Maybe the refactoring PR doesn\u2019t need to go through the review process if everything is trivial. If it does, then mention to the reviewer that this is a refactoring-only PR that&#8217;s blocking feature development and the reviewer should prioritize the approval.<br><br><strong>Having good team communication around PRs will minimize most of the downsides of the PR review process.<\/strong><\/p> <h2   > <strong><strong>9. Negative Emotions<\/strong><\/strong><\/h2> <p   > Mandatory PR reviews can induce way more negative emotions than needed. We all have limited emotional budgets \u2014 it\u2019s better not to waste it on avoidable stuff.<\/p> <p   > When it comes to pull request reviewing, the responsibility is both the author&#8217;s and reviewer&#8217;s. There\u2019s one simple rule to follow:<br><br><strong>Don\u2019t be a prick when reviewing or authoring the PR.<\/strong><br><br>The original article is basically saying that we should let developers do what they want because they might get offended by the review comments. <br><br>Obviously, that&#8217;s ridiculous. This doesn\u2019t have anything to do with PR reviewing itself\u2014it\u2019s a communication problem. If your engineering team doesn\u2019t know how to communicate, then you\u2019ll have bigger issues than developers offended by a PR review.<\/p> <h2   > 10. <strong><strong>How Do You Switch to Branches With Migrations<\/strong><\/strong><\/h2> <p   > You obviously sometimes need migrations while working on a branch. What do you do if you then have to switch back to another branch locally? Cumbersome.<\/p> <p   > Well, just do the migration separately on the main branch, before implementing the remaining logic in the PR. The world won\u2019t collapse if you don\u2019t always work on branches with PR reviews. You can always omit the process if you have a good reason for it.<\/p> <h2   > <strong>Conclusion<\/strong><\/h2> <p   > The original article contains a\u00a0<a href=\"https:\/\/blog.arkency.com\/disadvantages-of-pull-requests#now__how_to_make_the__em_10__change__em__in_your_team_today\" rel=\"noreferrer noopener nofollow\" target=\"_blank\">list of suggestions<\/a>\u00a0on how to improve your team\u2019s PR workflow. Those are all great ideas, which I encourage you to try. Thanks to\u00a0<a href=\"https:\/\/arkency.com\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">arkency<\/a>\u00a0for writing a great and educational article! We\u2019ve also published a copy of this article on Medium.<br><br>As with other organizational processes, we shouldn\u2019t take them too seriously because they tend to generate overhead and slow work down. We should be pragmatic about PR reviews and when we notice they&#8217;re becoming a burden\u2014we can skip them sometimes. <br><br>Don\u2019t follow the rules blindly, try thinking with your head and do the right thing depending on the situation you\u2019re in.<br><br>And a little remark for the end\u2014<strong>let\u2019s all be humble and respectful towards each other while reviewing each other&#8217;s code!<\/strong><br><\/p> <p   > Ivan Lu\u010din<\/p> VP of Engineering @ Productive. Frontend engineer under the hood. Outside of working hours\u2014a happy husband, dad of two girls and a wannabe musician.<a   href=\"https:\/\/productive.io\/engineering\/author\/ivan-lucin\/\" > More From This Author <\/a> <h2   > Related articles<\/h2> <a href=\"https:\/\/productive.io\/engineering\/how-react-ruined-web-development\/\"   > <img  src=\"https:\/\/website-assets.productive.io\/uploads\/sites\/2\/2022\/11\/BP_react-1-768x322.png\"  alt=\"\" loading=lazy \/> <p   > Engineering \u2022 Frontend<\/p> <h2   > How React Ruined Web Development<\/h2> <\/a><a href=\"https:\/\/productive.io\/engineering\/testing-the-test\/\"   > <img  src=\"https:\/\/website-assets.productive.io\/uploads\/sites\/2\/2022\/11\/BP_format-768x322.png\"  alt=\"\" loading=lazy \/> <p   > Engineering \u2022 Testing<\/p> <h2   > Testing the Test<\/h2> <\/a> <h2   > Related jobs<\/h2> <a href=\"https:\/\/productive.io\/careers\/open-job-application\/\"  > <p  > Open Job Application<\/p><p  > <\/p> <\/a>","protected":false},"excerpt":{"rendered":"PR review workflow helps with code quality, sharing domain knowledge and mentoring. But every process comes with overhead.","protected":false},"author":11,"featured_media":81,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"es_utils_meta_schema":"","footnotes":""},"categories":[7,14],"tags":[],"class_list":["post-44","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-engineering","category-workflow"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Pull Requests\u2014The Good, the Bad and Really, Not That Ugly - Building Productive<\/title>\n<meta name=\"description\" content=\"Recently, I stumbled upon an article on the\u00a0disadvantages of pull requests\u2014and immediately started writing a follow-up.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pull Requests\u2014The Good, the Bad and Really, Not That Ugly\" \/>\n<meta property=\"og:description\" content=\"Recently, I stumbled upon an article on the\u00a0disadvantages of pull requests\u2014and immediately started writing a follow-up.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/\" \/>\n<meta property=\"og:site_name\" content=\"Building Productive\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-30T09:55:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/website-assets.productive.io\/uploads\/sites\/2\/2022\/11\/BP_pull_requests.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1900\" \/>\n\t<meta property=\"og:image:height\" content=\"796\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Ivan Lu\u010din\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ivan Lu\u010din\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/\"},\"author\":{\"name\":\"Ivan Lu\u010din\",\"@id\":\"https:\/\/productive.io\/engineering\/#\/schema\/person\/32a9827994fe8109baebc97c0be0c762\"},\"headline\":\"Pull Requests\u2014The Good, the Bad and Really, Not That Ugly\",\"datePublished\":\"2026-01-30T09:55:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/\"},\"wordCount\":11,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/website-assets.productive.io\/uploads\/sites\/2\/2022\/11\/BP_pull_requests.png\",\"articleSection\":[\"Engineering\",\"Workflow\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/\",\"url\":\"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/\",\"name\":\"Pull Requests\u2014The Good, the Bad and Really, Not That Ugly - Building Productive\",\"isPartOf\":{\"@id\":\"https:\/\/productive.io\/engineering\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/website-assets.productive.io\/uploads\/sites\/2\/2022\/11\/BP_pull_requests.png\",\"datePublished\":\"2026-01-30T09:55:39+00:00\",\"author\":{\"@id\":\"https:\/\/productive.io\/engineering\/#\/schema\/person\/32a9827994fe8109baebc97c0be0c762\"},\"description\":\"Recently, I stumbled upon an article on the\u00a0disadvantages of pull requests\u2014and immediately started writing a follow-up.\",\"breadcrumb\":{\"@id\":\"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/#primaryimage\",\"url\":\"https:\/\/website-assets.productive.io\/uploads\/sites\/2\/2022\/11\/BP_pull_requests.png\",\"contentUrl\":\"https:\/\/website-assets.productive.io\/uploads\/sites\/2\/2022\/11\/BP_pull_requests.png\",\"width\":1900,\"height\":796},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/productive.io\/engineering\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Pull Requests\u2014The Good, the Bad and Really, Not That Ugly\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/productive.io\/engineering\/#website\",\"url\":\"https:\/\/productive.io\/engineering\/\",\"name\":\"Building Productive\",\"description\":\"Just another Productive Sites site\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/productive.io\/engineering\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/productive.io\/engineering\/#\/schema\/person\/32a9827994fe8109baebc97c0be0c762\",\"name\":\"Ivan Lu\u010din\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/bc5f82dd98fabe447c2a8e68daaf2d20398785c5a4ba3e4353ab9e14c811abc7?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bc5f82dd98fabe447c2a8e68daaf2d20398785c5a4ba3e4353ab9e14c811abc7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bc5f82dd98fabe447c2a8e68daaf2d20398785c5a4ba3e4353ab9e14c811abc7?s=96&d=mm&r=g\",\"caption\":\"Ivan Lu\u010din\"},\"description\":\"VP of Engineering @ Productive. Frontend engineer under the hood. Outside of working hours\u2014a happy husband, dad of two girls and a wannabe musician.\",\"url\":\"https:\/\/productive.io\/engineering\/author\/ivan-lucin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Pull Requests\u2014The Good, the Bad and Really, Not That Ugly - Building Productive","description":"Recently, I stumbled upon an article on the\u00a0disadvantages of pull requests\u2014and immediately started writing a follow-up.","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:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/","og_locale":"en_US","og_type":"article","og_title":"Pull Requests\u2014The Good, the Bad and Really, Not That Ugly","og_description":"Recently, I stumbled upon an article on the\u00a0disadvantages of pull requests\u2014and immediately started writing a follow-up.","og_url":"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/","og_site_name":"Building Productive","article_published_time":"2026-01-30T09:55:39+00:00","og_image":[{"width":1900,"height":796,"url":"https:\/\/website-assets.productive.io\/uploads\/sites\/2\/2022\/11\/BP_pull_requests.png","type":"image\/png"}],"author":"Ivan Lu\u010din","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Ivan Lu\u010din"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/#article","isPartOf":{"@id":"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/"},"author":{"name":"Ivan Lu\u010din","@id":"https:\/\/productive.io\/engineering\/#\/schema\/person\/32a9827994fe8109baebc97c0be0c762"},"headline":"Pull Requests\u2014The Good, the Bad and Really, Not That Ugly","datePublished":"2026-01-30T09:55:39+00:00","mainEntityOfPage":{"@id":"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/"},"wordCount":11,"commentCount":0,"image":{"@id":"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/#primaryimage"},"thumbnailUrl":"https:\/\/website-assets.productive.io\/uploads\/sites\/2\/2022\/11\/BP_pull_requests.png","articleSection":["Engineering","Workflow"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/","url":"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/","name":"Pull Requests\u2014The Good, the Bad and Really, Not That Ugly - Building Productive","isPartOf":{"@id":"https:\/\/productive.io\/engineering\/#website"},"primaryImageOfPage":{"@id":"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/#primaryimage"},"image":{"@id":"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/#primaryimage"},"thumbnailUrl":"https:\/\/website-assets.productive.io\/uploads\/sites\/2\/2022\/11\/BP_pull_requests.png","datePublished":"2026-01-30T09:55:39+00:00","author":{"@id":"https:\/\/productive.io\/engineering\/#\/schema\/person\/32a9827994fe8109baebc97c0be0c762"},"description":"Recently, I stumbled upon an article on the\u00a0disadvantages of pull requests\u2014and immediately started writing a follow-up.","breadcrumb":{"@id":"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/#primaryimage","url":"https:\/\/website-assets.productive.io\/uploads\/sites\/2\/2022\/11\/BP_pull_requests.png","contentUrl":"https:\/\/website-assets.productive.io\/uploads\/sites\/2\/2022\/11\/BP_pull_requests.png","width":1900,"height":796},{"@type":"BreadcrumbList","@id":"https:\/\/productive.io\/engineering\/pull-requests-the-good-the-bad-and-really-not-that-ugly\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/productive.io\/engineering\/"},{"@type":"ListItem","position":2,"name":"Pull Requests\u2014The Good, the Bad and Really, Not That Ugly"}]},{"@type":"WebSite","@id":"https:\/\/productive.io\/engineering\/#website","url":"https:\/\/productive.io\/engineering\/","name":"Building Productive","description":"Just another Productive Sites site","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/productive.io\/engineering\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/productive.io\/engineering\/#\/schema\/person\/32a9827994fe8109baebc97c0be0c762","name":"Ivan Lu\u010din","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/bc5f82dd98fabe447c2a8e68daaf2d20398785c5a4ba3e4353ab9e14c811abc7?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/bc5f82dd98fabe447c2a8e68daaf2d20398785c5a4ba3e4353ab9e14c811abc7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bc5f82dd98fabe447c2a8e68daaf2d20398785c5a4ba3e4353ab9e14c811abc7?s=96&d=mm&r=g","caption":"Ivan Lu\u010din"},"description":"VP of Engineering @ Productive. Frontend engineer under the hood. Outside of working hours\u2014a happy husband, dad of two girls and a wannabe musician.","url":"https:\/\/productive.io\/engineering\/author\/ivan-lucin\/"}]}},"featured_image":"https:\/\/website-assets.productive.io\/uploads\/sites\/2\/2022\/11\/BP_pull_requests.png","category":"Engineering","_links":{"self":[{"href":"https:\/\/productive.io\/engineering\/wp-json\/wp\/v2\/posts\/44","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/productive.io\/engineering\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/productive.io\/engineering\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/productive.io\/engineering\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/productive.io\/engineering\/wp-json\/wp\/v2\/comments?post=44"}],"version-history":[{"count":10,"href":"https:\/\/productive.io\/engineering\/wp-json\/wp\/v2\/posts\/44\/revisions"}],"predecessor-version":[{"id":993,"href":"https:\/\/productive.io\/engineering\/wp-json\/wp\/v2\/posts\/44\/revisions\/993"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/productive.io\/engineering\/wp-json\/wp\/v2\/media\/81"}],"wp:attachment":[{"href":"https:\/\/productive.io\/engineering\/wp-json\/wp\/v2\/media?parent=44"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/productive.io\/engineering\/wp-json\/wp\/v2\/categories?post=44"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/productive.io\/engineering\/wp-json\/wp\/v2\/tags?post=44"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}