diff --git a/src/plugins/git/gerrit/gerritpushdialog.cpp b/src/plugins/git/gerrit/gerritpushdialog.cpp
index 94965e86cbde55c1a5128a08b567d3b3644223cb..823ea98a6c12e1b912b18fc3d927940d2dd4bd81 100644
--- a/src/plugins/git/gerrit/gerritpushdialog.cpp
+++ b/src/plugins/git/gerrit/gerritpushdialog.cpp
@@ -77,13 +77,23 @@ GerritPushDialog::GerritPushDialog(const QString &workingDir, const QString &rev
 
     QString head = QLatin1String("/HEAD");
     QStringList refs = output.split(QLatin1Char('\n'));
+    QString remoteTrackingBranch = gitClient->synchronousTrackingBranch(m_workingDir);
+    QString remoteBranch;
     foreach (const QString &reference, refs) {
-        if (reference.contains(head) || reference.isEmpty())
+        const QString ref = reference.trimmed();
+        if (ref.contains(head) || ref.isEmpty())
             continue;
 
-        m_suggestedRemoteName = reference.left(reference.indexOf(QLatin1Char('/'))).trimmed();
-        m_suggestedRemoteBranch = reference.mid(reference.indexOf(QLatin1Char('/')) + 1).trimmed();
-        break;
+        remoteBranch = ref;
+
+        // Prefer remote tracking branch if it exists and contains the latest remote commit
+        if (ref == remoteTrackingBranch)
+            break;
+    }
+
+    if (!remoteBranch.isEmpty()) {
+        m_suggestedRemoteName = remoteBranch.left(remoteBranch.indexOf(QLatin1Char('/')));
+        m_suggestedRemoteBranch = remoteBranch.mid(remoteBranch.indexOf(QLatin1Char('/')) + 1);
     }
 
     output.clear();
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index ec12c79d97dc47e2e875e6b8621505575ddfa710..ae066f4c8dfab7d5e974b847df36782c4fe9cebb 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -2425,6 +2425,23 @@ void GitClient::synchronousAbortCommand(const QString &workingDir, const QString
         outwin->appendError(commandOutputFromLocal8Bit(stdErr));
 }
 
+QString GitClient::synchronousTrackingBranch(const QString &workingDirectory, const QString &branch)
+{
+    QString remote;
+    QString localBranch = branch.isEmpty() ? synchronousCurrentLocalBranch(workingDirectory) : branch;
+    if (localBranch.isEmpty())
+        return QString();
+    localBranch.prepend(QLatin1String("branch."));
+    remote = readConfigValue(workingDirectory, localBranch + QLatin1String(".remote"));
+    if (remote.isEmpty())
+        return QString();
+    const QString rBranch = readConfigValue(workingDirectory, localBranch + QLatin1String(".merge"))
+            .replace(QLatin1String("refs/heads/"), QString());
+    if (rBranch.isEmpty())
+        return QString();
+    return remote + QLatin1Char('/') + rBranch;
+}
+
 void GitClient::handleMergeConflicts(const QString &workingDir, const QString &commit, const QString &abortCommand)
 {
     QString message = commit.isEmpty() ? tr("Conflicts detected")
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index 10ef91b9f5c66573882f369f135020b3de0b7856..b02ed7cffb364d6f910fa76b2ab157b1ea9194c7 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -240,6 +240,8 @@ public:
     void interactiveRebase(const QString &workingDirectory, const QString &commit,
                            StashGuard &stashGuard, bool fixup);
     void synchronousAbortCommand(const QString &workingDir, const QString &abortCommand);
+    QString synchronousTrackingBranch(const QString &workingDirectory,
+                                      const QString &branch = QString());
 
     // git svn support (asynchronous).
     void synchronousSubversionFetch(const QString &workingDirectory);