Skip to content

Mastering Git: A Senior Developer’s Guide to create Pull Requests and get them approved fast

Merging two tracks (source: unsplash)

In the ever-evolving landscape of software development, mastering Git isn’t just about keeping track of code changes — it’s about writing a part of history. Imagine this: It’s late Friday afternoon, and you’re ready to start your weekend when suddenly, a message pops up from the product owner. There’s an issue with the new feature you deployed; sales are dropping, and it needs a quick rollback. Your heart sinks, not just because of the impending delay to your plans, but the dread of digging through a messy commit history titled “quick fix” or “some changes.”

This scenario is all too common and highlights a critical skill that goes beyond basic coding — managing your codebase effectively with Git and creating clear, helpful pull requests. Whether you’re working on a tiny feature or a massive system overhaul, how you handle your version control processes can significantly impact your project’s success and your team’s sanity.

In this post, I’ll share insights from my years as an engineer, navigating various projects from open-source to enterprise environments. We’ll explore not just how to use Git for “saving changes” but how to leverage it fully to make your work shine through detailed, thoughtful pull requests. By the end of this guide, you’ll not only improve your technical skills but also empower your team to collaborate more effectively, ensuring everyone can follow along and contribute with confidence.

Pull Requests: More Than Just Code; They’re Your Safety Net

If you’ve ever wondered why pull requests (PRs) are a staple in software development practices, it’s not just about adhering to protocols — it’s about ensuring excellence. Pull requests are the backbone of collaborative coding, serving not only as a checkpoint but as a collaborative tool that enhances the quality and maintainability of your software.

Quality Assurance: Building a Legacy of Understandable Code

At its core, a pull request is a quality control measure. It acts as a formal review process where your peers scrutinize every line of code you write before it merges into the main branch. This might sound daunting, but it’s a pivotal practice for maintaining code quality. It ensures that more than one set of eyes reviews the changes, catching potential errors or issues that one person might miss. Think of it as a peer check where the goal is collective improvement and learning, not just fault finding.

Team Sync-Up: Turning Code into Conversations

Every pull request you submit does more than merge code — it distributes knowledge. It’s a checkpoint where lessons are shared and collective knowledge is expanded.

Pull requests are not just about keeping bugs at bay; they’re also your team’s meeting room, where code turns into conversations. This is where the magic of transparency works wonders. Submitting a pull request is like opening a dialogue about your code, inviting insights, and weaving a narrative everyone on your team can follow. It’s storytelling with a purpose, where the ‘why’ of your code gets as much attention as the ‘what’.

Imagine a scenario where a new team member has to take over a project you started. A well-documented pull request history can significantly flatten their learning curve, making it easier for them to grasp the project’s evolution. In this way, every pull request adds a chapter to the ongoing story of your software project, contributing to a comprehensive, understandable codebase that stands the test of time and personnel changes.

By making pull requests a pillar of your development process, you not only safeguard the integrity of your code but also foster an environment of continuous feedback and knowledge sharing. This not only speeds up the development process but also enhances team cohesion and understanding.

It’s your time to write (git) history

In the world of software development, every commit you make is like adding a sentence to the story of your project. But not all sentences are created equal. A commit that simply says “fixed bugs” is like a sentence in a novel that reads, “Something happened.” It lacks context, detail, and engagement. To harness the full power of Git, your commits need to tell a compelling story — one that future developers, or even you, months down the line, can follow with ease.

Crafting Clear, Descriptive Commit Messages

Consider this: every time you write a commit message, you’re not just noting what changed; you’re explaining why it changed. A commit message like “[TICKET-101] Add login button to navigation bar — prepares for upcoming user authentication module” does more than track that a login button was added. It provides context, explaining what the change is preparing for and to which issue it belongs to, which can be crucial for understanding the project’s trajectory during reviews or when troubleshooting. Have a look at the two examples below, which history do you prefer?

git history comparison

The Art of Logical Commits

A good story flows logically, building on what came before. Similarly, your commits should be logically organized. Avoid the temptation to lump all your day’s work into one massive commit. Instead, break your work down into logical, manageable pieces. For instance, if you’re working on a new feature, commit the database changes separately from the frontend changes. This not only makes it easier to review but also simpler to manage if something needs to be rolled back.

Link, what belongs together

Splitting your work into multiple atomic commits can make it hard to see the big picture, what belongs together, and what feature you are actually working on. To preserve the relationship between multiple atomic commits that together tell a story, you should always add the issue number of the user story or task you are working on to each commit message. Others can use this link to read through the user story in your project management tool to get the big picture. Since you are working on a perfectly planned project, there should be no changes without a planned reason — so there should be no commits without a ticket number.

git history with linked tickets

Using Branches to Tell Subplots

In any good story, subplots add depth and richness without overwhelming the main narrative. Think of branches in Git as your subplots. Each branch should represent a coherent storyline in your project, whether it’s a new feature, a bug fix, or a performance improvement. By keeping these branches focused and independent, you ensure that they can be developed, reviewed, and merged without conflicts.

Revising Before Publishing

Just as a novelist revises chapters to perfect them before publication, you should tidy up your commits before making them public. Rewriting your commit history locally to clarify your changes makes your branches more understandable. “git rebase — interactive” can be your best tool here, allowing you to reorder, fix up, or squash commits to refine the story your branch tells. Always keep in mind to use the interactive rebase only in private branches as you are rewriting history and you don’t want a glitch in the matrix.

By taking care to craft each commit as a meaningful part of your project’s story, you ensure that your repository remains not just a codebase but a well-documented archive that others can learn from and rely on. This practice doesn’t just make your code better — it turns your repository into a handbook of your project’s history, readable and useful for everyone.

Handling Mistakes with Precision

Even the most experienced developers make mistakes. What separates the good from the great is how they handle these errors. If you commit something by mistake, or if a commit introduces a bug, address it with precision. Amend commits locally to fix errors before they are pushed to a shared repository. If the problematic commit is already public, use additional commits to correct it transparently, explaining what went wrong and how the fix resolves the issue.

By treating your Git commits and branches as integral parts of your project’s story, you enhance the readability and usefulness of your repository. This approach not only benefits your current team by making collaboration smoother but also serves as a crucial resource for future teams who will thank you for your diligence.

Preparing Your Pull Requests for Quick Approval

When you think about pull requests, picture them as your project’s key points of negotiation — moments where your code must speak for itself, persuading others of its value and readiness. Preparing your pull requests meticulously not only expedites their approval but also reflects your professionalism and attention to detail.

Self-Review Before You Request Review

Before you ever click ‘create pull request’, take a step back and review your own work. This is your first line of defense against common errors. Check for typos, ensure that all new code is covered by tests, and double-check that your code aligns with the project’s style guidelines. This self-review isn’t just about catching mistakes; it’s about ensuring that your pull request is as strong as it can be from the outset.

By addressing these issues before involving your team, you save valuable time and streamline the review process. It’s about respecting your colleagues’ time as much as your own.

Note: Depending on your team’s workflow, instead of not creating the pull request, you might want to create the pull request with a “WIP” prefix to let others know that this PR is still “in progress” and may change. In other workflows, you might create the PR but not assign a reviewer. In any case, workflow independently:

Review your code yourself before asking others to review it.

Ensuring Consistency Across Branches

As your project grows and branches multiply, keeping them consistent with your main development line becomes increasingly challenging but critical. Regularly merge changes from your main branch into your feature branches to keep them updated. If you forgot syncing during feature development, you should do this at least know, right before you click the “create pull request” button. This practice prevents merge conflicts and ensures that your feature branches can be integrated smoothly into the main project when they’re complete.

Make It Easy to Review

Your reviewers are your allies, not your enemies. Facilitate their job by making your pull requests easy to digest. This means:

  • Organizing Changes Logically: Group related changes together and separate unrelated changes into different pull requests. This clarity helps reviewers focus on each part without distraction.
  • Descriptive Titles and Summaries: Use the title to clearly state what the pull request achieves. The summary should provide a brief, clear description of the changes, why they were made, and any particular areas where you seek feedback (and not just a list an auto-generated list of commits).
  • Link to Relevant Issues: If your pull request resolves a specific issue, link it. In well-structured projects, there should be no commits that do not reference tickets in which the requirements are described in more detail. This not only provides context but also helps in tracking project progress.

Facilitating Effective Reviews

Respond Promptly to Feedback

Once the reviews start coming in, be proactive in your responses. Engage constructively with your reviewers’ suggestions and criticisms. If changes are requested, address them promptly. If you disagree with a suggestion, explain your reasoning clearly and respectfully. Open communication can turn a pull request review into a collaborative improvement process.

Let the Issue Opener Close the Issue

Once you’ve made changes based on feedback, resist the urge to close the issue yourself. Instead, notify the issue opener by, for example, commenting on the issue thread with “fixed in <commit_hash>” and allow them the courtesy of closing it once the reviewer has verified your solution. By referencing the commit in which you solved the issue, you will get even faster feedback from your reviewer.

This practice ensures that the issue is resolved to their satisfaction, which is crucial for maintaining quality and accountability. It underscores respect for the review process and acknowledges the role of the issue opener in verifying and finalizing the solution.

Create new commits with even more care on open pull requests

Remember to write clear and descriptive commit messages. Once your pull request is open, you are no longer in your private home office room, where you can draft and rewrite your story. You are on public (branch) stage now, and everybody is watching! However, you don’t have to be nervous. Take your time, draft your solution with care, and when you are ready, speak out loud and clearly with a descriptive commit message (and avoid pushing non-descriptive catch-em-all “fixed pr issues” commits).

Prioritize your open pull requests over new feature development

If you are a motivated engineer (and, of course, you are one of those), the chances that you already started implementing your next feature are high. However, prioritise the open pull request whenever you get feedback. Your goal is to resolve all issues as quickly as possible and merge the feature into the shared code base. Only if your pull request is successfully merged the feature is one step closer to release, and it is safe to move on to the next feature. As a good team member, you should also help others get their pull requests done quickly. This means reviewing them quickly and keeping the time to respond low.

Embracing Git Mastery for Career and Team Success

Throughout this guide, we’ve explored the critical role that Git and effective pull request practices play in the world of software development. Mastering these tools isn’t just about keeping track of changes — it’s about crafting a narrative that enhances understanding, fosters collaboration, and builds a reliable and maintainable codebase.

For junior engineers, embracing Git mastery extends far beyond fulfilling a basic job requirement. It’s about significantly contributing to your team’s success and advancing your own career. When you wield Git confidently, you do more than write code; you write history. You enable your team to function more cohesively, tackle more complex projects with confidence, and deliver solutions that are not just functional but also sustainable.

As you continue to develop your skills, remember that each commit, each pull request, is an opportunity to demonstrate your attention to detail, your commitment to quality, and your dedication to clear communication. These moments shape not only the software you’re building but also the professional you are becoming.

Let Git not just be a tool in your toolkit — let it be a key driver of your growth. By mastering Git, you’re not just coding; you’re crafting a legacy of excellence that you and your team can be proud of. Go forth, apply the practices discussed, and watch as you transform from a junior engineer into a pivotal member of your software development team.

It’s time to build

At &‌amp, we sketch, craft, and ship software for SMEs and big corporates. We maintain clear and consistent code quality in all settings to build and ship software that we love!