diff --git a/mercurial/exchange.py b/mercurial/exchange.py
index 41021660baa1bdb3fb089d6ddb6b6658c9e540b1_bWVyY3VyaWFsL2V4Y2hhbmdlLnB5..6063c1857d0a2d4dd985807c31ebf68aeb0bbf38_bWVyY3VyaWFsL2V4Y2hhbmdlLnB5 100644
--- a/mercurial/exchange.py
+++ b/mercurial/exchange.py
@@ -905,8 +905,19 @@
         # if repo.obsstore == False --> no obsolete
         # then, save the iteration
         if unfi.obsstore:
-            obsoletes = []
-            unstables = []
-            for node in outgoing.missing:
+            # this message are here for 80 char limit reason
+            mso = _(b"push includes obsolete changeset: %s!")
+            mspd = _(b"push includes phase-divergent changeset: %s!")
+            mscd = _(b"push includes content-divergent changeset: %s!")
+            mst = {
+                b"orphan": _(b"push includes orphan changeset: %s!"),
+                b"phase-divergent": mspd,
+                b"content-divergent": mscd,
+            }
+            # If we are to push if there is at least one
+            # obsolete or unstable changeset in missing, at
+            # least one of the missinghead will be obsolete or
+            # unstable. So checking heads only is ok
+            for node in outgoing.ancestorsof:
                 ctx = unfi[node]
                 if ctx.obsolete():
@@ -911,4 +922,4 @@
                 ctx = unfi[node]
                 if ctx.obsolete():
-                    obsoletes.append(ctx)
+                    raise error.Abort(mso % ctx)
                 elif ctx.isunstable():
@@ -914,23 +925,7 @@
                 elif ctx.isunstable():
-                    unstables.append(ctx)
-            if obsoletes or unstables:
-                msg = b""
-                if obsoletes:
-                    msg += _(b"push includes obsolete changesets:\n")
-                    msg += b"\n".join(b'  %s' % ctx for ctx in obsoletes)
-                if unstables:
-                    if msg:
-                        msg += b"\n"
-                    msg += _(b"push includes unstable changesets:\n")
-                    msg += b"\n".join(
-                        b'  %s (%s)'
-                        % (
-                            ctx,
-                            b", ".join(_(ins) for ins in ctx.instabilities()),
-                        )
-                        for ctx in unstables
-                    )
-                raise error.Abort(msg)
+                    # TODO print more than one instability in the abort
+                    # message
+                    raise error.Abort(mst[ctx.instabilities()[0]] % ctx)
 
         discovery.checkheads(pushop)
     return True
diff --git a/tests/test-obsolete-divergent.t b/tests/test-obsolete-divergent.t
index 41021660baa1bdb3fb089d6ddb6b6658c9e540b1_dGVzdHMvdGVzdC1vYnNvbGV0ZS1kaXZlcmdlbnQudA==..6063c1857d0a2d4dd985807c31ebf68aeb0bbf38_dGVzdHMvdGVzdC1vYnNvbGV0ZS1kaXZlcmdlbnQudA== 100644
--- a/tests/test-obsolete-divergent.t
+++ b/tests/test-obsolete-divergent.t
@@ -118,9 +118,7 @@
   $ hg push ../other
   pushing to ../other
   searching for changes
-  abort: push includes unstable changesets:
-    82623d38b9ba (content-divergent)
-    392fd25390da (content-divergent)
+  abort: push includes content-divergent changeset: 392fd25390da!
   [255]
 
   $ cd ..
diff --git a/tests/test-obsolete.t b/tests/test-obsolete.t
index 41021660baa1bdb3fb089d6ddb6b6658c9e540b1_dGVzdHMvdGVzdC1vYnNvbGV0ZS50..6063c1857d0a2d4dd985807c31ebf68aeb0bbf38_dGVzdHMvdGVzdC1vYnNvbGV0ZS50 100644
--- a/tests/test-obsolete.t
+++ b/tests/test-obsolete.t
@@ -251,8 +251,7 @@
   $ hg push ../tmpa
   pushing to ../tmpa
   searching for changes
-  abort: push includes unstable changesets:
-    5601fb93a350 (phase-divergent)
+  abort: push includes phase-divergent changeset: 5601fb93a350!
   [255]
 
 Fixing "bumped" situation
@@ -617,8 +616,7 @@
   $ hg push ../tmpc/ -r 'desc("original_d")'
   pushing to ../tmpc/
   searching for changes
-  abort: push includes obsolete changesets:
-    94b33453f93b
+  abort: push includes obsolete changeset: 94b33453f93b!
   [255]
 
 refuse to push unstable changeset
@@ -626,10 +624,7 @@
   $ hg push ../tmpc/
   pushing to ../tmpc/
   searching for changes
-  abort: push includes obsolete changesets:
-    94b33453f93b
-  push includes unstable changesets:
-    cda648ca50f5 (orphan)
+  abort: push includes orphan changeset: cda648ca50f5!
   [255]
 
 with --force it will work anyway
@@ -652,26 +647,6 @@
   no changes found
   [1]
 
-pushing should work even if the outgoing changes contain an unrelated changeset
-(neither obsolete nor unstable) (issue6372)
-
-  $ hg up 1 -q
-  $ hg branch new -q
-  $ mkcommit c
-
-  $ hg push ../tmpc/ --new-branch
-  pushing to ../tmpc/
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files (+1 heads)
-
-make later tests work unmodified
-
-  $ hg --config extensions.strip= strip tip -q
-  $ hg up 5 -q
-
 Test that extinct changeset are properly detected
 
   $ hg log -r 'extinct()'
@@ -1221,14 +1196,6 @@
   phase-divergent: immutable predecessor 245b
   content-divergent: predecessor 245b
 
-  $ hg push  ../tmpf -r 50c51b361e60
-  pushing to ../tmpf
-  searching for changes
-  abort: push includes unstable changesets:
-    50c51b361e60 (orphan, phase-divergent, content-divergent)
-  [255]
-
-
 #if serve
 
   $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log