diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index ff2857411a802357c118bf6c1c376a436b8b35ed..4d106e2ebd2af3a7bc3ece6f8966fff352f6ddd2 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -293,6 +293,52 @@ private:
     QStringList m_fileNames;
 };
 
+class ConflictHandler : public QObject
+{
+    Q_OBJECT
+public:
+    ConflictHandler(QObject *parent,
+                    const QString &workingDirectory,
+                    const QString &command)
+        : QObject(parent),
+          m_workingDirectory(workingDirectory),
+          m_command(command)
+    {
+    }
+
+    ~ConflictHandler()
+    {
+        if (m_commit.isEmpty())
+            GitPlugin::instance()->gitVersionControl()->emitRepositoryChanged(m_workingDirectory);
+        else
+            GitPlugin::instance()->gitClient()->handleMergeConflicts(
+                        m_workingDirectory, m_commit, m_command);
+    }
+
+    void readStdOutString(const QString &data)
+    {
+        static QRegExp patchFailedRE(QLatin1String("Patch failed at ([^\\n]*)"));
+        if (patchFailedRE.indexIn(data) != -1)
+            m_commit = patchFailedRE.cap(1);
+    }
+public slots:
+    void readStdOut(const QByteArray &data)
+    {
+        readStdOutString(QString::fromUtf8(data));
+    }
+
+    void readStdErr(const QString &data)
+    {
+        static QRegExp couldNotApplyRE(QLatin1String("[Cc]ould not (?:apply|revert) ([^\\n]*)"));
+        if (couldNotApplyRE.indexIn(data) != -1)
+            m_commit = couldNotApplyRE.cap(1);
+    }
+private:
+    QString m_workingDirectory;
+    QString m_command;
+    QString m_commit;
+};
+
 Core::IEditor *locateEditor(const char *property, const QString &entry)
 {
     foreach (Core::IEditor *ed, Core::ICore::editorManager()->openedEditors())
@@ -2146,20 +2192,14 @@ bool GitClient::executeAndHandleConflicts(const QString &workingDirectory,
     // Disable UNIX terminals to suppress SSH prompting.
     const unsigned flags = VcsBase::VcsBasePlugin::SshPasswordPrompt|VcsBase::VcsBasePlugin::ShowStdOutInLogWindow;
     const Utils::SynchronousProcessResponse resp = synchronousGit(workingDirectory, arguments, flags);
+    ConflictHandler conflictHandler(0, workingDirectory, abortCommand);
     // Notify about changed files or abort the rebase.
     const bool ok = resp.result == Utils::SynchronousProcessResponse::Finished;
     if (ok) {
         GitPlugin::instance()->gitVersionControl()->emitRepositoryChanged(workingDirectory);
-    } else if (resp.stdOut.contains(QLatin1String("CONFLICT"))) {
-        // rebase conflict is output to stdOut
-        QRegExp conflictedCommit(QLatin1String("Patch failed at ([^\\n]*)"));
-        conflictedCommit.indexIn(resp.stdOut);
-        handleMergeConflicts(workingDirectory, conflictedCommit.cap(1), abortCommand);
-    } else if (resp.stdErr.contains(QLatin1String("conflict"))) {
-        // cherry-pick/revert conflict is output to stdErr
-        QRegExp conflictedCommit(QLatin1String("could not (?:apply|revert) ([^\\n]*)"));
-        conflictedCommit.indexIn(resp.stdErr);
-        handleMergeConflicts(workingDirectory, conflictedCommit.cap(1), abortCommand);
+    } else {
+        conflictHandler.readStdOutString(resp.stdOut);
+        conflictHandler.readStdErr(resp.stdErr);
     }
     return ok;
 }