diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 7abe9ea1cb653e2d21fd4b857cfa027e2a98a650..c9128ba4ac7f95c136b33a2a87eeb9e42a21e8b3 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -1141,7 +1141,7 @@ bool GitClient::fullySynchronousGit(const QString &workingDirectory,
 
     if (!Utils::SynchronousProcess::readDataFromProcess(process, m_settings.timeoutSeconds * 1000,
                                                         outputText, errorText, true)) {
-        *errorText->append(GitCommand::msgTimeout(m_settings.timeoutSeconds).toLocal8Bit());
+        errorText->append(GitCommand::msgTimeout(m_settings.timeoutSeconds).toLocal8Bit());
         Utils::SynchronousProcess::stopProcess(process);
         return false;
     }
@@ -1254,6 +1254,45 @@ GitClient::StatusResult GitClient::gitStatus(const QString &workingDirectory,
     return StatusChanged;
 }
 
+void GitClient::launchGitK(const QString &workingDirectory)
+{
+    VCSBase::VCSBaseOutputWindow *outwin = VCSBase::VCSBaseOutputWindow::instance();
+    // Locate git in (potentially) custom path. m_binaryPath can be absolute,
+    // which will be handled correctly.
+    QTC_ASSERT(!m_binaryPath.isEmpty(), return);
+    const QString gitBinary = QLatin1String(Constants::GIT_BINARY);
+    const QProcessEnvironment env = processEnvironment();
+    const QString path = env.value(QLatin1String("PATH"));
+    const QString fullGitBinary = Utils::SynchronousProcess::locateBinary(path, m_binaryPath);
+    if (fullGitBinary.isEmpty()) {
+        outwin->appendError(tr("Cannot locate %1.").arg(gitBinary));
+        return;
+    }
+    const QString gitBinDirectory = QFileInfo(fullGitBinary).absolutePath();
+#ifdef Q_OS_WIN
+    // Launch 'wish' shell from git binary directory with the gitk located there
+    const QString binary = gitBinDirectory + QLatin1String("/wish");
+    const QStringList arguments(gitBinDirectory + QLatin1String("/gitk"));
+#else
+    // Simple: Run gitk from binary path
+    const QString binary = gitBinDirectory + QLatin1String("/gitk");
+    const QStringList arguments;
+#endif
+    outwin->appendCommand(workingDirectory, binary, arguments);
+    // This should use QProcess::startDetached ideally, but that does not have
+    // an environment parameter.
+    QProcess *process = new QProcess(this);
+    process->setWorkingDirectory(workingDirectory);
+    process->setProcessEnvironment(env);
+    process->start(binary, arguments);
+    if (!process->waitForStarted()) {
+        outwin->appendError(tr("Unable to launch %1.").arg(binary));
+        delete process;
+        return;
+    }
+    connect(process, SIGNAL(finished(int)), process, SLOT(deleteLater()));
+}
+
 bool GitClient::getCommitData(const QString &workingDirectory,
                               QString *commitTemplate,
                               CommitData *d,
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index 21403256d296dfb32188b5792ed17abb8fca88d9..592a6d50ff1932ea94175e5387fb6b318d3d073c 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -203,6 +203,8 @@ public:
                            QString *errorMessage = 0,
                            bool *onBranch = 0);
 
+    void launchGitK(const QString &workingDirectory);
+
     GitSettings  settings() const;
     void setSettings(const GitSettings &s);
 
diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp
index 5b5d09902c44a0821775f07714e5ea8e48c0ff38..119530b8ca86ce6ffaf8845712f3103903a7077d 100644
--- a/src/plugins/git/gitplugin.cpp
+++ b/src/plugins/git/gitplugin.cpp
@@ -416,6 +416,10 @@ bool GitPlugin::initialize(const QStringList &arguments, QString *errorMessage)
                            tr("Clean Repository..."), QLatin1String("Git.CleanRepository"),
                            globalcontext, true, SLOT(cleanRepository()));
 
+    createRepositoryAction(actionManager, gitContainer,
+                           tr("Launch gitk"), QLatin1String("Git.LaunchGitK"),
+                           globalcontext, false, &GitClient::launchGitK);
+
     gitContainer->addAction(createSeparator(actionManager, globalcontext, QLatin1String("Git.Sep.Global"), this));
 
     ActionCommandPair actionCommand =