diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index eab02e8c0549110c679a0ce7f1164b48417ea8d1..f74f4d94f15c9709fafcadcfc135112582089abc 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -913,6 +913,25 @@ static inline QStringList statusArguments()
                          << QLatin1String("status");
 }
 
+static inline void msgCannotRun(const QString &message, QString *errorMessage)
+{
+    if (errorMessage)
+        *errorMessage = message;
+    else
+        outputWindow()->appendError(message);
+}
+
+static inline void msgCannotRun(const QStringList &args, const QString &workingDirectory,
+                                const QByteArray &error, QString *errorMessage)
+{
+    const QString message = GitClient::tr("Cannot run \"%1 %2\" in \"%2\": %3")
+            .arg(QLatin1String("git ") + args.join(QLatin1String(" ")),
+                 QDir::toNativeSeparators(workingDirectory),
+                 commandOutputFromLocal8Bit(error));
+
+    msgCannotRun(message, errorMessage);
+}
+
 // ---------------- GitClient
 
 const char *GitClient::stashNamePrefix = "stash@{";
@@ -1535,13 +1554,7 @@ bool GitClient::synchronousCheckout(const QString &workingDirectory,
     const QString output = commandOutputFromLocal8Bit(outputText);
     outputWindow()->append(output);
     if (!rc) {
-        const QString stdErr = commandOutputFromLocal8Bit(errorText);
-        //: Meaning of the arguments: %1: Branch, %2: Repository, %3: Error message
-        const QString msg = tr("Cannot checkout \"%1\" of \"%2\": %3").arg(ref, workingDirectory, stdErr);
-        if (errorMessage)
-            *errorMessage = msg;
-        else
-            outputWindow()->appendError(msg);
+        msgCannotRun(arguments, workingDirectory, errorText, errorMessage);
         return false;
     }
     updateSubmodulesIfNeeded(workingDirectory, true);
@@ -1585,13 +1598,9 @@ bool GitClient::synchronousLog(const QString &workingDirectory, const QStringLis
         else
             *output = commandOutputFromLocal8Bit(outputText);
     } else {
-        const QString errorMessage = tr("Cannot obtain log of \"%1\": %2").
-                                     arg(QDir::toNativeSeparators(workingDirectory),
-                                         commandOutputFromLocal8Bit(errorText));
-        if (errorMessageIn)
-            *errorMessageIn = errorMessage;
-        else
-            outputWindow()->appendError(errorMessage);
+        msgCannotRun(tr("Cannot obtain log of \"%1\": %2")
+                     .arg(QDir::toNativeSeparators(workingDirectory),
+                         commandOutputFromLocal8Bit(errorText)), errorMessageIn);
     }
     return rc;
 }
@@ -1610,10 +1619,9 @@ bool GitClient::synchronousAdd(const QString &workingDirectory,
     arguments.append(files);
     const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText);
     if (!rc) {
-        const QString errorMessage = tr("Cannot add %n file(s) to \"%1\": %2", 0, files.size()).
-                                     arg(QDir::toNativeSeparators(workingDirectory),
-                                     commandOutputFromLocal8Bit(errorText));
-        outputWindow()->appendError(errorMessage);
+        msgCannotRun(tr("Cannot add %n file(s) to \"%1\": %2", 0, files.size())
+                     .arg(QDir::toNativeSeparators(workingDirectory),
+                          commandOutputFromLocal8Bit(errorText)), 0);
     }
     return rc;
 }
@@ -1631,9 +1639,9 @@ bool GitClient::synchronousDelete(const QString &workingDirectory,
     arguments.append(files);
     const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText);
     if (!rc) {
-        const QString errorMessage = tr("Cannot remove %n file(s) from \"%1\": %2", 0, files.size()).
-                                     arg(QDir::toNativeSeparators(workingDirectory), commandOutputFromLocal8Bit(errorText));
-        outputWindow()->appendError(errorMessage);
+        msgCannotRun(tr("Cannot remove %n file(s) from \"%1\": %2", 0, files.size())
+                     .arg(QDir::toNativeSeparators(workingDirectory),
+                          commandOutputFromLocal8Bit(errorText)), 0);
     }
     return rc;
 }
@@ -1650,9 +1658,8 @@ bool GitClient::synchronousMove(const QString &workingDirectory,
     arguments << (to);
     const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText);
     if (!rc) {
-        const QString errorMessage = tr("Cannot move from \"%1\" to \"%2\": %3").
-                                     arg(from, to, commandOutputFromLocal8Bit(errorText));
-        outputWindow()->appendError(errorMessage);
+        msgCannotRun(tr("Cannot move from \"%1\" to \"%2\": %3")
+                     .arg(from, to, commandOutputFromLocal8Bit(errorText)), 0);
     }
     return rc;
 }
@@ -1676,16 +1683,15 @@ bool GitClient::synchronousReset(const QString &workingDirectory,
     // Assume real failure if the output does not contain "foo.cpp modified"
     // or "Unstaged changes after reset" (git 1.7.0).
     if (!rc && (!output.contains(QLatin1String("modified"))
-         && !output.contains(QLatin1String("Unstaged changes after reset")))) {
-        const QString stdErr = commandOutputFromLocal8Bit(errorText);
-        const QString msg = files.isEmpty() ?
-                            tr("Cannot reset \"%1\": %2").arg(QDir::toNativeSeparators(workingDirectory), stdErr) :
-                            tr("Cannot reset %n file(s) in \"%1\": %2", 0, files.size()).
-                            arg(QDir::toNativeSeparators(workingDirectory), stdErr);
-        if (errorMessage)
-            *errorMessage = msg;
-        else
-            outputWindow()->appendError(msg);
+                && !output.contains(QLatin1String("Unstaged changes after reset")))) {
+        if (files.isEmpty()) {
+            msgCannotRun(arguments, workingDirectory, errorText, errorMessage);
+        } else {
+            msgCannotRun(tr("Cannot reset %n file(s) in \"%1\": %2", 0, files.size())
+                         .arg(QDir::toNativeSeparators(workingDirectory),
+                              commandOutputFromLocal8Bit(errorText)),
+                         errorMessage);
+        }
         return false;
     }
     return true;
@@ -1736,12 +1742,10 @@ bool GitClient::synchronousCheckoutFiles(const QString &workingDirectory,
         const QString fileArg = files.join(QLatin1String(", "));
         //: Meaning of the arguments: %1: revision, %2: files, %3: repository,
         //: %4: Error message
-        const QString msg = tr("Cannot checkout \"%1\" of %2 in \"%3\": %4").
-                            arg(revision, fileArg, workingDirectory, commandOutputFromLocal8Bit(errorText));
-        if (errorMessage)
-            *errorMessage = msg;
-        else
-            outputWindow()->appendError(msg);
+        msgCannotRun(tr("Cannot checkout \"%1\" of %2 in \"%3\": %4")
+                     .arg(revision, fileArg, workingDirectory,
+                          commandOutputFromLocal8Bit(errorText)),
+                     errorMessage);
         return false;
     }
     return true;
@@ -1791,12 +1795,7 @@ bool GitClient::synchronousRevListCmd(const QString &workingDirectory, const QSt
 
     const bool rc = fullySynchronousGit(workingDirectory, args, &outputTextData, &errorText);
     if (!rc) {
-        if (errorMessage)
-            *errorMessage = commandOutputFromLocal8Bit(errorText);
-        else
-            outputWindow()->appendError(tr("Cannot execute \"git %1\" in \"%2\": %3").arg(
-                                            args.join(QLatin1String(" ")), workingDirectory,
-                                            commandOutputFromLocal8Bit(errorText)));
+        msgCannotRun(args, workingDirectory, errorText, errorMessage);
         return false;
     }
     *output = commandOutputFromLocal8Bit(outputTextData);
@@ -1874,12 +1873,6 @@ QString GitClient::synchronousCurrentLocalBranch(const QString &workingDirectory
     return QString();
 }
 
-static inline QString msgCannotRun(const QString &command, const QString &workingDirectory, const QString &why)
-{
-    return GitClient::tr("Cannot run \"%1\" in \"%2\": %3")
-        .arg(command, QDir::toNativeSeparators(workingDirectory), why);
-}
-
 bool GitClient::synchronousHeadRefs(const QString &workingDirectory, QStringList *output,
                                     QString *errorMessage)
 {
@@ -1890,12 +1883,7 @@ bool GitClient::synchronousHeadRefs(const QString &workingDirectory, QStringList
     QByteArray errorText;
     const bool rc = fullySynchronousGit(workingDirectory, args, &outputText, &errorText);
     if (!rc) {
-        QString message = msgCannotRun(QLatin1String("git show-ref --head"), workingDirectory, commandOutputFromLocal8Bit(errorText));
-
-        if (errorMessage)
-            *errorMessage = message;
-        else
-            outputWindow()->appendError(message);
+        msgCannotRun(args, workingDirectory, errorText, errorMessage);
         return false;
     }
 
@@ -1982,12 +1970,9 @@ QString GitClient::synchronousTopRevision(const QString &workingDirectory, QStri
     }
     QString revision = commandOutputFromLocal8Bit(outputTextData);
     revision.remove(QLatin1Char('\n'));
-    if (revision.isEmpty() && !errorMessage.isEmpty()) {
-        if (errorMessageIn)
-            *errorMessageIn = errorMessage;
-        else
-            outputWindow()->appendError(errorMessage);
-    }
+    if (revision.isEmpty() && !errorMessage.isEmpty())
+        msgCannotRun(errorMessage, errorMessageIn);
+
     return revision;
 }
 
@@ -2152,17 +2137,10 @@ bool GitClient::executeSynchronousStash(const QString &workingDirectory,
         arguments << QLatin1String("save") << message;
     const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText,
                                         VcsBasePlugin::ExpectRepoChanges);
-    if (!rc) {
-        const QString msg = tr("Cannot stash in \"%1\": %2").
-                            arg(QDir::toNativeSeparators(workingDirectory),
-                                commandOutputFromLocal8Bit(errorText));
-        if (errorMessage)
-            *errorMessage = msg;
-        else
-            outputWindow()->appendError(msg);
-        return false;
-    }
-    return true;
+    if (!rc)
+        msgCannotRun(arguments, workingDirectory, errorText, errorMessage);
+
+    return rc;
 }
 
 // Resolve a stash name from message
@@ -2186,11 +2164,8 @@ bool GitClient::stashNameFromMessage(const QString &workingDirectory,
         }
     }
     //: Look-up of a stash via its descriptive message failed.
-    const QString msg = tr("Cannot resolve stash message \"%1\" in \"%2\".").arg(message, workingDirectory);
-    if (errorMessage)
-        *errorMessage = msg;
-    else
-        outputWindow()->appendError(msg);
+    msgCannotRun(tr("Cannot resolve stash message \"%1\" in \"%2\".")
+                 .arg(message, workingDirectory), errorMessage);
     return  false;
 }
 
@@ -2202,26 +2177,24 @@ bool GitClient::synchronousBranchCmd(const QString &workingDirectory, QStringLis
     QByteArray errorText;
     const bool rc = fullySynchronousGit(workingDirectory, branchArgs, &outputText, &errorText);
     *output = commandOutputFromLocal8Bit(outputText);
-    if (!rc && errorMessage) {
-        *errorMessage = msgCannotRun(QLatin1String("git branch"), workingDirectory,
-                                     commandOutputFromLocal8Bit(errorText));
-    }
+    if (!rc)
+        msgCannotRun(branchArgs, workingDirectory, errorText, errorMessage);
+
     return rc;
 }
 
-bool GitClient::synchronousTagCmd(const QString &workingDirectory, QStringList tagArgs, QString *output, QString *errorMessage)
+bool GitClient::synchronousTagCmd(const QString &workingDirectory, QStringList tagArgs,
+                                  QString *output, QString *errorMessage)
 {
     tagArgs.push_front(QLatin1String("tag"));
     QByteArray outputText;
     QByteArray errorText;
     const bool rc = fullySynchronousGit(workingDirectory, tagArgs, &outputText, &errorText);
     *output = commandOutputFromLocal8Bit(outputText);
-    if (!rc) {
-        *errorMessage = msgCannotRun(QLatin1String("git tag"), workingDirectory,
-                                     commandOutputFromLocal8Bit(errorText));
-        return false;
-    }
-    return true;
+    if (!rc)
+        msgCannotRun(tagArgs, workingDirectory, errorText, errorMessage);
+
+    return rc;
 }
 
 bool GitClient::synchronousForEachRefCmd(const QString &workingDirectory, QStringList args,
@@ -2232,17 +2205,10 @@ bool GitClient::synchronousForEachRefCmd(const QString &workingDirectory, QStrin
     QByteArray errorText;
     const bool rc = fullySynchronousGit(workingDirectory, args, &outputText, &errorText);
     *output = commandOutputFromLocal8Bit(outputText);
-    if (!rc) {
-        QString error = msgCannotRun(QLatin1String("git for-each-ref"), workingDirectory,
-                                     commandOutputFromLocal8Bit(errorText));
-        if (errorMessage)
-            *errorMessage = error;
-        else
-            outputWindow()->appendError(error);
+    if (!rc)
+        msgCannotRun(args, workingDirectory, errorText, errorMessage);
 
-        return false;
-    }
-    return true;
+    return rc;
 }
 
 bool GitClient::synchronousRemoteCmd(const QString &workingDirectory, QStringList remoteArgs,
@@ -2253,7 +2219,7 @@ bool GitClient::synchronousRemoteCmd(const QString &workingDirectory, QStringLis
     QByteArray errorText;
     const bool rc = fullySynchronousGit(workingDirectory, remoteArgs, &outputText, &errorText);
     if (!rc) {
-        *errorMessage = msgCannotRun(QLatin1String("git remote"), workingDirectory, commandOutputFromLocal8Bit(errorText));
+        msgCannotRun(remoteArgs, workingDirectory, errorText, errorMessage);
         return false;
     }
     *output = commandOutputFromLocal8Bit(outputText);
@@ -2268,10 +2234,7 @@ QMap<QString,QString> GitClient::synchronousRemotesList(const QString &workingDi
     QString error;
     QStringList args(QLatin1String("-v"));
     if (!synchronousRemoteCmd(workingDirectory, args, &output, &error)) {
-        if (errorMessage)
-            *errorMessage = error;
-        else
-            outputWindow()->appendError(error);
+        msgCannotRun(error, errorMessage);
         return result;
     }
     QStringList remotes = output.split(QLatin1String("\n"));
@@ -2299,15 +2262,9 @@ QStringList GitClient::synchronousSubmoduleStatus(const QString &workingDirector
     // get submodule status
     arguments << QLatin1String("submodule") << QLatin1String("status");
     if (!fullySynchronousGit(workingDirectory, arguments, &outputTextData, &errorText)) {
-        QString error = tr("Cannot retrieve submodule status of \"%1\": %2")
-                .arg(QDir::toNativeSeparators(workingDirectory),
-                     commandOutputFromLocal8Bit(errorText));
-
-        if (errorMessage)
-            *errorMessage = error;
-        else
-            outputWindow()->appendError(error);
-
+        msgCannotRun(tr("Cannot retrieve submodule status of \"%1\": %2")
+                     .arg(QDir::toNativeSeparators(workingDirectory),
+                          commandOutputFromLocal8Bit(errorText)), errorMessage);
         return QStringList();
     }
     return commandOutputLinesFromLocal8Bit(outputTextData);
@@ -2382,12 +2339,11 @@ bool GitClient::synchronousShow(const QString &workingDirectory, const QString &
     QByteArray outputText;
     QByteArray errorText;
     const bool rc = fullySynchronousGit(workingDirectory, args, &outputText, &errorText);
-    if (!rc) {
-        *errorMessage = msgCannotRun(QLatin1String("git show"), workingDirectory, commandOutputFromLocal8Bit(errorText));
-        return false;
-    }
-    *output = commandOutputFromLocal8Bit(outputText);
-    return true;
+    if (rc)
+        *output = commandOutputFromLocal8Bit(outputText);
+    else
+        msgCannotRun(QStringList(QLatin1String("show")), workingDirectory, errorText, errorMessage);
+    return rc;
 }
 
 // Retrieve list of files to be cleaned
@@ -2399,7 +2355,8 @@ bool GitClient::cleanList(const QString &workingDirectory, const QString &flag,
     QByteArray errorText;
     const bool rc = fullySynchronousGit(workingDirectory, args, &outputText, &errorText);
     if (!rc) {
-        *errorMessage = msgCannotRun(QLatin1String("git clean"), workingDirectory, commandOutputFromLocal8Bit(errorText));
+        msgCannotRun(QStringList(QLatin1String("clean")), workingDirectory,
+                     errorText, errorMessage);
         return false;
     }
     // Filter files that git would remove
@@ -3376,9 +3333,8 @@ bool GitClient::synchronousSetTrackingBranch(const QString &workingDirectory,
         arguments << QLatin1String("--set-upstream") << branch << tracking;
     const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText);
     if (!rc) {
-        const QString errorMessage = tr("Cannot set tracking branch: %1")
-                                     .arg(commandOutputFromLocal8Bit(errorText));
-        outputWindow()->appendError(errorMessage);
+        msgCannotRun(tr("Cannot set tracking branch: %1")
+                     .arg(commandOutputFromLocal8Bit(errorText)), 0);
     }
     return rc;
 }
@@ -3585,24 +3541,14 @@ bool GitClient::synchronousStashRestore(const QString &workingDirectory,
     QByteArray errorText;
     const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText,
                                         VcsBasePlugin::ExpectRepoChanges);
-    if (!rc) {
-        const QString stdErr = commandOutputFromLocal8Bit(errorText);
-        const QString nativeWorkingDir = QDir::toNativeSeparators(workingDirectory);
-        const QString msg = branch.isEmpty() ?
-                            tr("Cannot restore stash \"%1\": %2").
-                            arg(nativeWorkingDir, stdErr) :
-                            tr("Cannot restore stash \"%1\" to branch \"%2\": %3").
-                            arg(nativeWorkingDir, branch, stdErr);
-        if (errorMessage)
-            *errorMessage = msg;
-        else
-            outputWindow()->appendError(msg);
-        return false;
+    if (rc) {
+        const QString output = commandOutputFromLocal8Bit(outputText);
+        if (!output.isEmpty())
+            outputWindow()->append(output);
+    } else {
+        msgCannotRun(arguments, workingDirectory, errorText, errorMessage);
     }
-    QString output = commandOutputFromLocal8Bit(outputText);
-    if (!output.isEmpty())
-        outputWindow()->append(output);
-    return true;
+    return rc;
 }
 
 bool GitClient::synchronousStashRemove(const QString &workingDirectory,
@@ -3617,24 +3563,14 @@ bool GitClient::synchronousStashRemove(const QString &workingDirectory,
     QByteArray outputText;
     QByteArray errorText;
     const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText);
-    if (!rc) {
-        const QString stdErr = commandOutputFromLocal8Bit(errorText);
-        const QString nativeWorkingDir = QDir::toNativeSeparators(workingDirectory);
-        const QString msg = stash.isEmpty() ?
-                            tr("Cannot remove stashes of \"%1\": %2").
-                            arg(nativeWorkingDir, stdErr) :
-                            tr("Cannot remove stash \"%1\" of \"%2\": %3").
-                            arg(stash, nativeWorkingDir, stdErr);
-        if (errorMessage)
-            *errorMessage = msg;
-        else
-            outputWindow()->appendError(msg);
-        return false;
+    if (rc) {
+        const QString output = commandOutputFromLocal8Bit(outputText);
+        if (!output.isEmpty())
+            outputWindow()->append(output);
+    } else {
+        msgCannotRun(arguments, workingDirectory, errorText, errorMessage);
     }
-    QString output = commandOutputFromLocal8Bit(outputText);
-    if (!output.isEmpty())
-        outputWindow()->append(output);
-    return true;
+    return rc;
 }
 
 void GitClient::branchList(const QString &workingDirectory)
@@ -3662,13 +3598,7 @@ bool GitClient::synchronousStashList(const QString &workingDirectory,
     QByteArray errorText;
     const bool rc = fullySynchronousGit(workingDirectory, arguments, &outputText, &errorText);
     if (!rc) {
-        const QString msg = tr("Cannot retrieve stash list of \"%1\": %2").
-                            arg(QDir::toNativeSeparators(workingDirectory),
-                                commandOutputFromLocal8Bit(errorText));
-        if (errorMessage)
-            *errorMessage = msg;
-        else
-            outputWindow()->appendError(msg);
+        msgCannotRun(arguments, workingDirectory, errorText, errorMessage);
         return false;
     }
     Stash stash;
@@ -3794,11 +3724,9 @@ unsigned GitClient::synchronousGitVersion(QString *errorMessage) const
                                         &outputText, &errorText,
                                         VcsBasePlugin::SuppressCommandLogging);
     if (!rc) {
-        const QString msg = tr("Cannot determine git version: %1").arg(commandOutputFromLocal8Bit(errorText));
-        if (errorMessage)
-            *errorMessage = msg;
-        else
-            outputWindow()->appendError(msg);
+        msgCannotRun(tr("Cannot determine Git version: %1")
+                     .arg(commandOutputFromLocal8Bit(errorText)),
+                     errorMessage);
         return 0;
     }
     // cut 'git version 1.6.5.1.sha'