Skip to content

Resolve a vault-sync conflict copy

This guide recovers work after bob vault-sync auto-resolved a supported conflict. Remote content wins in the live note. The previous local bytes are saved under _conflicts/, and _conflicts/sync_conflicts.md logs the event. A halted merge is a different failure: the command stopped before changing the vault again.

Before you start

Set BOB_DIR to the vault. Have git and a pager or diff tool. Do not run git reset --hard or force-push.

1. Distinguish a conflict copy from a halted merge

export BOB_DIR=/path/to/vault
bob vault-sync status

If conflicts: lists vault-relative paths, continue below. If last_error starts with halted: and halted_merge_head is a SHA, skip to Halted merge. Confirm there are no leftover conflict markers in the live tree:

git -C "$BOB_DIR" status --short
rg -n '<<<<<<<|=======|>>>>>>>' "$BOB_DIR"

An empty rg result is the expected live tree after a supported auto-resolve.

2. Compare the saved copy with the current note

Open the live note and the matching file under _conflicts/. The log _conflicts/sync_conflicts.md names both paths. Copy any local edits you still want into the live note. Conflict copies are committed so they reach the other machines; they stay out of dashboards because _conflicts/ is excluded from Bob's walkers.

3. Verify and sync

rg -n '<<<<<<<|=======|>>>>>>>' "$BOB_DIR"
bob vault-sync run --dry-run
bob vault-sync
bob vault-sync status

Confirm no conflict markers remain, the dry run exits 0, and last_error: none. Reload Obsidian on each machine after the push lands.

Halted merge

A halted cycle found the same interrupted merge after it had already aborted and retried once. Later cycles keep halting until you finish or abort that merge by hand:

git -C "$BOB_DIR" status

Finish it with git add on the resolved paths and git commit --no-edit, or discard it with git merge --abort. A later successful bob vault-sync clears the halt fields. Full recovery notes are in Halted sync.

If it goes wrong

Unhandled conflicts abort the merge and set last_error. Inspect git status, keep the wanted bytes, and follow the halted-merge steps. Never use reset --hard, force-push, or -X ours / -X theirs to clear the vault.

Tested rolling snapshot bob-cli 41afa14 bob-mac-capture 556bb67 bob-plugins af1e691 Built 2026-10-24T22:34:13Z (zensical) build.json