DEV Community

Deep Fix
Deep Fix

Posted on

How to Fix Git Merge Conflicts in CI/CD Pipelines – Step‑by‑Step Guide for DevOps

Introduction

Merge conflicts are inevitable in fast‑moving teams, but when they break your CI/CD pipeline they become costly. This article walks you through detecting, resolving, and preventing Git merge conflicts in automated pipelines.


1. Why Conflicts Appear in CI/CD

  • Concurrent feature branches – multiple PRs modify the same files.
  • Automated version bumps – scripts that update package.json or pom.xml run on each merge.
  • Rebase vs. merge strategy – mixing strategies can leave dangling commits.

Understanding the root cause helps you choose the right mitigation.


2. Detecting Conflicts Early

Add a lightweight check at the start of your pipeline.

# .gitlab-ci.yml (GitLab example)
stages:
  - conflict_check
  - build
  - test

conflict_check:
  stage: conflict_check
  image: alpine/git:latest
  script:
    - git fetch origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
    - git merge-base --is-ancestor $CI_COMMIT_SHA origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME || exit 0
    - if git merge-tree $(git merge-base $CI_COMMIT_SHA origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME) $CI_COMMIT_SHA origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME | grep '^<<<<<<<' ; then
        echo "⚠️ Merge conflicts detected";
        exit 1;
      fi
  only:
    - merge_requests
Enter fullscreen mode Exit fullscreen mode

The job aborts the pipeline before expensive builds run, giving developers immediate feedback.


3. Automated Conflict Resolution (When Safe)

For non‑critical files (e.g., autogenerated docs) you can let the pipeline auto‑resolve.

#!/usr/bin/env bash
# auto_resolve.sh – run in a CI job after conflict detection
set -euo pipefail

git checkout $CI_MERGE_REQUEST_TARGET_BRANCH_NAME

git merge --strategy=ours $CI_COMMIT_SHA -m "CI auto‑resolve: keep target branch version"

git push origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
Enter fullscreen mode Exit fullscreen mode

⚠️ Use with caution – only apply to files where the target version is guaranteed to be correct.


4. Manual Resolution Workflow

  1. Checkout the MR locally
   git fetch origin merge-request/$CI_MERGE_REQUEST_IID/head:mr-$CI_MERGE_REQUEST_IID
   git checkout mr-$CI_MERGE_REQUEST_IID
Enter fullscreen mode Exit fullscreen mode
  1. Run the conflict marker search
   git diff --check
Enter fullscreen mode Exit fullscreen mode
  1. Edit the conflicted files – resolve markers (<<<<<<<, =======, >>>>>>>).
  2. Commit and push
   git add .
   git commit -m "Resolve merge conflicts"
   git push origin mr-$CI_MERGE_REQUEST_IID
Enter fullscreen mode Exit fullscreen mode
  1. Re‑run the pipeline – it should now pass the conflict_check stage.

5. Preventing Future Conflicts

Technique How to Implement
Branch protection Require PR reviews and status checks before merging.
Frequent rebases Encourage developers to rebase onto main daily.
Lock version files Use a dedicated bump-version bot that opens PRs for version changes.
File‑level ownership Configure CODEOWNERS so only owners can modify high‑risk files.

6. Real‑World Tooling

If you need a ready‑made script that integrates conflict detection, auto‑resolution, and reporting, Download the pre‑configured script here: https://gaba-101010.github.io/GG/.

Alternatively, you can Get the complete patch tool from the same location, or Access the full repository fix to adapt it to your workflow.


Conclusion

By adding a quick conflict‑check job, automating safe resolutions, and enforcing protective branch policies, you can keep your CI/CD pipelines green and your developers productive. Start integrating these steps today and watch your build reliability improve dramatically.

Top comments (0)