Git Safe Recovery Laboratories: ORIG_HEAD, Backup References, and Abortable Operations
Practice safe recovery from destructive local operations using explicit recovery anchors without prematurely introducing reflogs.
Intermediate
Recovery starts with prevention
A safe recovery laboratory is not a promise that Git can magically reconstruct anything. It is a controlled way to practice operations that can change local state while keeping a known reference to the state you may need to return to. The safest first move is to work in a disposable repository and record the exact commit you intend to protect.
git rev-parse HEAD
git status --short
git log --oneline --decorate --graph -5Quick check
Before a destructive local-history experiment, what should you establish first?
You are about to move the branch tip in a disposable repository.You record the current commit ID and/or create an explicit backup reference before changing it.
Lab 1: recover a reset with ORIG_HEAD
Commit-form `git reset` records the branch tip that existed immediately before the reset in `ORIG_HEAD`. This gives a precise recovery point for the reset operation itself. The important boundary is temporal: `ORIG_HEAD` is a recovery aid associated with the operation that just moved the branch tip; do not treat it as a permanent backup name.
before=$(git rev-parse HEAD)
git reset --hard HEAD~1
git rev-parse HEAD
git rev-parse ORIG_HEAD
git reset --hard ORIG_HEAD
git rev-parse HEADQuick check
After `git reset --hard HEAD~1`, what does `ORIG_HEAD` identify for that reset?
HEAD points to the newer commit immediately before reset.After reset, ORIG_HEAD names the pre-reset branch tip.
Quick check
Why is `git reset --hard ORIG_HEAD` useful in this laboratory?
The branch was intentionally moved backward with `reset --hard`.HEAD and tracked local state are restored to the recorded pre-reset commit.
Lab 2: create an explicit backup reference
A named branch can serve as an explicit safety reference before an experiment. `git branch <name>` creates a branch head at the current `HEAD` without switching to it. This is different from teaching branch management as a topic: here the branch is used only as a deliberately named recovery anchor for a destructive laboratory.
git branch safety-before-experiment
git rev-parse safety-before-experiment
git reset --hard HEAD~1
git reset --hard safety-before-experiment
git status --shortQuick check
What does creating `git branch safety-before-experiment` do before the reset?
HEAD identifies the state you want to protect.A named branch reference points at that commit while the current branch remains checked out.
Quick check
After a reset, why is a named backup reference different from relying only on ORIG_HEAD?
You need a deliberate anchor for a multi-step experiment.The backup branch continues to name the protected commit until you move or delete it.
Lab 3: abort an in-progress revert
A revert can enter a conflict-resolution sequence. The official `git revert` documentation provides `--continue`, `--skip`, `--abort`, and `--quit` for sequencer state. In this lab, the goal is not to teach merge-conflict mechanics; it is to practice recognizing an operation-in-progress and using `--abort` to return to the pre-sequence state.
git revert <commit-that-conflicts>
git status
git revert --abort
git status --short
git rev-parse HEADQuick check
What is the purpose of `git revert --abort` in an in-progress conflicting revert?
A revert sequence is in progress and requires resolution or cancellation.The revert sequence is cancelled and the repository returns to its pre-sequence state.
Lab 4: choose the recovery anchor from the state transition
Recovery is easiest when you identify what actually changed. A reset may have moved a branch tip and changed local tracked state. A conflicting revert may have started a sequencer operation. A working-tree mistake may require a known tree or another explicit source. Do not substitute reflog knowledge yet: reflogs are a later curriculum topic. These labs deliberately use recovery information that is already owned by the restore/reset/revert lessons or an explicit branch reference.
git rev-parse HEAD
git rev-parse --verify ORIG_HEAD
git branch --list
git status --short
git log --oneline --decorate --graph -5Quick check
Which recovery strategy best matches a reset that just moved the branch tip and for which the pre-reset tip is in ORIG_HEAD?
A recent reset moved the branch tip.You identify the recorded pre-reset commit before choosing the recovery operation.
Practice what you learned
Use the dedicated Git code-completion exercise for this lesson.
Important boundary: reflog comes later
This laboratory intentionally stops before the dedicated reflog and abandoned-commit recovery lessons. `git reflog` records local reference updates and is a later investigation topic. Here, recovery is practiced from explicit state that is already available: `ORIG_HEAD`, a named backup branch, and the documented revert sequencer abort mechanism. This keeps the curriculum ownership clean and prevents a recovery laboratory from becoming an early reflog lesson.
Official-source boundary
This lesson is based only on the official Git documentation for `git reset`, `git branch`, `git revert`, and the official Git documentation set. The current official documentation baseline is Git 2.56.0. The local verification executable is Git 2.47.3; tests certify only behavior actually observed on that executable and are not presented as proof of untested version-sensitive behavior.
Thanks for your feedback.
Mark this learning resource complete to track your learning progress.