Debugging git reset with GIT_TRACE logging
When git reset misbehaves, debugging without the right logging feels like stabbing in the dark. Most developers use git log for history, but few know how to capture the internal debug output while running git reset. This output shows exactly what Git is doing with your index, working tree, and HEAD at every step.
Enable Git debug logging with:
GIT_TRACE=1 git reset --hard
This sends detailed trace information to stdout. If you need more depth, add GIT_TRACE_SETUP=1 or GIT_TRACE_PERFORMANCE=1 for setup and performance metrics. For file-level changes:
GIT_TRACE=1 GIT_TRACE_SETUP=1 GIT_TRACE_PERFORMANCE=1 git reset --hard <commit>
Pair this with:
GIT_TRACE_PACK_ACCESS=1
GIT_TRACE_PACKET=1
These are invaluable if your reset interacts with remote objects or you suspect corruption in pack files.
Debug logs are especially powerful when investigating detached HEAD states or unexpected index changes. They reveal the exact commits Git points to before and after the reset. Use them alongside git fsck to validate repository integrity.
For persistent logging, export the variables globally:
export GIT_TRACE=1
export GIT_TRACE_SETUP=1
export GIT_TRACE_PERFORMANCE=1
Every subsequent Git command will produce deep debug output, making root cause analysis repeatable and fast.
Once you understand git reset with full debug logging access, you control every rewrite and discard with precision. No ghosts in the history. No unexplained changes. Just clean, visible operations.
See this workflow live in minutes at hoop.dev — the fastest way to run secure, real-time debug sessions without touching production directly.