# Fix: Git Divergent Branches Error > **Error:** `fatal: Need to specify how to reconcile divergent branches.` - - - ## What Does This Error Mean? This error happens when you run `git pull` and Git finds that: - Your **local branch** has commits that the remote doesn't have. - The **remote branch** also has commits that your local branch doesn't have. This means the two branches have "diverged" - they each went in a different direction from a common ancestor. Git doesn't know **which strategy** you want to use to bring them back together, so it stops and asks you. ``` Remote: A - - - B - - - C (origin/develop) \ Local: A - - - B - - - D - - - E (your local develop) ``` In this example, commits `C` are on remote and `D`, `E` are only local - they diverged from `B`. - - - ## The 3 Strategies to Fix It ### Strategy 1: Merge (Recommended for teams) ```bash git pull - - no- rebase ``` Or set it as the default permanently: ```bash git config pull.rebase false git pull ``` **What it does:** Creates a new **merge commit** that combines both branches. ``` Remote: A - - - B - - - C \ Local: A - - - B - - - D - - - E - - - M (merge commit) ``` **Pros:** - Preserves full history exactly as it happened. - Safe and non- destructive - never rewrites commits. - Best for shared/team branches. **Cons:** - Creates an extra merge commit that can clutter history. - - - ### Strategy 2: Rebase (Cleaner linear history) ```bash git pull - - rebase ``` Or set it as the default permanently: ```bash git config pull.rebase true git pull ``` **What it does:** Moves your local commits **on top of** the remote commits, replaying them one by one. ``` Remote: A - - - B - - - C Local: A - - - B - - - C - - - D' - - - E' (D and E replayed on top of C) ``` **Pros:** - Creates a clean, linear history (no merge commits). - Easier to read with `git log`. **Cons:** - Rewrites commit hashes (D becomes D', E becomes E'). - Can cause conflicts that you resolve one- by- one. - **Avoid on shared/public branches** that others are using. - - - ### Strategy 3: Fast- Forward Only (Safest, most restrictive) ```bash git pull - - ff- only ``` Or set it as the default permanently: ```bash git config pull.ff only git pull ``` **What it does:** Only pulls if your local branch has **no new commits** (i.e., it can simply move the pointer forward). If branches have diverged, it **refuses to pull** and exits with an error. **Pros:** - Prevents accidental merges or rebases. - Forces you to explicitly decide how to handle divergence. **Cons:** - Will fail whenever branches diverge - you then have to manually rebase or merge. - - - ## Quick Decision Guide | Situation | Use | |- - - |- - - | | Team/shared branch (like `develop`, `main`) | `- - no- rebase` (merge) | | Personal feature branch, clean history desired | `- - rebase` | | You want Git to fail if branches diverge | `- - ff- only` | | You don't want to think about it ever again | Set a global default (see below) | - - - ## Set a Global Default (Do It Once, Never See This Error Again) Run one of these once to configure Git globally across all your repositories: ```bash # Option A: Always merge on pull (most common for teams) git config - - global pull.rebase false # Option B: Always rebase on pull (clean history preference) git config - - global pull.rebase true # Option C: Only fast- forward, fail if diverged git config - - global pull.ff only ``` - - - ## Step- by- Step: Fix Your Current Situation RIGHT NOW If you just want to fix this immediately on your `develop` branch: ### Option A - Merge approach (safe for team branches) ```bash git pull - - no- rebase origin develop # Resolve any merge conflicts if prompted git push origin develop ``` ### Option B - Rebase approach (clean history) ```bash git pull - - rebase origin develop # Resolve any rebase conflicts if prompted (git add + git rebase - - continue) git push origin develop ``` - - - ## Resolving Conflicts (If They Appear) After pulling, you may see conflict markers in files: ``` <<<<<<< HEAD Your local change ======= Remote change >>>>>>> origin/develop ``` **Steps to resolve:** 1. Open the conflicted file(s) and edit them to keep the correct code. 2. Remove the `<<<<<<<`, `=======`, and `>>>>>>>` markers. 3. Stage the resolved files: ```bash git add <file> ``` 4. Complete the process: - If you used `- - no- rebase`: `git commit` - If you used `- - rebase`: `git rebase - - continue` - - - ## Summary ```bash # QUICKEST FIX (merge, safe for teams): git pull - - no- rebase # SET GLOBAL DEFAULT SO THIS NEVER HAPPENS AGAIN: git config - - global pull.rebase false ``` - - -