{"record":{"id":"6fffe5e54fa0ceb4","repo":"GitoxideLabs/gitoxide","slug":"the-revisions-have-multiple-editable-fork-points","errorCode":null,"errorMessage":"the revisions have multiple editable fork points: {}","messagePattern":"the revisions have multiple editable fork points: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"gix-tix/src/command/rebase.rs","lineNumber":146,"sourceCode":"            match event {\n                Event::Decorations(value) => decorations = value,\n                Event::Commits(commits) => app.extend_commits(commits),\n                Event::HiddenCommits(commits) => app.extend_hidden_commits(commits),\n                Event::Complete(value) => graph = Some(value),\n                Event::VisibleComplete | Event::Cancelled => {}\n            }\n            true\n        },\n    )?;\n    let graph = graph.context(\"history traversal did not produce a graph\")?;\n    crate::update_hidden_branch_updates(&mut app, Some(&graph), &refs);\n    let mut candidates = app.hidden_rebase_candidates();\n    if candidates.len() != 1 {\n        if candidates.is_empty() {\n            anyhow::bail!(\"the hidden and visible revisions have no editable fork point\");\n        }\n        candidates.sort_by_key(|(id, _)| *id);\n        anyhow::bail!(\n            \"the revisions have multiple editable fork points: {}\",\n            candidates\n                .iter()\n                .map(|(id, _)| id.to_string())\n                .collect::<Vec<_>>()\n                .join(\", \")\n        );\n    }\n    let (base, scope) = candidates.pop().context(\"one rebase candidate was expected\")?;\n    let (onto, onto_kind) = if args.update_base {\n        let onto = app\n            .hidden_branch_update(base)\n            .context(\"--update-base found no newer hidden local branch tip for the derived base\")?;\n        (onto, todo::OntoKind::UpdatedBase)\n    } else {\n        (\n            args.onto\n                .as_deref()","sourceCodeStart":128,"sourceCodeEnd":164,"githubUrl":"https://github.com/GitoxideLabs/gitoxide/blob/e73179060badf27222d790981fac3f84c1830a7e/gix-tix/src/command/rebase.rs#L128-L164","documentation":"The counterpart to the zero-candidate case: when `hidden_rebase_candidates()` returns more than one possible fork point, `rebase::prepare` refuses to guess, sorts the candidates by object id for deterministic reporting, and bails listing all of them. The user must narrow the base so exactly one candidate remains.","triggerScenarios":"Rebase prepare where the hidden and visible revisions share several merge-base-like candidates — typically when multiple `-x/--hide` revisions are given and they fork at different points, or criss-cross merge history yields multiple equally valid bases.","commonSituations":"Criss-cross merge topologies from repeated merges between two branches; passing several `-x` revisions from divergent remotes; rebasing a stacked branch whose base history was rewritten inconsistently.","solutions":["Pass a single, specific `-x/--hide` revision naming the exact intended fork point.","Reduce the number of `-x` revisions to the one that is the true base.","Inspect the candidate ids listed in the message with `gix log` to pick the right one.","Rewrite/linearize the criss-cross history first if appropriate."],"exampleFix":"// before\ngix tix rebase todo -x branch-a -x branch-b   # two fork points\n// after\ngix tix rebase todo -x branch-a   # one explicit fork point","handlingStrategy":"try-catch","validationCode":"// Resolve candidate merge bases of the hidden and visible tips first; proceed only when exactly one exists.","typeGuard":null,"tryCatchPattern":"match prepare(repo, &args) { Err(e) if e.to_string().contains(\"multiple editable fork points\") => { let base = parse_first_candidate(&e.to_string()); let mut args2 = args.clone(); args2.hide = vec![base]; prepare(repo, &args2) } other => other }","preventionTips":["Pass exactly one explicit -x fork-point revision for ambiguous topologies.","Detect criss-cross merge histories and specify the base manually.","Parse the candidate list from the error message to disambiguate interactively."],"tags":["git","tix","rebase","fork-point","ambiguity"],"backgroundTag":"ambiguous-identifier","analyzedSha":"e73179060badf27222d790981fac3f84c1830a7e","analyzedAt":"2026-09-08T11:26:50.865Z","contentChangedAt":"2026-09-08T11:26:50.865Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}