Skip to content

Instantly share code, notes, and snippets.

@ffittschen
Last active August 13, 2024 11:39
Show Gist options
  • Save ffittschen/6d9be1720f30eb8dc0142cc0ed91c7d9 to your computer and use it in GitHub Desktop.
Save ffittschen/6d9be1720f30eb8dc0142cc0ed91c7d9 to your computer and use it in GitHub Desktop.
Use IntelliJ or WebStorm as git mergetool with SourceTree

Use IntelliJ or WebStorm as git mergetool

Configure Sourcetree

The merge tool that ships with JetBrain's IntelliJ IDEA or WebStorm is really awesome and way better than FileMerge. It is quite simple to configure SourceTree to use it as the default mergetool:

  1. Open the SourceTree preferences and select the Diff tab

  2. Choose Custom both as Visual Diff Tool and as Merge Tool

  3. Paste the following commands into the textfields:

    • Diff Command: /Applications/IntelliJ\ IDEA.app/Contents/MacOS/idea diff

      • Arguments: $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE")
    • Merge Command: /Applications/IntelliJ\ IDEA.app/Contents/MacOS/idea merge

      • Arguments: $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE") $(cd $(dirname "$BASE") && pwd)/$(basename "$BASE") $(cd $(dirname "$MERGED") && pwd)/$(basename "$MERGED")
  4. Close the settings. Happy merging!

Git in general

To manually change the mergetool for git in general follow these steps:

  1. Open the ~/.gitconfig file with your favorite editor

  2. Add these lines somewhere in the config:

    [merge]
            tool = intellij
    [difftool "intellij"]
            cmd = /Applications/IntelliJ\\ IDEA.app/Contents/MacOS/idea diff $(cd $(dirname \"$LOCAL\") && pwd)/$(basename \"$LOCAL\") $(cd $(dirname \"$REMOTE\") && pwd)/$(basename \"$REMOTE\")
    [mergetool "intellij"]
            cmd = /Applications/IntelliJ\\ IDEA.app/Contents/MacOS/idea merge $(cd $(dirname \"$LOCAL\") && pwd)/$(basename \"$LOCAL\") $(cd $(dirname \"$REMOTE\") && pwd)/$(basename \"$REMOTE\") $(cd $(dirname \"$BASE\") && pwd)/$(basename \"$BASE\") $(cd $(dirname \"$MERGED\") && pwd)/$(basename \"$MERGED\")
            trustExitCode = true
    

Downsides

It takes a few more seconds to launch the IntelliJ merge tool than to launch FileMerge, but it is definitely worth waiting.

Credits

Based on this article on coderwall: https://coderwall.com/p/gc_hqw/use-intellij-or-webstorm-as-your-git-diff-tool-even-on-windows

@zur4ik
Copy link

zur4ik commented Mar 21, 2023

Who has IDEA installed with Jetbrains Toolbox and using idea command like me, will occur problem when tmp files are removed before idea diff/merge window opens.
In this case --wait or -W flag will be handy, but it will not work util small fix in idea script file:

//script file: /Users/<USER>/Library/Application Support/JetBrains/Toolbox/scripts/idea

for o in "$@"; do
  if [[ "$o" = "--wait" || "$o" = "-w" ]]; then
    wait="-W"
    o="" # "--wait:" >>> CHANGED TO EMPTY ""
  fi
  if [[ "$o" =~ " " ]]; then
    ideargs+=("\"$o\"")
  else
    ideargs+=("$o")
  fi
done

Finally my .gitconfig file looks like:

[difftool]
	prompt=false
[merge]
        tool = intellij
[difftool "intellij"]
        cmd = idea diff $LOCAL $REMOTE --wait
[mergetool "intellij"]
        cmd = idea merge $LOCAL $REMOTE $BASE $MERGED --wait
        trustExitCode = true

And all works as expected 🙂

Credit: https://youtrack.jetbrains.com/issue/IDEA-264471/idea-diff-command-does-not-recognize-wait-argument#focus=Comments-27-4944776.0-0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment