How to git reset --hard a subdirectory
Interview Questions practice on Codemia
Over 8,000 real interview questions from top companies, searchable by company and role.
Introduction
Git does not support git reset --hard on only a subdirectory in exactly the same way as full-tree reset semantics. However, you can restore a directory to a commit or to HEAD using checkout/restore commands. The goal is to discard local changes for a path while leaving other paths untouched. Understanding the modern command equivalents prevents accidental repository-wide data loss.
Core Sections
Reset a directory to current HEAD
If you want to discard unstaged/staged changes under one directory:
Older equivalent:
Reset a directory to a specific commit
Or with older syntax:
Then commit if you want this restored state recorded.
Remove untracked files in subdirectory
Restore commands do not delete untracked files. Use clean carefully:
Run -n first to preview deletions.
Verify before destructive operations
Inspect differences first:
This avoids wiping unexpected local work.
Use stashes for safety
Before resetting, stash or commit temporary state if unsure.
Common Pitfalls
- Running
git reset --hardat repo root when only one subdirectory should change. - Assuming restore removes untracked files automatically.
- Forgetting staged changes need explicit restore from index and worktree.
- Using old checkout syntax without understanding source/target semantics.
- Skipping dry-run checks before
git cleanoperations.
Implementation Playbook
To make this technique dependable in production, treat implementation as a repeatable operating pattern rather than a one-time code change. Start by defining a baseline with known inputs, expected outputs, and measurable latency or resource behavior. Baselines are essential because many failures emerge after environment drift, dependency upgrades, or infrastructure changes that do not touch your business logic directly. With a baseline, you can quickly identify whether a regression came from code, configuration, or platform behavior.
Next, build a compact validation matrix that exercises three categories: normal behavior, edge cases, and explicit failure modes. Keep tests deterministic and cheap enough to run in local development and CI. If your flow depends on external services, include contract fixtures or mocks for fast checks and reserve a smaller set of integration tests for environment verification. Pair correctness checks with observability: log correlation identifiers, branch decisions, and output status in structured form so incidents can be diagnosed without guesswork.
Before rollout, define operational controls up front. Specify timeout values, retry policy, fallback behavior, and rollback triggers. Roll out incrementally instead of changing multiple risk dimensions at once. A staged rollout reduces blast radius and makes it easier to attribute behavior changes to one cause. Capture final operating assumptions in a short runbook: prerequisites, compatibility constraints, known warning signs, and first-response actions. This prevents repeated rediscovery and improves handoff quality across teams.
Use this execution checklist every time you modify this part of the system:
Final Deployment Note
Before rollout, execute one final smoke test in an environment that matches production topology as closely as possible. Validate not only functional output but also observability signals such as logs, metrics, and error counters so silent regressions are visible immediately. If behavior differs from baseline, revert quickly and compare dependency versions, environment variables, and infrastructure assumptions before retrying. A short, repeatable pre-release check usually saves far more incident time than it costs during delivery.
Summary
You cannot directly hard-reset only a subdirectory with classic reset semantics, but git restore and path-scoped checkout commands achieve the practical outcome safely. Verify scope first, then restore and clean selectively.
Related reading
- How to Git stash pop specific stash in 1.8.3?
- How to .gitignore all files/folder in a folder, but not the folder itself?
- How to .gitignore all files/folder in a folder, but not the folder itself?
- How to give user level access to private GitLab repository?
- How to grep search through committed code in the Git history
- How to handle error and don't commit when use Kafka Streams DSL
- How to handle git gc fatal bad object refs/remotes/origin/HEAD error?
- How to hard delete an orphan commit in git?
.png&w=3840&q=75)
Tackling System Design Interview Problems
A short course that equips you with the skills to approach system design interviews methodically.
Start the free courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
Interview Questions practice on Codemia
Over 8,000 real interview questions from top companies, searchable by company and role.