Git Emergency

Duplicated lines of code after a merge

Severity Annoying

What just happened

Git merges line by line, it doesn't understand code. Three classic causes: a conflict resolved by keeping both sides; the same code added in both branches at slightly different places (Git keeps both, without any conflict); or the same change brought twice (cherry-picked, then the whole branch merged).

Potential risks

  • It may build but run twice (an event handler registered twice, a double payment callโ€ฆ).
  • Or break the build with duplicate declarations.

Before you run anything

  • Don't undo the merge blindly: first find which copy is the right one.
  • After every merge, build and run the tests before pushing.
  • Golden rule: before any destructive command, create a safety branch with git branch backup/before-fix โ€” it costs nothing.

Recovery steps

  1. 1

    See exactly what the merge changed

    Right after the merge, ORIG_HEAD is your branch before it. Otherwise compare with the merge commit's first parent (HEAD^1).

    Safe
    $ git diff ORIG_HEAD HEAD -- path/to/file
    # later on:
    $ git diff HEAD^1 HEAD -- path/to/file
  2. 2

    Find who added each copy

    blame on the duplicated lines shows the commit of each copy: you'll know which branch brought which one.

    Safe
    $ git blame -L 10,60 path/to/file
  3. 3

    Look for forgotten conflict markers

    A resolution done too fast often leaves both sides AND the markers.

    Safe
    $ git grep -n -e "<<<<<<<" -e ">>>>>>>"
  4. 4

    Fix it by hand (works pushed or not)

    Remove the wrong copy, build, test, then commit the fix. The safest option in every case.

    Safe
    $ git add path/to/file
    $ git commit -m "fix: remove code duplicated by the merge"
  5. 5

    Not pushed: redo the merge properly

    Cancel the merge, then merge again with a conflict style that shows the original version: much easier to choose.

    Destructive
    $ git reset --hard ORIG_HEAD
    $ git config --global merge.conflictStyle zdiff3
    $ git merge feature/my-branch
  6. 6

    Already pushed and badly broken: revert the merge

    Cancels the whole merge without rewriting history. Merging the branch again later will need a revert of this revert.

    Caution
    $ git revert -m 1 <merge-commit-hash>
    $ git push

These procedures are provided for information only. Read each command and adapt it to your situation before running it. Disclaimer

Other disasters

๐Ÿช“ I deleted my branch๐Ÿšจ I pushed directly to main๐Ÿ’ฅ I ran git reset --hard๐Ÿงจ I overwrote a colleague's commits๐Ÿ”‘ I pushed my .env file to GitHub๐Ÿ”€ I made a bad merge๐Ÿ‘ป I lost uncommitted changes๐ŸŽฏ I committed on the wrong branch๐ŸŽˆ I'm in โ€œdetached HEADโ€ stateโš”๏ธ I'm stuck in a merge conflict๐Ÿšซ My push is rejected (non-fast-forward)๐ŸŒ€ My rebase went wrong๐Ÿ˜ GitHub rejects a file over 100 MB๐Ÿฅธ I committed with the wrong name or email๐Ÿ—‘๏ธ I deleted a file and committed itโช I want to undo my last commitโœ๏ธ I amended a commit that was already pushed๐Ÿงน Too many messy commits to clean up๐Ÿ“ฎ I pushed to the wrong branch๐Ÿงญ I rebased onto the wrong branch๐Ÿ” I need back the changes I reverted๐Ÿ“ฆ git stash pop gave me a conflict๐Ÿ™ˆ I committed a file that should be ignored๐Ÿ”  Git doesn't see my file rename (upper/lower case)๐Ÿงจ I ran git clean -fd by mistake๐Ÿฉป My repository is corrupted๐Ÿ™ƒ I forgot to pull before pushingโž– I added a file I didn't want to (git add)โœ๏ธ I made a typo in a commit messageโœ‚๏ธ My commit does too many things๐Ÿงบ I lost a stash (drop, clear or pop gone wrong)๐Ÿซฅ I pulled and my code disappeared๐Ÿ’ I cherry-picked the wrong commitโ˜๏ธ I deleted a branch on GitHub / GitLab๐Ÿ‘ฅ I pushed with the wrong GitHub account๐Ÿšš The repository was renamed or moved๐Ÿท๏ธ I tagged the wrong commit๐ŸŒŠ Git says every file is modified, but I changed nothing๐Ÿ“ฆ I committed node_modules (or a build folder)๐Ÿ“‚ I ran git init in the wrong folder๐Ÿงจ My pull request has conflictsโณ My pull request is behind main๐Ÿ“ I have to apply review changes to my PR๐Ÿงณ My PR shows commits that aren't mine๐ŸŽฏ I opened my PR against the wrong branch๐Ÿšจ A merged PR broke main๐Ÿšช I closed my PR (or deleted its branch) by mistake๐Ÿ”ด The checks of my PR are failing๐Ÿ˜ My PR is too big to review๐Ÿด My fork is behind the original repository