nikivdev/code · error
failed to resolve HEAD commit
Error message
failed to resolve HEAD commit
What it means
land_head_to_branch resolves the current HEAD commit via `git rev-parse HEAD` before cherry-picking it onto the target branch. If the git command produces no output, the function throws this error instead of proceeding with an empty SHA.
Source
Thrown at src/git_guard.rs:144
}
fn land_head_to_branch(repo_root: &Path, requested_target: &str) -> Result<()> {
ensure_clean_working_tree_for_land(repo_root)?;
let current = git_capture_in(repo_root, &["rev-parse", "--abbrev-ref", "HEAD"])
.unwrap_or_else(|| "HEAD".to_string());
if current.trim() == "HEAD" {
bail!("HEAD is detached. Run `f git-repair` first.");
}
let current = current.trim().to_string();
let target = resolve_land_target_branch(repo_root, requested_target)?;
if current == target {
println!("Already on {}", target);
return Ok(());
}
let head_sha = git_capture_in(repo_root, &["rev-parse", "HEAD"])
.ok_or_else(|| anyhow::anyhow!("failed to resolve HEAD commit"))?;
git_run_in(repo_root, &["checkout", &target])?;
match git_run_in(repo_root, &["cherry-pick", head_sha.trim()]) {
Ok(_) => {
println!(
"✓ Landed commit {} from {} onto {}",
short_sha(head_sha.trim()),
current,
target
);
Ok(())
}
Err(err) => {
let conflicts = git_unmerged_files(repo_root);
let _ = git_run_in(repo_root, &["cherry-pick", "--abort"]);
let _ = git_run_in(repo_root, &["checkout", ¤t]);
eprintln!(View on GitHub (pinned to a747e741ae)
Solutions
- Make an initial commit first (git commit --allow-empty) so HEAD resolves
- Verify repo_root points at a real git work tree (git -C <root> status)
- Check .git/HEAD and branch refs are not corrupted; run git fsck
- Ensure you're not in a bare repo when a commit is expected
Example fix
// before
let head_sha = git_capture_in(repo_root, &["rev-parse", "HEAD"])
.ok_or_else(|| anyhow::anyhow!("failed to resolve HEAD commit"))?;
// after
if git_capture_in(repo_root, &["rev-parse", "--verify", "HEAD"]).is_none() {
anyhow::bail!("no commits on HEAD; create a commit before landing");
}
let head_sha = git_capture_in(repo_root, &["rev-parse", "HEAD"])
.ok_or_else(|| anyhow::anyhow!("failed to resolve HEAD commit"))?; Defensive patterns
Strategy: validation
Validate before calling
fn has_commits(root: &Path) -> bool {
std::process::Command::new("git").args(["-C"]).arg(root)
.args(["rev-parse", "--verify", "HEAD"])
.output().map(|o| o.status.success()).unwrap_or(false)
} Try / catch
match land_head_to_branch(root, target) {
Err(e) if e.to_string().contains("resolve HEAD") => {
eprintln!("repo has no commits; commit first");
}
other => other?,
} Prevention
- Only run repair/land flows in repos with at least one commit
- Validate repo_root with `git rev-parse --is-inside-work-tree` first
- Check `git fsck` health after crashes
When it happens
Trigger: Running `run_git_repair` land flow in a repository with no commits (unborn HEAD, freshly `git init`), a corrupted HEAD ref, or running outside a valid work tree so git_capture_in returns None.
Common situations: Repo with zero commits, detached/broken .git/HEAD pointing to a missing ref, wrong working directory passed as repo_root.
Related errors
- {} exists but is not a git repo: {}
- Git operation in progress. Run `f git-repair` first.
- jj git export retry loop should always return
- Lin.app is not running
- No branches available to search
AI-assisted analysis of nikivdev/code@a747e741ae (2026-09-01).
Data as JSON: /api/errors/ced0fe7b200b3cc6.
Report an issue: GitHub.