diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
index 85785cd3b69f09f2e6ffa78dac75d68d08e400bd_bWVyY3VyaWFsL2xvY2FscmVwby5weQ==..800e090e9c64a58d6ae312f2d8c2565a605fe322_bWVyY3VyaWFsL2xvY2FscmVwby5weQ== 100644
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -968,6 +968,9 @@
                 _("abandoned transaction found"),
                 hint=_("run 'hg recover' to clean up transaction"))
 
+        # make journal.dirstate contain in-memory changes at this point
+        self.dirstate.write()
+
         idbase = "%.40f#%f" % (random.random(), time.time())
         txnid = 'TXN:' + util.sha1(idbase).hexdigest()
         self.hook('pretxnopen', throw=True, txnname=desc, txnid=txnid)
diff --git a/tests/test-backout.t b/tests/test-backout.t
index 85785cd3b69f09f2e6ffa78dac75d68d08e400bd_dGVzdHMvdGVzdC1iYWNrb3V0LnQ=..800e090e9c64a58d6ae312f2d8c2565a605fe322_dGVzdHMvdGVzdC1iYWNrb3V0LnQ= 100644
--- a/tests/test-backout.t
+++ b/tests/test-backout.t
@@ -130,6 +130,34 @@
   update: (current)
   phases: 4 draft
 
+Test that 'hg rollback' restores dirstate just before opening
+transaction: in-memory dirstate changes should be written into
+'.hg/journal.dirstate' as expected.
+
+  $ echo 'removed soon' > b
+  $ hg commit -A -d '4 0' -m 'prepare for subsequent removing'
+  adding b
+  $ echo 'newly added' > c
+  $ hg add c
+  $ hg remove b
+  $ hg commit -d '5 0' -m 'prepare for subsequent backout'
+  $ touch -t 200001010000 c
+  $ hg status -A
+  C c
+  $ hg debugstate --nodates
+  n 644         12 set                 c
+  $ hg backout -d '6 0' -m 'to be rollback-ed soon' -r .
+  adding b
+  removing c
+  changeset 6:4bfec048029d backs out changeset 5:fac0b729a654
+  $ hg rollback -q
+  $ hg status -A
+  A b
+  R c
+  $ hg debugstate --nodates
+  a   0         -1 unset               b
+  r   0          0 set                 c
+
 across branch
 
   $ cd ..