diff --git a/Documentation/git-difftool--vimdiff.txt b/Documentation/git-difftool--vimdiff.txt
new file mode 100644
index 0000000000..5788f8e149
--- /dev/null
+++ b/Documentation/git-difftool--vimdiff.txt
@@ -0,0 +1,40 @@
+git-mergetool{litdd}vimdiff(1)
+==============================
+
+NAME
+----
+git-difftool--vimdiff - Helper script to run vim as a diff tool
+
+SYNOPSIS
+--------
+[verse]
+'git difftool' --tool=vimdiff ... (rest of 'git difftool' options)
+
+DESCRIPTION
+-----------
+When specifying '--tool=vimdiff' in 'git difftool', git will open vim with a
+with two vertical windows: LOCAL changes will be placed in the left window and
+REMOTE changes in the right one.
+
+           ------------------------------------------
+           |                   |                    |
+           |                   |                    |
+           |                   |                    |
+           |     LOCAL         |    REMOTE          |
+           |                   |                    |
+           |                   |                    |
+           |                   |                    |
+           ------------------------------------------
+
+VARIANTS
+--------
+Instead of '--tool=vimdiff', you can also use these other variants:
+
+  * '--tool=gvimdiff', to open gvim instead of vim.
+
+  * '--tool=nvimdiff', to open nvim ('neovim') instead of vim.
+
+GIT
+---
+Part of the linkgit:git[1] suite
+
diff --git a/Documentation/git-mergetool--vimdiff.txt b/Documentation/git-mergetool--vimdiff.txt
new file mode 100644
index 0000000000..fb69443d3d
--- /dev/null
+++ b/Documentation/git-mergetool--vimdiff.txt
@@ -0,0 +1,195 @@
+git-difftool{litdd}vimdiff(1)
+=============================
+
+NAME
+----
+git-mergetool--vimdiff - Helper script to run vim as a merge tool
+
+SYNOPSIS
+--------
+[verse]
+'git mergetool' --tool=vimdiff ... (rest of 'git mergetool' options)
+
+DESCRIPTION
+-----------
+When specifying '--tool=vimdiff' in 'git mergetool' git will open vim with a 4
+windows layout distributed in the following way:
+
+    ------------------------------------------
+    |             |           |              |
+    |   LOCAL     |   BASE    |   REMOTE     |
+    |             |           |              |
+    ------------------------------------------
+    |                                        |
+    |                MERGED                  |
+    |                                        |
+    ------------------------------------------
+
+"LOCAL", "BASE" and "REMOTE" are read-only buffers showing the contents of the
+conflicting file in a specific git commit ("commit you are merging into",
+"common ancestor commit" and "commit you are merging from" respectively)
+
+"MERGED" is a writable buffer where you have to resolve the conflicts (using the
+other read-only buffers as a reference). Once you are done, save and exit "vim"
+as usual (":wq") or, if you want to abort, exit using ":cq".
+
+LAYOUT CONFIGURATION
+--------------------
+You can change the windows layout used by vim by setting configuration variable
+"mergetool.vimdiff.layout" which accepts a string where the following separators
+have special meaning:
+
+  - "+" is used to "open a new tab"
+  - "," is used to "open a new vertical split"
+  - "/" is used to "open a new horizontal split"
+  - "@" is used to indicate which is the file containing the final version after
+    solving the conflicts. In not present, "MERGED" will be used by default.
+
+The precedence of the operators is this one (you can use parenthesis to change
+it):
+
+    @ > + > / > ,
+
+Let's see some examples to understand how it works:
+
+  * layout = "(LOCAL,BASE,REMOTE)/MERGED"
+
+    This is exactly the same as the default layout we have already seen.
+
+    Note that "/" has precedence over "," and thus the parenthesis are not
+    needed in this case. The next layout definition is equivalent:
+
+        layout = "LOCAL,BASE,REMOTE / MERGED"
+
+  * layout = "LOCAL,MERGED,REMOTE"
+
+    If, for some reason, we are not interested in the "BASE" buffer.
+
+           ------------------------------------------
+           |             |           |              |
+           |             |           |              |
+           |   LOCAL     |   MERGED  |   REMOTE     |
+           |             |           |              |
+           |             |           |              |
+           ------------------------------------------
+
+  * layout = "MERGED"
+
+    Only the "MERGED" buffer will be shown. Note, however, that all the other
+    ones are still loaded in vim, and you can access them with the "buffers"
+    command. 
+
+           ------------------------------------------
+           |                                        |
+           |                                        |
+           |                 MERGED                 |
+           |                                        |
+           |                                        |
+           ------------------------------------------
+
+  * layout = "@LOCAL,REMOTE"
+
+    When "MERGED" is not present in the layout, you must "mark" one of the
+    buffers with an asterisk. That will become the buffer you need to edit and
+    save after resolving the conflicts.
+
+           ------------------------------------------
+           |                   |                    |
+           |                   |                    |
+           |                   |                    |
+           |     LOCAL         |    REMOTE          |
+           |                   |                    |
+           |                   |                    |
+           |                   |                    |
+           ------------------------------------------
+
+  * layout = "LOCAL,BASE,REMOTE / MERGED + BASE,LOCAL + BASE,REMOTE"
+
+    Three tabs will open: the first one is a copy of the default layout, while
+    the other two only show the differences between "BASE" and "LOCAL" and
+    "BASE" and "REMOTE" respectively.
+ 
+           ------------------------------------------
+           | <TAB #1> |  TAB #2  |  TAB #3  |       |
+           ------------------------------------------
+           |             |           |              |
+           |   LOCAL     |   BASE    |   REMOTE     |
+           |             |           |              |
+           ------------------------------------------
+           |                                        |
+           |                MERGED                  |
+           |                                        |
+           ------------------------------------------
+
+           ------------------------------------------
+           |  TAB #1  | <TAB #2> |  TAB #3  |       |
+           ------------------------------------------
+           |                   |                    |
+           |                   |                    |
+           |                   |                    |
+           |     BASE          |    LOCAL           |
+           |                   |                    |
+           |                   |                    |
+           |                   |                    |
+           ------------------------------------------
+
+           ------------------------------------------
+           |  TAB #1  |  TAB #2  | <TAB #3> |       |
+           ------------------------------------------
+           |                   |                    |
+           |                   |                    |
+           |                   |                    |
+           |     BASE          |    REMOTE          |
+           |                   |                    |
+           |                   |                    |
+           |                   |                    |
+           ------------------------------------------
+
+  * layout = "LOCAL,BASE,REMOTE / MERGED + BASE,LOCAL + BASE,REMOTE + (LOCAL/BASE/REMOTE),MERGED"
+
+    Same as the previous example, but adds a fourth tab with the same
+    information as the first tab, with a different layout.
+ 
+           ---------------------------------------------
+           |  TAB #1  |  TAB #2  |  TAB #3  | <TAB #4> |
+           ---------------------------------------------
+           |       LOCAL         |                     |
+           |---------------------|                     |
+           |       BASE          |        MERGED       |
+           |---------------------|                     |
+           |       REMOTE        |                     |
+           ---------------------------------------------
+
+    Note how in the third tab definition we need to use parenthesis to make ","
+    have precedence over "/".
+
+VARIANTS
+--------
+Instead of '--tool=vimdiff', you can also use these other variants:
+
+  * '--tool=gvimdiff', to open gvim instead of vim.
+
+  * '--tool=nvimdiff', to open nvim ('neovim') instead of vim.
+
+When using these variants, in order to specify a custom layout you will have to
+set configuration variables 'mergetool.gvimdiff.layout' and
+'mergetool.nvimdiff.layout' instead of 'mergetool.vimdiff.layout'
+
+In addition, for backwards compatibility with previous git versions, you can
+also append '1', '2' or '3' to either 'vimdiff' or any of the variants (ex:
+'vimdiff3', 'nvimdiff1', etc...) to use a predefined layout.
+In other words, using '--tool=[g,n,]vimdiffx' is the same as using
+'--tool=[g,n,]vimdiff' and setting configuration variable
+'mergetool.[g,n,]vimdiff.layout' to... 
+
+  * x=1 --> "@LOCAL, REMOTE"
+  * x=2 --> "LOCAL, MERGED, REMOTE"
+  * x=3 --> "MERGED"
+
+Example: using '--tool=gvimdiff2' will open 'gvim' with three columns (LOCAL,
+MERGED and REMOTE).
+
+GIT
+---
+Part of the linkgit:git[1] suite
+
diff --git a/git-mergetool--lib.sh b/git-mergetool--lib.sh
index 542a6a75eb..956c276e1d 100644
--- a/git-mergetool--lib.sh
+++ b/git-mergetool--lib.sh
@@ -64,6 +64,12 @@ $(list_tool_variants)"
 				fi
 				shown_any=yes
 				printf "%s%s\n" "$per_line_prefix" "$toolname"
+
+				(diff_mode && diff_cmd_help "$toolname" || merge_cmd_help "$toolname") |
+				while read -r line
+				do
+					printf "%s\t%s\n" "$per_line_prefix" "$line"
+				done
 			fi
 		done
 
@@ -162,10 +168,18 @@ setup_tool () {
 		return 1
 	}
 
+	diff_cmd_help () {
+		return 0
+	}
+
 	merge_cmd () {
 		return 1
 	}
 
+	merge_cmd_help () {
+		return 0
+	}
+
 	hide_resolved_enabled () {
 		return 0
 	}
diff --git a/mergetools/vimdiff b/mergetools/vimdiff
index 5bf77a5388..db6cb75728 100644
--- a/mergetools/vimdiff
+++ b/mergetools/vimdiff
@@ -364,6 +364,12 @@ diff_cmd () {
 }
 
 
+diff_cmd_help() {
+	echo "Run 'man git-difftool--vimdiff' for details"
+	return 0
+}
+
+
 merge_cmd () {
 	layout=$(git config mergetool.$merge_tool.layout)
 
@@ -435,6 +441,12 @@ merge_cmd () {
 }
 
 
+merge_cmd_help() {
+	echo "Run 'man git-mergetool--vimdiff' for details"
+	return 0
+}
+
+
 translate_merge_tool_path() {
 	case "$1" in
 	nvimdiff*)
