Home / Companies / Mergify / Blog / November 2025

November 2025 Summaries

15 posts from Mergify

Filter
Month: Year:
Post Summaries Back to Blog
Mergify Monorepo CI is an innovative solution for optimizing continuous integration (CI) in monorepos by detecting which parts of a repository each pull request affects and triggering only the relevant GitHub Actions jobs. This approach addresses the inefficiencies and costs associated with traditional CI processes that run unnecessary tests when minor changes are made, especially in large repositories. By introducing the concept of "scopes," which are specific areas of a repository, Mergify allows for precise CI execution, reducing redundant tests and ensuring faster feedback for pull requests. It integrates seamlessly with GitHub Actions, enabling a single CI gate for branch protection and enhancing merge workflows through its Merge Queue feature. This system not only lowers CI costs but also simplifies workflows, ensuring that CI is only tied to actual code ownership, which is crucial for maintaining efficiency and speed in collaborative development environments.
Nov 27, 2025 676 words in the original blog post.
Python's async model is often misunderstood, particularly by engineers familiar with JavaScript or C#, where "await" always indicates a suspension point allowing the event loop to take control. In Python, however, the distinction between coroutines and tasks is crucial; coroutines are synchronous unless they reach a suspension point, while tasks introduce concurrency. This misunderstanding can lead to unnecessary locking and complexity in async code. The key difference is that awaiting a coroutine does not yield control back to the event loop, unlike tasks which do. This design choice stems from Python's evolution from generators, providing explicit boundaries between structured control flow and concurrency. Understanding this distinction helps developers manage concurrency effectively by recognizing where actual suspension points occur, thereby avoiding redundant locks and focusing on genuine concurrency boundaries.
Nov 25, 2025 1,214 words in the original blog post.
Materialized views offer performance benefits by physically storing data but present challenges in schema modifications due to their structure, which necessitates dropping and recreating them to implement changes like adding new columns. This process can disrupt production queries and dependencies, and lengthy recomputations can cause migration pipelines to time out. The article outlines a strategy to manage these issues by creating a new version of the view in parallel with the existing one, using techniques such as creating views with "NO DATA" to enable faster migrations and then performing offline or scheduled refreshes to populate the view without disrupting operations. The method involves a multi-step process: creating a versioned view, updating application pointers to the new view, and eventually dropping the old view once stability is confirmed. This approach, which includes using AI to flag risky migrations, promotes a calm and predictable handling of materialized view updates, ensuring minimal disruption during deployment.
Nov 19, 2025 1,074 words in the original blog post.
Mergify implemented AI-powered linters using GitHub's actions/ai-inference to automate the enforcement of pull request rules, which are often overlooked by human reviewers due to fatigue and context-switching challenges. These single-task AI linters are designed to flag specific issues, such as unreviewed data model changes or risky database migrations, by utilizing natural language prompts instead of complex code or static analysis tools. The approach emphasizes high precision and low noise by focusing on team-specific rules, seamlessly integrating into the existing GitHub workflow without additional friction. The AI linters have demonstrated their effectiveness by catching errors that previously escaped human detection, all while operating quickly and cost-effectively within the diff-level context of pull requests. This innovation represents a shift towards automating routine reminders in code review processes, enhancing the reliability of CI/CD pipelines by ensuring compliance with established practices.
Nov 17, 2025 946 words in the original blog post.
The text provides an in-depth examination of how to handle Git commits, especially focusing on the scenarios where a developer might need to undo a commit. It emphasizes the use of `git reset` for local commits that haven't been pushed to a shared repository, detailing its three modes: `--soft`, which removes the last commit while keeping changes staged; `--mixed`, which unstages changes but keeps them in the working directory; and `--hard`, which permanently deletes all changes. For commits that have been pushed, the text advocates using `git revert`, which creates a new commit to reverse the changes, preserving the project's history and avoiding potential conflicts in a shared environment. The guide also cautions against rewriting shared history and describes the risks associated with using force push commands like `git push --force`, recommending `git push --force-with-lease` as a safer alternative to prevent overwriting others' work. Additionally, it covers scenarios like recovering from an accidental `--hard` reset using Git's reflog and amending the last commit message with `git commit --amend`. Throughout, the guide stresses the importance of careful command use to maintain a clean, collaborative project history.
Nov 10, 2025 2,507 words in the original blog post.
The "git pull --rebase" command is presented as a superior alternative to the standard "git pull" for syncing local branches with remote changes, offering a cleaner and linear project history by replaying local commits on top of the latest remote version, thereby avoiding the clutter of extra merge commits. This approach enhances readability, simplifies code reviews, and aids in tracking down bugs, with approximately 60% of developers favoring it for its benefits in collaboration and maintaining a clear chronological progression of work. However, it is emphasized that rebasing should never be used on public or shared branches due to the potential chaos it can cause by rewriting commit histories, which can disrupt other developers' work. The text also details how to resolve conflicts during a rebase, make rebase the default pull strategy through Git's configuration, and automate the rebase process using tools like Mergify to ensure a consistent, linear history across teams without manual intervention. The document concludes by addressing common concerns and questions about using "git pull --rebase," providing insights into managing conflicts, undoing a rebase, and leveraging Mergify for automated workflows that maintain a stable and linear main branch.
Nov 09, 2025 2,498 words in the original blog post.
Git tags serve as crucial markers in development, providing a stable and permanent reference for significant commits such as official releases, critical hotfixes, and build artifacts. The command `git fetch tag <tag_name>` allows developers to download a specific tag without cluttering their local repository with unnecessary updates. Tags come in two forms: lightweight and annotated, with the latter storing additional metadata and being more suitable for public releases due to its audit trail capabilities. Efficient use of tags can be integrated into daily workflow and CI/CD pipelines, ensuring that automation processes have access to the latest version markers. While updating tags can be tricky, Git's built-in safeguards prevent accidental history rewriting. Commands like `git fetch --tags` and `git fetch --prune --prune-tags` help maintain synchronization between local and remote repositories, ensuring all tags are current and accurate. Understanding the nuances of fetching tags and managing them efficiently is vital for smooth project development and release management.
Nov 08, 2025 2,430 words in the original blog post.
Creating and managing Git branches is a fundamental process for collaborative development, allowing developers to work on features, bug fixes, or experiments without disrupting the main codebase. The process involves creating a branch locally using commands like `git switch -c` or the traditional `git checkout -b`, and then pushing it to a remote repository with `git push -u origin branch-name`, establishing a tracking relationship for easier future updates. This separation between local and remote branches provides developers with a risk-free environment for experimentation and ensures that collaboration is organized and efficient. Smart branch naming conventions, such as using prefixes like `feat/` or `fix/`, enhance communication and understanding within a team. Git's distributed model not only speeds up local operations but also allows multiple developers to work simultaneously without interference. Proper cleanup after merging, such as deleting old branches locally and remotely, is essential to maintain a tidy and healthy project environment, with Mergify offering automation tools to streamline these processes.
Nov 07, 2025 2,282 words in the original blog post.
Managing Git branches effectively is crucial for maintaining a clean and efficient codebase, as cluttered repositories can lead to confusion and decreased productivity in software development. Deleting old branches both locally and remotely prevents the accumulation of obsolete code, improving clarity and speeding up Git operations. The article emphasizes the importance of using the appropriate Git commands, such as `git branch -d` for safely removing merged branches and `git branch -D` for force-deleting unmerged or experimental branches. It also underscores the value of communicating with team members before deleting remote branches to avoid disrupting ongoing work. Establishing a consistent branching strategy, such as the Gitflow workflow, and adopting practices like standardized naming conventions, post-merge cleanup checklists, and automated branch deletions, can enhance team collaboration and repository management. Additionally, tools like Git reflog provide a safety net for recovering mistakenly deleted branches, and combining shell commands can facilitate bulk deletions. Overall, these practices contribute to a more organized and effective development environment.
Nov 06, 2025 2,593 words in the original blog post.
The double-asterisk (**) recursive glob pattern, initially introduced by the Z shell (zsh) in the early 1990s, revolutionized file matching by allowing recursive directory traversal, a capability not standard in the original Unix wildcard set. Zsh's innovation was later independently adopted by KornShell (ksh) around 2003 as "globstar," and subsequently by Bash in version 4.0 in 2009, each with slight variations in implementation. This pattern spread beyond interactive shells into programming languages like Ruby and Python, as well as build tools and configuration files, becoming a widely accepted convention despite its absence from official POSIX standards. Its broad adoption highlights its utility and adaptability, transforming from a shell-specific feature into a ubiquitous tool across various computing environments.
Nov 06, 2025 2,011 words in the original blog post.
Changing production logic can be daunting due to potential unintended consequences on user behavior, but a method known as "shadow shipping" can mitigate this risk by running old and new code versions in parallel to validate changes with real user data before full deployment. This approach involves executing both code paths simultaneously and logging any differences to identify potential regressions without affecting live operations. By visualizing discrepancies through tools like Datadog, engineers can assess the impact of new logic in real-time, ensuring the new behavior aligns with expectations before toggling feature flags for a full rollout. Although this method incurs slightly higher CPU usage, it offers a significant confidence boost by replacing assumptions with data-driven insights, ultimately transforming feature release anxiety into evidence-based assurance. This practice emphasizes that the best validation occurs in production, where actual user interactions provide richer test data than synthetic environments, and encourages the use of shadow shipping for critical logic changes to ensure parity without disruptions.
Nov 05, 2025 1,257 words in the original blog post.
A source code manager (SCM) is an essential tool for modern software development, offering a centralized system to track every change in a project’s code, thereby preventing conflicts and maintaining a complete project history. It facilitates collaborative work and enhances productivity through features like branching, which allows developers to work on separate features simultaneously without affecting the main codebase. The SCM market is expanding rapidly due to its critical role in digital transformation, with distributed version control systems like Git leading the way. These systems enable offline work, faster operations, and eliminate single points of failure, unlike older centralized models. Popular platforms like GitHub, GitLab, and Bitbucket provide additional functionalities such as pull requests for code reviews and integrations with other tools, supporting the entire development lifecycle. SCMs not only improve team efficiency and code quality but also allow for rapid, controlled innovation by enabling concurrent development and offering robust disaster recovery capabilities. The modern development landscape heavily relies on SCMs, with the market expected to grow significantly as they become indispensable for managing both code and non-code files in a collaborative, automated environment.
Nov 05, 2025 4,426 words in the original blog post.
Unit tests provide more than just pass/fail results; they are diagnostic tools that offer insights into the health of your code by confirming whether specific code components function correctly under controlled scenarios. The fast feedback loop of unit tests allows developers to quickly identify and rectify errors, preventing minor issues from escalating into complex problems. A robust unit test suite acts as a safety net, enabling developers to confidently refactor and enhance code without fear of introducing new bugs. Code coverage metrics, such as line, branch, and function coverage, help identify untested portions of the code but should not be viewed as conclusive proof of code quality. Automated testing within CI/CD workflows strengthens quality control by enforcing standards like test pass/fail ratios and code coverage thresholds. Analyzing aggregated test data reveals patterns such as frequent failure hotspots, performance degradation, and coverage gaps, which inform strategic decisions for optimizing code quality and resource allocation. Ultimately, transforming unit test results into actionable insights enhances the software development process, fostering continuous improvement and higher-quality code.
Nov 04, 2025 4,226 words in the original blog post.
Patches, fundamental in software development for collaboration and security, function as blueprint files detailing differences between code versions, allowing changes without direct repository access. They are vital for scenarios like contributing to open-source projects, sharing experimental code, and rolling out security fixes. Tools like `git diff` and `diff` command facilitate patch creation by comparing code versions, with `git apply` and `patch` command used for application, each suited to different contexts. Challenges like failed applications due to code drift or whitespace issues can be mitigated with tools' features, such as `git apply --check` and path-handling options, or through manual fixes. Automating patch application can enhance operational efficiency and security, with tools like Mergify automating patch processes in CI/CD pipelines, demonstrating the growing significance of patch management reflected in its market's projected growth.
Nov 02, 2025 2,778 words in the original blog post.
The text provides a comprehensive guide on handling mistakes in Git commits before pushing them to a remote repository. It emphasizes the safety of local edits, explaining that until changes are pushed, they remain as drafts on a developer's machine, allowing for corrections without affecting teammates. Key commands discussed include `git commit --amend` for minor tweaks to the most recent commit and `git reset` in its various forms—soft, mixed, and hard—for more substantial rewrites of local history. The document advises caution with these commands, particularly `git reset --hard`, due to its potential to permanently erase changes. For changes already pushed to a shared branch, it recommends using `git revert`, which creates a new commit to counteract the unwanted changes, preserving the project’s history intact. It also underscores the importance of maintaining a clean Git history through small, atomic commits and highlights the necessity of understanding team conventions to avoid collaboration issues. Additionally, the text differentiates between `git reset` and `git revert`, outlining the contexts in which each should be used, and discusses the careful use of force-pushing with `git push --force-with-lease` as a safer option for aligning local and remote branches.
Nov 01, 2025 2,620 words in the original blog post.