diff --git a/cli/src/cli_util.rs b/cli/src/cli_util.rs
index 48d5874756..6ddfd9720d 100644
--- a/cli/src/cli_util.rs
+++ b/cli/src/cli_util.rs
@@ -1907,6 +1907,23 @@ fn resolve_single_op(
     Ok(operation)
 }
 
+/// Resolves revsets into revisions for use; useful for rebases or operations
+/// that take multiple parents.
+pub fn resolve_all_revs(
+    workspace_command: &WorkspaceCommandHelper,
+    ui: &mut Ui,
+    revisions: &[RevisionArg],
+) -> Result<IndexSet<Commit>, CommandError> {
+    let commits =
+        resolve_multiple_nonempty_revsets_default_single(workspace_command, ui, revisions)?;
+    let root_commit_id = workspace_command.repo().store().root_commit_id();
+    if commits.len() >= 2 && commits.iter().any(|c| c.id() == root_commit_id) {
+        Err(user_error("Cannot merge with root revision"))
+    } else {
+        Ok(commits)
+    }
+}
+
 fn find_all_operations(
     op_store: &Arc<dyn OpStore>,
     op_heads_store: &Arc<dyn OpHeadsStore>,
diff --git a/cli/src/commands/new.rs b/cli/src/commands/new.rs
index 91801dca20..49d187a879 100644
--- a/cli/src/commands/new.rs
+++ b/cli/src/commands/new.rs
@@ -25,7 +25,6 @@ use tracing::instrument;
 use crate::cli_util::{
     self, short_commit_hash, user_error, CommandError, CommandHelper, RevisionArg,
 };
-use crate::commands::rebase::resolve_destination_revs;
 use crate::ui::Ui;
 
 /// Create a new, empty change and edit it in the working copy
@@ -76,7 +75,7 @@ Please use `jj new 'all:x|y'` instead of `jj new --allow-large-revsets x y`.",
         !args.revisions.is_empty(),
         "expected a non-empty list from clap"
     );
-    let target_commits = resolve_destination_revs(&workspace_command, ui, &args.revisions)?
+    let target_commits = cli_util::resolve_all_revs(&workspace_command, ui, &args.revisions)?
         .into_iter()
         .collect_vec();
     let target_ids = target_commits.iter().map(|c| c.id().clone()).collect_vec();
diff --git a/cli/src/commands/rebase.rs b/cli/src/commands/rebase.rs
index 5e9e45454f..6cfbfe8beb 100644
--- a/cli/src/commands/rebase.rs
+++ b/cli/src/commands/rebase.rs
@@ -27,8 +27,8 @@ use jj_lib::settings::UserSettings;
 use tracing::instrument;
 
 use crate::cli_util::{
-    resolve_multiple_nonempty_revsets_default_single, short_commit_hash, user_error, CommandError,
-    CommandHelper, RevisionArg, WorkspaceCommandHelper,
+    self, resolve_multiple_nonempty_revsets_default_single, short_commit_hash, user_error,
+    CommandError, CommandHelper, RevisionArg, WorkspaceCommandHelper,
 };
 use crate::ui::Ui;
 
@@ -161,7 +161,7 @@ Please use `jj rebase -d 'all:x|y'` instead of `jj rebase --allow-large-revsets
         ));
     }
     let mut workspace_command = command.workspace_helper(ui)?;
-    let new_parents = resolve_destination_revs(&workspace_command, ui, &args.destination)?
+    let new_parents = cli_util::resolve_all_revs(&workspace_command, ui, &args.destination)?
         .into_iter()
         .collect_vec();
     if let Some(rev_str) = &args.revision {
@@ -390,20 +390,3 @@ fn check_rebase_destinations(
     }
     Ok(())
 }
-
-/// Resolves revsets into revisions to rebase onto. These revisions don't have
-/// to be rewriteable.
-pub(crate) fn resolve_destination_revs(
-    workspace_command: &WorkspaceCommandHelper,
-    ui: &mut Ui,
-    revisions: &[RevisionArg],
-) -> Result<IndexSet<Commit>, CommandError> {
-    let commits =
-        resolve_multiple_nonempty_revsets_default_single(workspace_command, ui, revisions)?;
-    let root_commit_id = workspace_command.repo().store().root_commit_id();
-    if commits.len() >= 2 && commits.iter().any(|c| c.id() == root_commit_id) {
-        Err(user_error("Cannot merge with root revision"))
-    } else {
-        Ok(commits)
-    }
-}
diff --git a/cli/src/commands/workspace.rs b/cli/src/commands/workspace.rs
index 088b11da48..9da722e177 100644
--- a/cli/src/commands/workspace.rs
+++ b/cli/src/commands/workspace.rs
@@ -27,7 +27,7 @@ use jj_lib::workspace::{default_working_copy_initializer, Workspace};
 use tracing::instrument;
 
 use crate::cli_util::{
-    check_stale_working_copy, print_checkout_stats, user_error, CommandError, CommandHelper,
+    self, check_stale_working_copy, print_checkout_stats, user_error, CommandError, CommandHelper,
     RevisionArg, WorkspaceCommandHelper,
 };
 use crate::ui::Ui;
@@ -192,13 +192,9 @@ fn cmd_workspace_add(
             vec![tx.repo().store().root_commit()]
         }
     } else {
-        crate::commands::rebase::resolve_destination_revs(
-            &old_workspace_command,
-            ui,
-            &args.revision,
-        )?
-        .into_iter()
-        .collect_vec()
+        cli_util::resolve_all_revs(&old_workspace_command, ui, &args.revision)?
+            .into_iter()
+            .collect_vec()
     };
 
     let tree = merge_commit_trees(tx.repo(), &parents)?;