A rebase stops at each conflicting commit. The decision per stop: continue with resolved edits, skip (drops that commit's changes), or abort back to where you started. Skipping is the one that silently loses work.
Each of your commits replays onto the new base; overlapping edits pause the rebase. Normal — resolve, stage, continue. The count in status shows how far through you are.
git status ; # edit conflicted files, keeping the correct side(s)
git add <file> && git rebase --continue # repeats for each conflicted commit
git rebase --abort # returns to pre-rebase state, nothing lost
git rebase --skip # DROPS that commit's changes — confirm it's already-merged work, not new work
ORIG_HEAD and reflog have your back: even a botched rebase is recoverable via git reflog — find the pre-rebase state and reset --hard to it. For large divergences: rebase aborts cost nothing. When in doubt mid-rebase, abort and merge instead — a merge conflict resolves once; a rebase resolves once per commit.
The current commit's changes entirely — it's as if that commit never existed in your branch. Legitimate for already-upstream changes; destructive for real work. Read the diff (git diff) before skipping.
Almost never: git reflog records the pre-rebase HEAD. git reset --hard <that-sha> restores you. Verify with git log before panicking — the reflog keeps ~90 days of states.
Our most-documented failures, packaged as ready-to-ship starter kits: Docker, Kubernetes, and Terraform.
Browse the template store →One-time. Yours to modify. Instant download from the NinjaOps template store.