DEV Community

Deep Fix
Deep Fix

Posted on

How to Resolve Git Merge Conflicts Automatically in CI/CD Pipelines – Best Practices & Scripts

Introduction

Git merge conflicts are a common pain point in modern CI/CD pipelines. When a pull request introduces changes that clash with the target branch, the automated build often fails, delaying releases and frustrating developers. In this post we’ll explore why conflicts happen in CI, how to detect them early, and provide step‑by‑step troubleshooting solutions that you can embed directly into your pipeline.

Why Merge Conflicts Break CI/CD

  • Unstable pipelines – A failed merge stops the pipeline, wasting compute resources.
  • Manual intervention – Developers must stop the automated flow to resolve conflicts locally.
  • Inconsistent environments – Different agents may have divergent git histories, leading to hidden conflicts.

Step‑by‑Step: Detect and Resolve Conflicts in the Pipeline

  1. Fetch the latest target branch before the merge:
   git fetch origin
   git checkout $CI_COMMIT_SHA
Enter fullscreen mode Exit fullscreen mode
  1. Attempt a dry‑run merge to see if conflicts arise:
   if ! git merge --no-commit --no-ff origin/main; then
     echo "::error::Merge conflict detected"
     exit 1
   fi
Enter fullscreen mode Exit fullscreen mode
  1. Apply an automated strategy (ours/theirs) for simple, non‑critical files:
   git merge --strategy-option=theirs origin/main || {
     echo "Resolving with 'theirs' strategy"
     git checkout --theirs .
     git add .
     git commit -m \"Auto‑resolve merge conflicts in CI\"
   }
Enter fullscreen mode Exit fullscreen mode
  1. Run linting/tests to ensure the auto‑resolution didn’t introduce regressions.
  2. Push the resolved commit back to the feature branch (if your workflow permits):
   git push origin HEAD:$CI_COMMIT_REF_NAME --force
Enter fullscreen mode Exit fullscreen mode

Sample Bash Helper

#!/usr/bin/env bash
# auto‑resolve simple conflicts using ours/theirs strategy
set -euo pipefail

git fetch origin
# Try a normal merge first
if git merge --no-ff origin/main; then
  echo "Merge succeeded without conflicts"
  exit 0
fi

echo "Conflict detected, applying fallback strategy..."
# Choose 'ours' for our changes or 'theirs' for upstream changes
git checkout --ours .   # or --theirs
git add .
git commit -m \"Auto‑resolve merge conflicts in CI\"
Enter fullscreen mode Exit fullscreen mode

Integrating the Helper into Popular CI Systems

  • GitHub Actions
  jobs:
    resolve-conflict:
      runs-on: ubuntu-latest
      steps:
        - uses: actions/checkout@v3
        - name: Resolve merge conflicts
          run: |
            chmod +x scripts/ci-resolve.sh
            ./scripts/ci-resolve.sh
Enter fullscreen mode Exit fullscreen mode
  • GitLab CI
  resolve_merge:
    stage: test
    script:
      - ./scripts/ci-resolve.sh
Enter fullscreen mode Exit fullscreen mode

Using a Pre‑configured Script

If you prefer not to craft the helper yourself, you can grab a ready‑made version:
Download the pre‑configured script here

Full Patch Tool

For projects that need a more sophisticated conflict‑resolution engine (e.g., handling JSON merges), we provide a complete toolset:
Get the complete patch tool

Repository Fix

All the snippets above are part of a full repository you can clone and adapt:
Access the full repository fix

Conclusion

Automating merge‑conflict handling in CI/CD not only keeps pipelines green but also frees developers from repetitive manual steps. By integrating a lightweight Bash helper or a richer patch tool, you can detect conflicts early, apply safe resolution strategies, and maintain a fast feedback loop. Remember to pair automation with thorough testing to avoid silent bugs.

Happy coding!

Top comments (0)