diff --git a/hgext/rebase.py b/hgext/rebase.py
index 231690dba9b4d31b5ad2c93284e454135f2763ca_aGdleHQvcmViYXNlLnB5..b63351f6a246cd8d444ed38641054fefc78bff93_aGdleHQvcmViYXNlLnB5 100644
--- a/hgext/rebase.py
+++ b/hgext/rebase.py
@@ -475,24 +475,12 @@
                 editopt = True
             editor = cmdutil.getcommiteditor(edit=editopt, editform=editform)
             revtoreuse = max(self.state)
-            dsguard = dirstateguard.dirstateguard(repo, 'rebase')
-            try:
-                newnode = concludenode(repo, revtoreuse, p1, self.external,
-                                       commitmsg=commitmsg,
-                                       extrafn=_makeextrafn(self.extrafns),
-                                       editor=editor,
-                                       keepbranches=self.keepbranchesf,
-                                       date=self.date)
-                dsguard.close()
-                release(dsguard)
-            except error.InterventionRequired:
-                dsguard.close()
-                release(dsguard)
-                raise
-            except Exception:
-                release(dsguard)
-                raise
-
+            newnode = concludenode(repo, revtoreuse, p1, self.external,
+                                   commitmsg=commitmsg,
+                                   extrafn=_makeextrafn(self.extrafns),
+                                   editor=editor,
+                                   keepbranches=self.keepbranchesf,
+                                   date=self.date)
             if newnode is None:
                 newrev = self.target
             else:
@@ -734,6 +722,5 @@
                 return retcode
 
         with repo.transaction('rebase') as tr:
-            dsguard = dirstateguard.dirstateguard(repo, 'rebase')
             try:
                 rbsrt._performrebase(tr)
@@ -738,5 +725,3 @@
             try:
                 rbsrt._performrebase(tr)
-                dsguard.close()
-                release(dsguard)
             except error.InterventionRequired:
@@ -742,5 +727,3 @@
             except error.InterventionRequired:
-                dsguard.close()
-                release(dsguard)
                 tr.close()
                 raise
@@ -745,8 +728,5 @@
                 tr.close()
                 raise
-            except Exception:
-                release(dsguard)
-                raise
         rbsrt._finishrebase()
     finally:
         release(lock, wlock)
@@ -874,12 +854,14 @@
     '''Commit the wd changes with parents p1 and p2. Reuse commit info from rev
     but also store useful information in extra.
     Return node of committed revision.'''
-    repo.setparents(repo[p1].node(), repo[p2].node())
-    ctx = repo[rev]
-    if commitmsg is None:
-        commitmsg = ctx.description()
-    keepbranch = keepbranches and repo[p1].branch() != ctx.branch()
-    extra = {'rebase_source': ctx.hex()}
-    if extrafn:
-        extrafn(ctx, extra)
+    dsguard = dirstateguard.dirstateguard(repo, 'rebase')
+    try:
+        repo.setparents(repo[p1].node(), repo[p2].node())
+        ctx = repo[rev]
+        if commitmsg is None:
+            commitmsg = ctx.description()
+        keepbranch = keepbranches and repo[p1].branch() != ctx.branch()
+        extra = {'rebase_source': ctx.hex()}
+        if extrafn:
+            extrafn(ctx, extra)
 
@@ -885,12 +867,12 @@
 
-    targetphase = max(ctx.phase(), phases.draft)
-    overrides = {('phases', 'new-commit'): targetphase}
-    with repo.ui.configoverride(overrides, 'rebase'):
-        if keepbranch:
-            repo.ui.setconfig('ui', 'allowemptycommit', True)
-        # Commit might fail if unresolved files exist
-        if date is None:
-            date = ctx.date()
-        newnode = repo.commit(text=commitmsg, user=ctx.user(),
-                              date=date, extra=extra, editor=editor)
+        targetphase = max(ctx.phase(), phases.draft)
+        overrides = {('phases', 'new-commit'): targetphase}
+        with repo.ui.configoverride(overrides, 'rebase'):
+            if keepbranch:
+                repo.ui.setconfig('ui', 'allowemptycommit', True)
+            # Commit might fail if unresolved files exist
+            if date is None:
+                date = ctx.date()
+            newnode = repo.commit(text=commitmsg, user=ctx.user(),
+                                  date=date, extra=extra, editor=editor)
 
@@ -896,6 +878,9 @@
 
-    repo.dirstate.setbranch(repo[newnode].branch())
-    return newnode
+        repo.dirstate.setbranch(repo[newnode].branch())
+        dsguard.close()
+        return newnode
+    finally:
+        release(dsguard)
 
 def rebasenode(repo, rev, p1, base, state, collapse, target):
     'Rebase a single revision rev on top of p1 using base as merge ancestor'
diff --git a/tests/test-rebase-collapse.t b/tests/test-rebase-collapse.t
index 231690dba9b4d31b5ad2c93284e454135f2763ca_dGVzdHMvdGVzdC1yZWJhc2UtY29sbGFwc2UudA==..b63351f6a246cd8d444ed38641054fefc78bff93_dGVzdHMvdGVzdC1yZWJhc2UtY29sbGFwc2UudA== 100644
--- a/tests/test-rebase-collapse.t
+++ b/tests/test-rebase-collapse.t
@@ -572,8 +572,6 @@
   o  0: 'A'
   
   $ hg rebase --keepbranches --collapse -s 1 -d 3
-  transaction abort!
-  rollback completed
   abort: cannot collapse multiple named branches
   [255]
 
diff --git a/tests/test-rebase-scenario-global.t b/tests/test-rebase-scenario-global.t
index 231690dba9b4d31b5ad2c93284e454135f2763ca_dGVzdHMvdGVzdC1yZWJhc2Utc2NlbmFyaW8tZ2xvYmFsLnQ=..b63351f6a246cd8d444ed38641054fefc78bff93_dGVzdHMvdGVzdC1yZWJhc2Utc2NlbmFyaW8tZ2xvYmFsLnQ= 100644
--- a/tests/test-rebase-scenario-global.t
+++ b/tests/test-rebase-scenario-global.t
@@ -270,8 +270,6 @@
 
   $ hg rebase -s 6 -d 1
   rebasing 6:eea13746799a "G"
-  transaction abort!
-  rollback completed
   abort: cannot use revision 6 as base, result would have 3 parents
   [255]
   $ hg rebase --abort