diff --git a/src/land/engine/ArcanistGitLandEngine.php b/src/land/engine/ArcanistGitLandEngine.php
--- a/src/land/engine/ArcanistGitLandEngine.php
+++ b/src/land/engine/ArcanistGitLandEngine.php
@@ -885,7 +885,7 @@
     );
   }
 
-  protected function didHoldChanges($into_commit) {
+  protected function didHoldChanges($into_commit, $branch_pruned) {
     $log = $this->getLogEngine();
     $local_state = $this->getLocalState();
 
@@ -916,6 +916,12 @@
       pht('To push changes manually, run this command:'),
       $push_command);
 
+    if ($branch_pruned) {
+      // If the answered the prompt to still prune branches when using --hold
+      // there's no restore possible.
+      return;
+    }
+
     $restore_commands = $local_state->getRestoreCommandsForDisplay();
     if ($restore_commands) {
       echo tsprintf(
diff --git a/src/land/engine/ArcanistLandEngine.php b/src/land/engine/ArcanistLandEngine.php
--- a/src/land/engine/ArcanistLandEngine.php
+++ b/src/land/engine/ArcanistLandEngine.php
@@ -1225,6 +1225,18 @@
     $is_hold = $this->getShouldHold();
     $is_keep = $this->getShouldKeep();
 
+    $should_prune_after_hold = false;
+    if ($is_hold && !$is_keep) {
+      $query = pht('Prune merged branches after holding?');
+      $prompt = $this->getWorkflow()
+        ->getPrompt('arc.land.prune-after-hold')
+        ->setQuery($query)
+        ->setAbortsWorkflow(false);
+
+      $prompt->execute();
+      $should_prune_after_hold = $prompt->getResult();
+    }
+
     $local_state = $api->newLocalState()
       ->setWorkflow($workflow)
       ->saveLocalState();
@@ -1238,6 +1250,8 @@
       $need_cascade = array();
       $need_prune = array();
 
+      $branch_pruned = false;
+
       foreach ($sets as $set_key => $set) {
         // Add these first, so we don't add them multiple times if we need
         // to retry a push.
@@ -1248,13 +1262,16 @@
           $into_commit = $this->executeMerge($set, $into_commit);
           $this->setHasUnpushedChanges(true);
 
+          $is_last = ($set_key === $last_key);
           if ($is_hold) {
             $should_push = false;
+            $should_cascade_and_prune = $should_prune_after_hold && $is_last;
           } else if ($is_incremental) {
             $should_push = true;
+            $should_cascade_and_prune = true;
           } else {
-            $is_last = ($set_key === $last_key);
             $should_push = $is_last;
+            $should_cascade_and_prune = $should_push;
           }
 
           if ($should_push) {
@@ -1285,7 +1302,9 @@
               throw new PhutilArgumentUsageException(
                 $ex->getMessage());
             }
+          }
 
+          if ($should_cascade_and_prune) {
             if ($need_cascade) {
 
               // NOTE: We cascade each set we've pushed, but we're going to
@@ -1303,6 +1322,7 @@
             if (!$is_keep) {
               $this->pruneBranches($need_prune);
               $need_prune = array();
+              $branch_pruned = true;
             }
           }
 
@@ -1311,7 +1331,7 @@
       }
 
       if ($is_hold) {
-        $this->didHoldChanges($into_commit);
+        $this->didHoldChanges($into_commit, $branch_pruned);
         $local_state->discardLocalState();
       } else {
         // TODO: Restore this.
@@ -1421,7 +1441,7 @@
     $into_commit,
     ArcanistRepositoryLocalState $state);
 
-  abstract protected function didHoldChanges($into_commit);
+  abstract protected function didHoldChanges($into_commit, $branch_pruned);
 
   private function selectMergeStrategy() {
     $log = $this->getLogEngine();
diff --git a/src/land/engine/ArcanistMercurialLandEngine.php b/src/land/engine/ArcanistMercurialLandEngine.php
--- a/src/land/engine/ArcanistMercurialLandEngine.php
+++ b/src/land/engine/ArcanistMercurialLandEngine.php
@@ -1240,7 +1240,7 @@
     $state->discardLocalState();
   }
 
-  protected function didHoldChanges($into_commit) {
+  protected function didHoldChanges($into_commit, $branch_pruned) {
     $log = $this->getLogEngine();
     $local_state = $this->getLocalState();
 
@@ -1267,6 +1267,12 @@
 
     echo tsprintf("\n");
 
+    if ($branch_pruned) {
+      // If the answered the prompt to still prune branches when using --hold
+      // there's no restore possible.
+      return;
+    }
+
     $restore_commands = $local_state->getRestoreCommandsForDisplay();
     if ($restore_commands) {
       echo tsprintf(
diff --git a/src/toolset/ArcanistPrompt.php b/src/toolset/ArcanistPrompt.php
--- a/src/toolset/ArcanistPrompt.php
+++ b/src/toolset/ArcanistPrompt.php
@@ -7,6 +7,9 @@
   private $workflow;
   private $description;
   private $query;
+  private $abortsWorkflow;
+
+  private $result;
 
   public function setKey($key) {
     $this->key = $key;
@@ -44,6 +47,19 @@
     return $this->query;
   }
 
+  public function setAbortsWorkflow($aborts_workflow) {
+    $this->abortsWorkflow = $aborts_workflow;
+    return $this;
+  }
+
+  public function getAbortsWorkflow() {
+    return $this->abortsWorkflow;
+  }
+
+  public function getResult() {
+    return $this->result;
+  }
+
   public function execute() {
     $workflow = $this->getWorkflow();
     if ($workflow) {
@@ -248,7 +264,9 @@
           $this->getKey()));
     }
 
-    if (!$result) {
+    $this->result = $result;
+    $allow_abort = $this->abortsWorkflow === null || $this->abortsWorkflow;
+    if ($allow_abort && !$result) {
       throw new ArcanistUserAbortException();
     }
   }
diff --git a/src/workflow/ArcanistLandWorkflow.php b/src/workflow/ArcanistLandWorkflow.php
--- a/src/workflow/ArcanistLandWorkflow.php
+++ b/src/workflow/ArcanistLandWorkflow.php
@@ -285,6 +285,11 @@
           pht(
             'Confirms that new branches or bookmarks should be created '.
             'in the remote.')),
+      $this->newPrompt('arc.land.prune-after-hold')
+        ->setDescription(
+          pht(
+            'Confirms that branches or bookmarks should be pruned after they '.
+            'are merged when using `--hold`.')),
     );
   }