{"record":{"id":"c07438e1352c9c95","repo":"GitoxideLabs/gitoxide","slug":"change-id-change-id-is-no-longer-present-in-the","errorCode":null,"errorMessage":"change ID {change_id} is no longer present in the Tix view","messagePattern":"change ID (.+?) is no longer present in the Tix view","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"gix-tix/src/edit/reword.rs","lineNumber":63,"sourceCode":"    }\n}\n\npub(crate) fn relocate_after_editor(\n    repo: &gix::Repository,\n    revisions: &[std::ffi::OsString],\n    hidden_revisions: &[std::ffi::OsString],\n    change_id: gix::hash::ChangeId,\n) -> Result<(crate::history::HistoryGraph, gix::ObjectId)> {\n    let graph = super::loaded_view_graph_with_hidden(repo, revisions, hidden_revisions)?;\n    let mut matches = Vec::new();\n    for id in graph.stored_commit_ids() {\n        if crate::change_id::for_commit(repo, id)? == change_id {\n            matches.push(id);\n        }\n    }\n    match matches.as_slice() {\n        [target] => Ok((graph, *target)),\n        [] => anyhow::bail!(\"change ID {change_id} is no longer present in the Tix view\"),\n        candidates => {\n            let candidates = candidates\n                .iter()\n                .map(|id| crate::change_id::display_short(repo, *id))\n                .collect::<Result<Vec<_>>>()?\n                .join(\"\\n  \");\n            anyhow::bail!(\"change ID {change_id} is ambiguous in the Tix view; candidates:\\n  {candidates}\")\n        }\n    }\n}\n\n#[tracing::instrument(skip_all, fields(commit_id = %id))]\npub(crate) fn document(repo: &gix::Repository, id: gix::ObjectId) -> Result<(gix::command::Prepare, Vec<u8>)> {\n    document_with_author(repo, id, None)\n}\n\npub(crate) fn document_with_author(\n    repo: &gix::Repository,","sourceCodeStart":45,"sourceCodeEnd":81,"githubUrl":"https://github.com/GitoxideLabs/gitoxide/blob/e73179060badf27222d790981fac3f84c1830a7e/gix-tix/src/edit/reword.rs#L45-L81","documentation":"In `gix-tix`'s reword flow, `relocate_after_editor` maps the change ID recorded before the editor ran back to a commit currently visible in the Tix view. When the mapping walk over commits produces zero matches, the change ID no longer corresponds to any commit that can be relocated onto, so the operation is aborted with this message. This guards against rewriting onto a commit that was concurrently amended, rebased away, or deleted.","triggerScenarios":"Calling `relocate_after_editor` (via `relocates_an_editor_reword_onto_a_concurrent_amend` or `editor_relocation_requires_one_visible_commit` paths) when `crate::change_id::for_commit` never equals the recorded `change_id` for any candidate commit — e.g. the original commit was amended concurrently so its change ID no longer matches, or the commit was dropped/rewritten out of the view.","commonSituations":"A concurrent `amend` rewrote the commit while the external editor was open; a rebase or history rewrite removed the commit between recording the change ID and applying the reword; a stale Tix view/branch state after another tool rewrote history.","solutions":["Re-read the current Tix view (refresh state) and retry the reword against the new commit graph.","Check for concurrent operations (another gix-tix process, an amend) that rewrote the target commit while the editor was open, and re-run after they finish.","Verify the change ID with `crate::change_id::display_short` / inspect recent history to find where the commit went, then re-apply the reword to the correct commit.","If the commit was intentionally dropped, cancel the reword instead of relocating it."],"exampleFix":"// before: assuming the pre-edit change ID is still valid\nlet (graph, target) = relocate_after_editor(repo, change_id)?;\n// after: re-resolve after concurrent rewrites and bail gracefully\nmatch relocate_after_editor(repo, change_id) {\n    Ok((graph, target)) => apply(graph, target),\n    Err(_) => {\n        // refresh view / re-run `gix tix` so change_id maps to the amended commit\n        refresh_view(repo)?;\n        relocate_after_editor(repo, change_id)\n    }\n}","handlingStrategy":"retry","validationCode":"fn change_id_still_visible(repo: &gix::Repository, change_id: &ChangeId) -> bool {\n    crate::change_id::for_commit(repo, head_commit_id(repo)).map(|id| id == *change_id).unwrap_or(false)\n}","typeGuard":null,"tryCatchPattern":"match relocate_after_editor(repo, change_id) {\n    Ok((graph, target)) => proceed(graph, target),\n    Err(e) if e.to_string().contains(\"no longer present\") => refresh_view_and_retry(repo, change_id),\n    Err(e) => return Err(e),\n}","preventionTips":["Do not run concurrent history-rewriting operations (amend/rebase) while an editor-backed reword is in flight.","Refresh the Tix view immediately before starting a reword.","Treat change IDs as volatile across history rewrites and re-resolve them after any rewrite."],"tags":["git","change-id","concurrency","reword","state-conflict"],"backgroundTag":"resource-not-found","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"}