diff --git a/git-mergetool--lib.sh b/git-mergetool--lib.sh
index 542a6a75eb..3964cd8f99 100644
--- a/git-mergetool--lib.sh
+++ b/git-mergetool--lib.sh
@@ -64,6 +64,10 @@ $(list_tool_variants)"
 				fi
 				shown_any=yes
 				printf "%s%s\n" "$per_line_prefix" "$toolname"
+				while IFS= read -r line
+				do
+					printf "%s\t%s\n" "$per_line_prefix" "$line"
+                                done < <(diff_mode && diff_cmd_help "$toolname" || merge_cmd_help "$toolname")
 			fi
 		done
 
@@ -162,10 +166,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 1f2e88777e..aa8fbc0a19 100644
--- a/mergetools/vimdiff
+++ b/mergetools/vimdiff
@@ -428,6 +428,46 @@ diff_cmd () {
 		-c 'wincmd l' -c 'cd $GIT_PREFIX' "$LOCAL" "$REMOTE"
 }
 
+diff_cmd_help() {
+	case "$1" in
+	vimdiff)
+		cat <<-ENDOFMESSAGE
+			Opens vim with two vertical windows: LOCAL changes will be placed in the left
+			window and REMOTE changes in the right one.
+		ENDOFMESSAGE
+		;;
+	vimdiff*)
+		cat <<-ENDOFMESSAGE
+			Same as 'vimdiff'
+		ENDOFMESSAGE
+		;;
+	gvimdiff)
+		cat <<-ENDOFMESSAGE
+			Same as 'vimdiff' but opens 'gvim' instead (which uses a graphical toolkit for
+			opening its own window)
+		ENDOFMESSAGE
+		;;
+	gvimdiff*)
+		cat <<-ENDOFMESSAGE
+			Same as 'gvimdiff'
+		ENDOFMESSAGE
+		;;
+	nvimdiff)
+		cat <<-ENDOFMESSAGE
+			Same as 'vimdiff' but opens 'neovim' instead (which is a fork of the original
+			'vim' 'focused on extensibility and usability' according to their authors)
+		ENDOFMESSAGE
+		;;
+	nvimdiff*)
+		cat <<-ENDOFMESSAGE
+			Same as 'nvimdiff'
+		ENDOFMESSAGE
+		;;
+	esac
+
+	return 0
+}
+
 
 merge_cmd () {
 	layout=$(git config mergetool.$merge_tool.layout)
@@ -503,6 +543,238 @@ merge_cmd () {
 	return "$ret"
 }
 
+merge_cmd_help() {
+	case "$1" in
+	vimdiff)
+		cat <<-ENDOFMESSAGE
+			Opens 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".
+			
+			You can change the windows layout used by vim by setting configuration variable
+			"mergetool.vimdiff.layout" which accepts a string where these 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"
+			
+			Let's see some examples to undertand how it works:
+			
+			  * layout = "(LOCAL | BASE | REMOTE) - MERGED"
+			
+			    This is exactly the same as the default layout we have already seen.
+			
+			  * 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        |                     |
+			           ---------------------------------------------
+
+		ENDOFMESSAGE
+		;;
+	vimdiff1)
+		cat <<-ENDOFMESSAGE
+			Same as 'vimdiff' using this layout: "LOCAL* | REMOTE"
+			
+			This will probably be deprecated in the future. Please use "vimdiff" and
+			manually set the "mergetool.vimdiff.layout" configuration variable instead.
+		ENDOFMESSAGE
+		;;
+	vimdiff2)
+		cat <<-ENDOFMESSAGE
+			Same as 'vimdiff' using this layout: "LOCAL | MERGED | REMOTE"
+			
+			This will probably be deprecated in the future. Please use "vimdiff" and
+			manually set the "mergetool.vimdiff.layout" configuration variable instead.
+		ENDOFMESSAGE
+		;;
+	vimdiff3)
+		cat <<-ENDOFMESSAGE
+			Same as 'vimdiff' using this layout: "MERGED"
+			
+			This will probably be deprecated in the future. Please use "vimdiff" and
+			manually set the "mergetool.vimdiff.layout" configuration variable instead.
+		ENDOFMESSAGE
+		;;
+	gvimdiff)
+		cat <<-ENDOFMESSAGE
+			Same as 'vimdiff' but opens 'gvim' instead (which uses a graphical toolkit for
+			opening its own window).
+			The desired layout can be set with configuration variable
+			"mergetool.gvimdiff.layout"
+		ENDOFMESSAGE
+		;;
+	gvimdiff1)
+		cat <<-ENDOFMESSAGE
+			Same as 'gvimdiff' using this layout: "LOCAL* | REMOTE"
+			
+			This will probably be deprecated in the future. Please use "gvimdiff" and
+			manually set the "mergetool.gvimdiff.layout" configuration variable instead.
+		ENDOFMESSAGE
+		;;
+	gvimdiff2)
+		cat <<-ENDOFMESSAGE
+			Same as 'gvimdiff' using this layout: "LOCAL | MERGED | REMOTE"
+			
+			This will probably be deprecated in the future. Please use "gvimdiff" and
+			manually set the "mergetool.gvimdiff.layout" configuration variable instead.
+		ENDOFMESSAGE
+		;;
+	gvimdiff3)
+		cat <<-ENDOFMESSAGE
+			Same as 'gvimdiff' using this layout: "MERGED"
+			
+			This will probably be deprecated in the future. Please use "gvimdiff" and
+			manually set the "mergetool.gvimdiff.layout" configuration variable instead.
+		ENDOFMESSAGE
+		;;
+	nvimdiff)
+		cat <<-ENDOFMESSAGE
+			Same as 'vimdiff' but opens 'neovim' instead (which is a fork of the original
+			'vim' 'focused on extensibility and usability' according to their authors)
+			The desired layout can be set with configuration variable
+			"mergetool.nvimdiff.layout"
+		ENDOFMESSAGE
+		;;
+	nvimdiff1)
+		cat <<-ENDOFMESSAGE
+			Same as 'nvimdiff' using this layout: "LOCAL* | REMOTE"
+			
+			This will probably be deprecated in the future. Please use "nvimdiff" and
+			manually set the "mergetool.nvimdiff.layout" configuration variable instead.
+		ENDOFMESSAGE
+		;;
+	nvimdiff2)
+		cat <<-ENDOFMESSAGE
+			Same as 'nvimdiff' using this layout: "LOCAL | MERGED | REMOTE"
+			
+			This will probably be deprecated in the future. Please use "nvimdiff" and
+			manually set the "mergetool.nvimdiff.layout" configuration variable instead.
+		ENDOFMESSAGE
+		;;
+	nvimdiff3)
+		cat <<-ENDOFMESSAGE
+			Same as 'nvimdiff' using this layout: "MERGED"
+			
+			This will probably be deprecated in the future. Please use "nvimdiff" and
+			manually set the "mergetool.nvimdiff.layout" configuration variable instead.
+		ENDOFMESSAGE
+		;;
+	esac
+
+	return 0
+}
+
 
 translate_merge_tool_path() {
 	case "$1" in
