Pricing
Log in Sign up →
Back to blog

Recovery

What to Do in the First 60 Minutes After Data Loss

A step-by-step emergency guide for developers who just lost data. What to check first, what not to do, and how to recover what you can before it is gone for good.

May 25, 2026 9 min read HXA Labs Research
data-loss recovery git backups emergency
Written for: (select one)

What is data loss recovery?

Data loss recovery is the process of identifying, triaging, and retrieving digital files after they become inaccessible due to hardware failure, software corruption, accidental deletion, or cloud sync conflicts. For developers, data loss recovery focuses on source code repositories and the uncommitted work that exists only on a local machine. The first 60 minutes after discovering data loss are critical because continued disk writes can permanently overwrite recoverable files, and the operating system may reclaim storage blocks at any time. Effective recovery requires a structured approach: stop writing to the affected disk, assess what was actually lost versus what exists on remote repositories or backups, attempt recovery using git plumbing commands and filesystem tools, and document everything for future prevention.

Data loss recovery means getting your work back after something goes wrong. Maybe your computer crashed. Maybe a cloud service scrambled your project files. Maybe you accidentally deleted something important. Whatever happened, this guide is here to help.

You have time.

This guide walks you through it step by step. No terminal commands, no technical jargon. Just clear steps to follow in order.

The first 60 minutes after you notice something is missing are the most important. Not because everything will be gone after that, but because acting calmly and in the right order gives you the best chance of getting your work back.

Data loss recovery is an incident response protocol for retrieving source code and project state after it becomes inaccessible. This guide presents a structured 60-minute framework for triage, assessment, and recovery.

FAILURE TAXONOMY

Root causes fall into four categories: hardware failure (disk death, SSD TRIM, controller failure), software corruption (filesystem inconsistency, interrupted writes), sync-layer interference (iCloud/Dropbox/OneDrive .git corruption), and human error (accidental deletion, destructive git commands). Each category has different recovery surfaces and success probabilities.

Systemic implication: the 60-minute window exists because continued I/O to the affected volume reduces recovery surface area. Every write operation is a potential overwrite of recoverable blocks. The protocol below is sequenced to minimize destructive actions while maximizing information gathering.

Minute 0-5: Stop

You just realized something is gone. Your first instinct is wrong.

Do not write anything to the affected disk. Do not install recovery software onto the drive that lost data. Do not start creating new files in the same directory. Do not run git init to "start fresh." Every byte you write to that disk overwrites a byte that might have been recoverable.

The single most destructive thing you can do after data loss is keep working on the same disk. Deleted files are not immediately erased. The operating system marks their space as available. New writes overwrite that space permanently. Every second you keep writing, your recovery window shrinks.

If you lost data on your primary drive, stop working on that machine. Use a different computer, a phone, a notepad. Write down what you think happened. Write down what you think you lost. Do not touch the affected disk until you have a plan.

If your .git directory is corrupted but still exists, do not delete it. A corrupted .git directory contains more recoverable data than a missing one. Corruption means some objects are damaged. Deletion means all objects are gone.

Take a breath. You have 55 minutes left.

First: breathe. Then stop touching your computer.

Do not keep working on your computer right now.

When you delete a file, your computer does not actually erase it. It just marks that space as "available." If you keep working, saving files, or installing things, your computer will write over that space and the old files will be gone for real.

The most important thing you can do right now is nothing. Do not try to fix it yet. Do not start a new project in the same folder. Just stop.

Your work might still be there.

Grab a phone or a different computer. Write down what you think happened and what you think is missing. We will go through this together, one step at a time. You have 55 minutes.

If your project folder looks broken but still exists, do not delete it. A broken project has more recoverable pieces inside it than an empty folder. Leave it alone for now.

FAILURE PATTERN Continued writes destroy recovery surface

Observable signal: any I/O to the affected volume after loss event. On SSDs with TRIM, the controller may asynchronously zero freed blocks within seconds. On HDDs, the filesystem allocator preferentially reuses recently-freed inodes. Both mechanisms reduce recovery yield as a function of post-event write volume.

Protocol: isolate the affected storage immediately. If the affected volume is a boot disk, power down the machine or switch to a live USB environment. Do not install recovery tools onto the affected volume. Do not initialize new repositories in the affected directory tree.

Systemic implication for agent workspaces: if an automated pipeline writes to the same volume (CI artifacts, build caches, log rotation), those writes are equally destructive. Halt all scheduled jobs that target the affected filesystem before proceeding to triage.

If the .git directory exists but is corrupted, do not remove it. A corrupted object database retains recoverable objects (loose objects, intact pack segments, reflog entries). Deletion converts a partial-recovery scenario into a zero-recovery scenario.

Minute 5-15: Triage what you actually lost

Most developers who think they lost everything actually lost less than they think. Before you panic, check every place your code might still exist.

Check git remotes

If you ever pushed to GitHub, GitLab, Bitbucket, or any other remote, your committed history is safe. The remote has a full copy of every commit you pushed. Your local loss does not affect the remote.

terminal
# If your .git directory still exists, even if corrupted:
git remote -v

# If it outputs something like:
# origin  git@github.com:you/project.git (fetch)
# Your committed work is on the remote. Clone it fresh.

git clone git@github.com:you/project.git project-recovered

What you lost is the gap between your last push and now. That gap is what the next 45 minutes are about.

Check the reflog

Git's reflog records every change to HEAD, even ones that are no longer reachable from any branch. It is the single most powerful recovery tool in git, and most developers do not know it exists.

terminal
# Show the reflog -- every place HEAD has pointed
git reflog

# Output looks like:
# a1b2c3d HEAD@{0}: commit: fix auth bug
# e4f5g6h HEAD@{1}: commit: add login page
# i7j8k9l HEAD@{2}: checkout: moving from main to feature

# To recover a specific commit:
git checkout a1b2c3d
# Or create a branch from it:
git branch recovered-work a1b2c3d

The reflog is local only. It is not pushed to remotes. And it expires after 90 days by default. But right now, in the middle of a data loss event, it is probably your best friend.

Check stashes and local branches

terminal
# List all stashes
git stash list

# List all branches, including ones you forgot about
git branch -a

# Show the last commit on each branch
git branch -v

Stashes are full snapshots of your working directory. If you stashed work-in-progress three days ago and forgot about it, that stash is still there. Each stash is a commit object in git's object database. It survives most forms of corruption.

Check if your work is already safe somewhere. Most people who think they lost everything actually lost much less than they fear.

Check your remote (GitHub, GitLab, etc.)

If you ever uploaded your project to GitHub, GitLab, or any online service, everything you uploaded is still safe there. Your computer problem does not affect the online copy. Log into your account and check if the project is there.

Check your editor's history

Most code editors (VS Code, Cursor, Windsurf) save a local history of every file you edit. Even if the file was deleted, the editor might still have a copy. Open your editor and look for "Local History" or "Timeline" in the sidebar.

Check for saved snapshots

If you ever used the "stash" feature (sometimes your tools do this automatically), your project might have a saved snapshot from a few days ago. Your editor or AI tool may have also created automatic save points you do not know about.

What you actually lost is the gap between the last time your work was saved somewhere safe and right now. That gap is usually smaller than you think.

Triage protocol: enumerate all possible recovery sources before attempting any recovery operation. The goal is to determine the actual blast radius, which is typically smaller than the perceived blast radius.

RECOVERY SOURCE 1 Remote state

Any commits pushed to a remote (GitHub, GitLab, self-hosted) are fully preserved. The remote holds a complete copy of all pushed history. Observable signal: remote URL in .git/config or CI/CD pipeline configuration. Actual loss = delta between last push and incident timestamp.

RECOVERY SOURCE 2 Local object database integrity

The reflog records every HEAD transition, including unreachable commits. Reflog entries survive most corruption scenarios and expire after 90 days by default. Stash entries are commit objects in the object database and survive independently of branch state.

RECOVERY SOURCE 3 Editor-level caching

VS Code, JetBrains, and similar IDEs maintain independent file history outside the git object database. In agent workspaces, check for session artifacts, conversation logs, and generated diff files that may contain recoverable state.

Minute 15-30: Check your backup chain

You need to check every backup system you have, in order. Do not assume any of them worked. Do not assume any of them failed. Check all of them.

Time Machine (macOS)

If you use Time Machine, it may have a copy of your project directory. Open Time Machine and navigate to the project folder. Look for the most recent snapshot that predates the data loss.

Time Machine has a known blind spot. It can skip .git directories in some configurations because they contain large numbers of small files that change frequently. Check whether your Time Machine backup actually contains the .git folder, not just the working tree files. A project directory without .git is a pile of files, not a repository.

Cloud sync services

If your project was in an iCloud Drive, Dropbox, OneDrive, or Google Drive synced folder, check the cloud provider's version history. Most cloud sync services keep 30-90 days of file versions.

  • Dropbox: dropbox.com > file > Version history (keeps 30 days on free, 180 days on paid)
  • iCloud Drive: iCloud.com > Browse > select file > "..." > Browse All Versions
  • OneDrive: onedrive.com > file > Version history
  • Google Drive: drive.google.com > file > Manage versions

But here is the trap: if the data loss was caused by cloud sync corruption, the cloud copy may be corrupted too. Cloud sync services replicate what is on disk. If a service corrupted your .git directory through a sync conflict, it may have synced the corrupted version to the cloud. You might be looking at the same damage in two places.

External drives and other machines

Did you ever clone this repo on a laptop, a second machine, a VM? Did you copy the project to a USB drive three months ago? Check every machine you own. Check old drives. Check that external SSD in your desk drawer.

Any copy of the repo, even an old one, gives you committed history. You can pull the recent work from the remote and merge it with whatever local changes you recover.

Check every place your project might be saved. You might have copies you forgot about.

Time Machine (Mac users)

If you use a Mac, open Time Machine and navigate to your project folder. Look for a version from before the problem happened. It might have a copy of your work.

Cloud sync warning

If iCloud, Dropbox, OneDrive, or Google Drive caused the problem in the first place, the cloud copy might be broken too. These services copy what is on your computer. If the files were already damaged, the cloud version is damaged too.

Check other devices

Did you ever open this project on a laptop, a second computer, or copy it to a USB drive? Even an old copy is useful. Check every device you own. Check that external drive in your drawer.

Any copy of your project, even an old one, gives you a starting point. You only need to redo the work that happened after that copy was made.

Backup chain audit protocol: systematically enumerate all backup sources. Do not assume any source is intact or failed without verification.

FAILURE PATTERN Backup existed but did not capture git metadata

Time Machine on macOS may deprioritize or skip .git directories due to high inode churn. The backup contains working tree files but not the object database, refs, or reflog. A project directory without .git is a file snapshot, not a recoverable repository. Verify the .git subdirectory exists in the backup before counting it as a valid recovery source.

Systemic implication: cloud sync services (iCloud, Dropbox, OneDrive, Google Drive) replicate filesystem state, including corruption. If the root cause is sync-layer interference, the cloud copy contains the same damage. Version history features (30-90 day retention) may allow retrieval of pre-corruption file states, but these operate at file granularity, not repository granularity.

ENUMERATION CHECKLIST

1. Time Machine / system-level snapshots (verify .git inclusion). 2. Cloud provider version history (file-level, not repo-level). 3. Secondary machines, VMs, or containers with cloned copies. 4. External storage media. 5. CI/CD build artifacts that may contain source snapshots. For automated pipelines: check if any agent workspace retains a cached clone or artifact from a recent build.

Minute 30-45: Recovery attempts

If your .git directory exists but is corrupted, git has built-in tools to salvage what it can.

git fsck: check the object database

terminal
# Run a full integrity check of the git object database
git fsck --full --no-dangling

# This will report:
# - missing objects (blobs, trees, commits)
# - corrupt objects (bad checksums)
# - dangling commits (reachable but not on any branch)

# If you see "dangling commit", those are recoverable:
git show <dangling-commit-sha>

git fsck walks the entire object database and reports everything it finds. Dangling commits are commits that exist but are not reachable from any branch or tag. They are often exactly the work you thought you lost.

Check .git/lost-found/

When git recovers unreachable objects during garbage collection, it sometimes places them in .git/lost-found/. This directory is not always present, but when it is, it can contain commit objects and blobs that were orphaned.

terminal
# Check if lost-found exists
ls -la .git/lost-found/

# If it exists, inspect what's there
ls -la .git/lost-found/other/
ls -la .git/lost-found/commit/

# Inspect a recovered commit
git cat-file -p <sha-from-lost-found>

Recover uncommitted work from the index

If you staged files with git add but never committed, those files exist as blob objects in the git object database. They are not reachable from any commit, but they are there.

terminal
# Find all dangling blobs (staged but never committed)
git fsck --lost-found

# This writes recovered blobs to .git/lost-found/other/
# Each file is named by its SHA. You can inspect them:
git cat-file -p <blob-sha>

The recovered blobs will not have filenames. You will need to read the contents and figure out which file each blob belongs to. It is tedious. It is also better than rewriting the code from scratch.

What you cannot recover

Be honest about the limits. If a file was never staged with git add and never committed, git has no record of it. It existed only in the working tree. If the working tree is gone and no backup system captured it, that file is gone. This is the work that falls through every safety net.

If the hardware itself is the problem (a bricked laptop, a dead Mac Mini, a failed SSD, a corrupted flash drive) and nothing software-level is working, consider a professional data recovery service like DriveSavers.

They recovered files from a bricked Mac Mini that no software tool could reach. It is not cheap, but when years of work are on a drive that will not mount, a clean room and specialized equipment may be your only option.

Now let's try to get your work back. Here is what you need to know about what can and cannot be recovered.

Usually recoverable

Anything you saved and uploaded to GitHub or GitLab is safe. Anything your editor auto-saved may still be on your computer. Even some work you thought was lost might be hiding in your project's internal history.

Usually not recoverable

Files you created but never saved to your project's version control and never backed up anywhere. If the file only existed on your computer and is now gone, it may be gone for good. This is the hardest truth about data loss.

If your computer itself is the problem (it will not turn on, the drive is dead), you still have options. Professional data recovery services can sometimes retrieve files from drives that no software can read. It costs money, but when years of work are at stake, it is worth asking.

Ask a developer friend for help

If you have a developer friend, this is a great time to ask them to look at your project folder. There are built-in tools that can find hidden copies of your work, but they require some technical knowledge to use. A knowledgeable friend can run these tools for you in a few minutes.

Recovery protocol: if the .git directory exists (even corrupted), the object database may contain recoverable state.

OBSERVABLE SIGNAL Object database integrity

A filesystem consistency check of the object database identifies missing objects (blobs, trees, commits with invalid checksums) and dangling references (objects present but unreachable from any ref). Dangling commits are frequently the exact work believed to be lost. They exist in the database but are not pointed to by any branch, tag, or reflog entry.

OBSERVABLE SIGNAL Orphaned blobs from staged files

Files staged via the index but never committed exist as blob objects in the object database. They are content-addressed and survive independently of commit graph integrity. Recovery yields blobs without filename metadata, requiring content inspection for reassembly.

Failure boundary: unstaged working tree changes have no representation in the git object database. If the working tree files are gone and no external backup captured them, recovery is impossible at the application layer. This is the fundamental gap that automated backup systems (encrypted git bundles with uncommitted-state capture) exist to close.

For hardware-level failures (dead SSD, unresponsive controller, bricked device), professional data recovery services operate in clean-room environments with specialized equipment. This represents the final recovery layer when software-level approaches are exhausted.

Minute 45-60: Document everything

You have spent 45 minutes recovering what you can. Now, while the pain is fresh, write down what happened.

  • What failed? What caused the data loss? Disk failure? Cloud sync corruption? Accidental deletion? Force push to the wrong branch?
  • What survived? What did your recovery process find? Which commits were on the remote? What did the reflog contain? Did Time Machine have a copy?
  • What was lost for good? What work could not be recovered from any source? How many hours does it represent?
  • What would have saved you? A more recent push? An automated backup? A secondary copy on a different drive? Committing more frequently?

This document is not for anyone else. It is for you, three months from now, when you are deciding whether to set up proper backups and you think "it probably won't happen again."

Every developer who has lost data remembers the exact moment. The ones who set up backups afterward remember it as the last time. The ones who didn't are still counting.

Write down what happened while you still remember. This is not homework. This is a gift to future you.

Answer these four questions

1. What went wrong? (What caused it?)

2. What did I get back? (What was recovered?)

3. What is gone for good? (How much work does that represent?)

4. What would have prevented this? (What will I do differently?)

This is for future you.

Three months from now, you will think about setting up backups and wonder "is it worth the effort?" This note will remind you exactly why the answer is yes.

Post-incident documentation protocol. Capture structured data while context is fresh. This document serves as both a learning artifact and an input for prevention system design.

STRUCTURED FIELDS

Root cause: The specific failure mechanism (hardware, software, sync, human). Include environmental factors (OS version, cloud sync service, filesystem type).

Blast radius: Number of repositories affected, total commits at risk, hours of uncommitted work lost.

Recovery yield: Percentage of data recovered, sources that contributed to recovery, sources that failed.

Prevention gap: The specific control that would have prevented this incident or reduced its blast radius. Map to concrete implementation steps.

Systemic implication: incident documentation feeds prevention engineering. Without structured post-incident data, the same failure patterns recur. In automated environments, this documentation should be machine-readable and feed into CI/CD pipeline configuration and backup verification scheduling.

The grief problem

Data loss is grief. That is not a metaphor. The psychological research is consistent: losing creative work triggers the same emotional response as losing a physical possession. Denial, anger, bargaining, depression, acceptance. Developers who lose a week of uncommitted work cycle through all five, sometimes in the span of an afternoon.

Acknowledge it. You are not being dramatic. You lost real work that took real time and real thought to produce. It is reasonable to be upset.

But do not make recovery decisions while you are in the anger phase. Anger leads to force pushes, rm -rf cleanup attempts, and "I'll just start over from scratch" decisions that destroy whatever was still recoverable. The guide above exists specifically to give you a structured process when your brain wants to thrash.

Follow the steps. Do the boring work. Check every source. Then, and only then, decide what needs to be rebuilt.

It is okay to be upset. This is real loss.

You spent real time and real thought creating that work. Losing it hurts the same way losing any meaningful thing hurts. You are not overreacting. This is a normal response to a real problem.

Do not make big decisions while you are angry.

When you are upset, it is tempting to delete everything and start from scratch. That impulse can destroy work that was still recoverable. Follow the steps in this guide first. Make decisions after you have checked everything.

The boring, step-by-step work protects you.

That is exactly why this guide exists. When your mind wants to panic, the steps give you something calm and structured to follow. Do the boring work. Check every source. Then decide what needs to be rebuilt.

Human factors in incident response. This section addresses the psychological dimension of data loss, which directly affects recovery outcomes.

OBSERVABLE SIGNAL Anger-driven destructive commands

Loss of creative work triggers grief responses (denial, anger, bargaining) that manifest as impulsive technical decisions: force pushes, recursive deletions, "start over" rebuilds. These actions destroy recoverable state. The anger phase is the highest-risk window for secondary data loss.

Mitigation: structured protocols prevent emotional decision-making. The 60-minute framework above serves a dual purpose: it maximizes recovery yield and it occupies the operator with constructive, sequenced tasks during the highest-risk emotional window. For automated pipelines, this translates to mandatory cooling-off periods before destructive operations and confirmation gates on irreversible commands.

Real examples that cost real work

The iCloud .git rename problem

iCloud Drive has a documented behavior where it renames files during sync conflicts by appending a number. A file named HEAD becomes HEAD 2. A pack index file named pack-abc123.idx becomes pack-abc123 2.idx. Git does not recognize renamed internal files. A single renamed file inside .git/ can make the entire repository unreadable.

This is not a bug report from one person. It is a documented, reproducible behavior that affects every git repository stored in an iCloud-synced directory. Git's own FAQ warns against storing repositories in cloud-synced folders for this exact reason.

The GitLab 300 GB incident

In January 2017, a GitLab engineer accidentally deleted 300 GB of live production data from a PostgreSQL primary database. It was not a git data loss, but the pattern is the same. Five backup systems existed. None of them worked correctly at the time of the incident. The LVM snapshots were untested. The regular backups had been silently failing. The one system that saved them was a PostgreSQL replica that happened to be six hours behind.

GitLab livestreamed the recovery on YouTube. They published a full post-mortem. The lesson was not about PostgreSQL. It was about the gap between "we have backups" and "we have tested, verified, working backups." Those are two different sentences with two different outcomes.

Time Machine skipping .git folders

Multiple developers have reported that Time Machine does not consistently back up .git directories. The behavior varies by macOS version and configuration. In some cases, Time Machine treats .git contents as cache-like data and deprioritizes or skips them during backup. In other cases, the high volume of small, frequently-changing files inside .git causes Time Machine to fall behind and never fully capture the directory.

The result is the same: you open Time Machine after a data loss event, navigate to your project folder, and find the source files but no .git directory. You have the code, but you have lost the history, the branches, the stashes, and every commit message. You have a snapshot, not a repository.

The common thread in all three examples: the backup existed, but it did not back up what mattered. Source files without git history. Snapshots without verification. Systems that looked like they were working until the moment you needed them.

These things happen to everyone. Here are three real stories of data loss that affected real people and real companies.

iCloud renamed project files

iCloud sometimes adds numbers to file names when it detects conflicts. A file called "HEAD" becomes "HEAD 2." That tiny rename breaks the entire project because the tools that manage your code do not recognize the renamed files. One small rename, and the whole project becomes unreadable.

GitLab had 5 backups. None worked.

A major company accidentally deleted 300 GB of data. They had five different backup systems. When they needed them, none of them worked correctly. The only thing that saved them was a backup copy that happened to be running six hours behind. The lesson: having backups is not the same as having working backups.

Time Machine skipped the important parts

Many people discovered that Time Machine backed up their code files but skipped the project history. They had their files, but lost all the version history, branches, and saved snapshots. They had a pile of files, not a working project.

The pattern

In all three stories, the backup existed. But it did not back up the right things. Having a backup that does not capture what matters is the same as having no backup at all.

Three failure case studies with structured analysis. Each demonstrates a distinct failure pattern in backup and recovery systems.

CASE STUDY 1 iCloud sync-layer file renaming

Failure pattern: Sync conflict resolution renames internal git files (HEAD to HEAD 2, .idx to 2.idx). Git does not resolve renamed internal files.

Root cause: Cloud sync services treat .git as a regular directory, not a structured database. Conflict resolution logic is file-name-based, not content-aware.

Systemic implication: Any tool that stores state in a directory hierarchy within a sync-monitored path is vulnerable. This includes agent workspace state, local databases, and configuration directories.

CASE STUDY 2 GitLab 300 GB production data loss

Failure pattern: Five backup systems existed. Zero were functional at incident time. LVM snapshots untested. Regular backups silently failing. Recovery via accidental 6-hour-behind replica.

Root cause: Backup existence was assumed to equal backup functionality. No verification protocol was in place.

Systemic implication: Untested backups are assumptions, not controls. Verification must be automated, scheduled, and independently monitored. In CI/CD contexts, backup verification should be a pipeline stage, not a manual process.

CASE STUDY 3 Time Machine .git exclusion

Failure pattern: System backup captures working tree files but excludes .git directory contents. Recovery yields source code without history, branches, stashes, or commit context.

Root cause: Time Machine deprioritizes directories with high inode churn. .git directories contain thousands of small, frequently-changing files that exceed Time Machine's efficient backup threshold.

Systemic implication: General-purpose backup tools are not git-aware. They back up files, not repositories. Git-specific backup requires git-aware tooling that operates at the object database level, not the filesystem level.

After the hour

The first 60 minutes are about salvage. Everything after is about prevention.

Most developers set up real backups in the 48 hours after a data loss event. It is the highest-motivation window you will ever have. Use it.

Whatever system you choose, it needs to pass three tests:

  1. Does it capture git history, not just files? A backup of your source code without the .git directory is a snapshot, not a backup. You lose branches, stashes, reflog, commit history, and every piece of context that makes the code understandable over time.
  2. Can you verify it works without restoring? If you cannot prove a backup is restorable without actually restoring it, you do not know if it works. Untested backups are not backups. They are assumptions.
  3. Does it run without you remembering to run it? Manual backups stop the first week you get busy. Automated backups do not forget.

The hour after data loss is the worst hour. But it is also the hour that decides whether this happens once or whether it happens again.

Now protect yourself so this does not happen again. The next 48 hours are the best time to set up a backup. Your motivation will never be higher than it is right now.

Test 1: Does it save your full project?

A good backup saves everything, not just your code files. It should save your project history, your branches, your saved snapshots. A backup of just the files is like a photocopy of a book. You lose the table of contents, the bookmarks, and the margin notes.

Test 2: Can you prove it works?

A backup you have never tested is a hope, not a safety net. You should be able to verify your backup is working without having to restore it. If you cannot prove it works, it might not.

Test 3: Does it run automatically?

If you have to remember to run your backup, you will forget. The best backup is one that runs by itself, in the background, without you thinking about it. Manual backups always stop the first busy week.

This was the worst hour. But it can also be the last time this happens to you, if you use this moment to set up real protection.

Prevention protocol. The incident response phase is complete. The following criteria define a functional backup system versus an assumed one.

VERIFICATION CRITERION 1 Git-semantic capture

The backup must capture the git object database, not just working tree files. This includes: refs, reflog, pack files, loose objects, stash entries, and index state. A file-level backup without .git metadata yields a snapshot, not a recoverable repository. For automated pipelines, this means backup tooling must be git-aware, operating at the bundle or object-database level.

VERIFICATION CRITERION 2 Non-destructive verification

The backup must be verifiable without restoration. Proof-of-restorability through integrity checks, checksum validation, or bundle verification. If verification requires full restore, the verification cost is too high for regular execution and will be skipped.

VERIFICATION CRITERION 3 Automated execution

The backup must run without human initiation. Manual backup processes have a 100% eventual failure rate due to human scheduling inconsistency. Automation via hooks, cron, or event-driven triggers is the only reliable execution model.

Systemic implication: untested backups are assumptions, not controls. The GitLab incident demonstrated that backup existence and backup functionality are independent variables. Verification must be automated, continuous, and independently observable.

Frequently asked questions

What should I do first after losing data on my development machine?

Stop writing to the affected disk immediately. Deleted files are not erased right away -- the operating system marks their space as available. Every new byte you write overwrites potentially recoverable data. Use a different computer or device to plan your recovery before touching the affected drive.

Can I recover uncommitted git changes after data loss?

It depends on what survived. Check git reflog for recent commits, look for dangling objects with git fsck, and search your IDE's local history. Uncommitted working tree changes are the hardest to recover because they exist only as files on disk. If the .git directory is intact, git reflog and git fsck can recover committed work that was not pushed. Tools like DevSafe prevent this problem entirely by capturing uncommitted work in encrypted backups.

How long do I have to recover lost files before they are permanently gone?

There is no fixed time limit. Recovery depends on how much new data is written to the disk after the loss. On an SSD with TRIM enabled, deleted blocks may be wiped within minutes. On a traditional hard drive with light use, files can remain recoverable for days or weeks. The critical factor is not time but disk activity -- stop using the affected drive as soon as possible.

What should I do first when I realize my work is gone?

Stop using your computer right away. When files are deleted, your computer does not erase them immediately. It just marks that space as available. If you keep working, new files will overwrite that space and the old files will be gone for real. Use your phone or a different device to plan what to do next.

Can I get my unsaved work back?

Sometimes. Check your editor (VS Code, Cursor, Windsurf) for local history or timeline features. Check if you uploaded anything to GitHub or GitLab. Check if your computer has automatic backups like Time Machine. The work that is hardest to recover is anything that only existed on your computer and was never saved anywhere else. Tools like DevSafe prevent this by automatically backing up your work, including unsaved changes.

How much time do I have before my files are gone forever?

There is no countdown timer. It depends on how much you use your computer after the loss. On newer computers, deleted files can be wiped within minutes. On older computers with less activity, files can sometimes be recovered days later. The most important thing is to stop using the affected computer as soon as possible.

What is the optimal first response to a data loss incident?

Isolate the affected volume immediately. Cease all I/O to the affected storage, including background processes, scheduled jobs, and log rotation. On SSDs with TRIM, the controller asynchronously zeros freed blocks, making isolation time-critical. The recovery surface area is a monotonically decreasing function of post-incident write volume.

What is the recovery boundary for uncommitted state?

Staged files (indexed via git add) exist as blob objects in the object database and are recoverable via fsck --lost-found. Unstaged working tree changes have no git-layer representation and are recoverable only through filesystem-level tools or external backups. This is the fundamental gap that git-aware backup systems with uncommitted-state capture (five-namespace: index, working tree, untracked, stash, operation state) are designed to close.

What determines the recovery window duration?

The recovery window is not time-based but I/O-based. On SSDs with TRIM, freed blocks may be zeroed within seconds to minutes. On HDDs, blocks persist until the allocator reuses them, which depends on write volume. The critical variable is post-incident disk activity, not elapsed time. For automated environments, this means halting all pipeline activity that writes to the affected volume is the highest-priority action.

All posts

English is my second language, and I am deaf. I use AI tools to help organize ideas and communicate clearly. Everything you read here reflects my own thinking, experience, and perspective. AI helps me bridge communication barriers so I can focus on sharing ideas rather than struggling with language mechanics.

This page carries a verifiable publication receipt.
Verify
Published
Signed by devsafe.com
Content Hash 343281119a5603ea5ade898d359d97879d3a02c927ad3596feeb4b0a9b7002a4
Algorithm SHA-256 + Ed25519
Timestamp 2026-06-15T23:17:23.470Z
TSA Co-sign FreeTSA.org
Raw Receipt JSON
{
  "version": 1,
  "type": "publication-receipt",
  "url": "https://devsafe.com/blog/first-60-minutes-data-loss",
  "contentHash": "sha256:343281119a5603ea5ade898d359d97879d3a02c927ad3596feeb4b0a9b7002a4",
  "timestamp": "2026-06-15T23:17:23.470Z",
  "signedBy": "devsafe.com",
  "publicKey": "https://devsafe.com/.well-known/publication-receipt-key.json",
  "signature": "ed25519:QpRfZOwXXo0BjEKbHbQzY+7h4s+wHUmd1Cmob6NoU/NPnrOCdsqZvjFxsqmsO9kzepWfryo02fyZwyZB8cAUCQ==",
  "tsaCosignature": {
    "tsr": "MIISFTADAgEAMIISDAYJKoZIhvcNAQcCoIIR/TCCEfkCAQMxDzANBglghkgBZQMEAgMFADCCAYYGCyqGSIb3DQEJEAEEoIIBdQSCAXEwggFtAgEBBgQqAwQBMDEwDQYJYIZIAWUDBAIBBQAEIDQygRGaVgPqWt6JjTWdl4edOgLJJ601lv7rSwqbcAKkAgQFoo/VGA8yMDI2MDYxNTIzMTcyM1oBAf+gggETpIIBDzCCAQsxETAPBgNVBAoMCEZyZWUgVFNBMQwwCgYDVQQLDANUU0ExdjB0BgNVBA0MbVRoaXMgY2VydGlmaWNhdGUgZGlnaXRhbGx5IHNpZ25zIGRvY3VtZW50cyBhbmQgdGltZSBzdGFtcCByZXF1ZXN0cyBtYWRlIHVzaW5nIHRoZSBmcmVldHNhLm9yZyBvbmxpbmUgc2VydmljZXMxGDAWBgNVBAMMD3d3dy5mcmVldHNhLm9yZzEkMCIGCSqGSIb3DQEJARYVYnVzaWxlemFzQG1haWxib3gub3JnMRIwEAYDVQQHDAlXdWVyemJ1cmcxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIDAZCYXllcm6ggg5nMIIGYDCCBEigAwIBAgIJAMLphhYNqOnNMA0GCSqGSIb3DQEBDQUAMIGVMREwDwYDVQQKEwhGcmVlIFRTQTEQMA4GA1UECxMHUm9vdCBDQTEYMBYGA1UEAxMPd3d3LmZyZWV0c2Eub3JnMSIwIAYJKoZIhvcNAQkBFhNidXNpbGV6YXNAZ21haWwuY29tMRIwEAYDVQQHEwlXdWVyemJ1cmcxDzANBgNVBAgTBkJheWVybjELMAkGA1UEBhMCREUwHhcNMjYwMjE1MTk0NDIyWhcNNDAwMjAyMTk0NDIyWjCCAQsxETAPBgNVBAoMCEZyZWUgVFNBMQwwCgYDVQQLDANUU0ExdjB0BgNVBA0MbVRoaXMgY2VydGlmaWNhdGUgZGlnaXRhbGx5IHNpZ25zIGRvY3VtZW50cyBhbmQgdGltZSBzdGFtcCByZXF1ZXN0cyBtYWRlIHVzaW5nIHRoZSBmcmVldHNhLm9yZyBvbmxpbmUgc2VydmljZXMxGDAWBgNVBAMMD3d3dy5mcmVldHNhLm9yZzEkMCIGCSqGSIb3DQEJARYVYnVzaWxlemFzQG1haWxib3gub3JnMRIwEAYDVQQHDAlXdWVyemJ1cmcxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIDAZCYXllcm4wdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASiFeGhstbLhxix0o4UAumNSwHUUlOe3DBvs8fYs580wADW59oqGSCx15bp61TSmXkwLm1JW48XnbLLizP6ZtjcvshV3H9uz2bS53sgDXhg1wLbIhAtraC+fHCytHeuVaujggHmMIIB4jAJBgNVHRMEAjAAMB0GA1UdDgQWBBQVwL0m69RdgtFdkyYxL+9wsotGXjAfBgNVHSMEGDAWgBT6VQ2MNGZRQ0z357OnbJWveuaklzALBgNVHQ8EBAMCBsAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwbAYIKwYBBQUHAQEEYDBeMDMGCCsGAQUFBzAChidodHRwOi8vd3d3LmZyZWV0c2Eub3JnL2ZpbGVzL2NhY2VydC5wZW0wJwYIKwYBBQUHMAGGG2h0dHA6Ly93d3cuZnJlZXRzYS5vcmc6MjU2MDA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8vd3d3LmZyZWV0c2Eub3JnL2NybC9yb290X2NhLmNybDCByAYDVR0gBIHAMIG9MIG6BgMrBQgwgbIwMwYIKwYBBQUHAgEWJ2h0dHA6Ly93d3cuZnJlZXRzYS5vcmcvZnJlZXRzYV9jcHMuaHRtbDAyBggrBgEFBQcCARYmaHR0cDovL3d3dy5mcmVldHNhLm9yZy9mcmVldHNhX2Nwcy5wZGYwRwYIKwYBBQUHAgIwOxo5RnJlZVRTQSB0cnVzdGVkIHRpbWVzdGFtcGluZyBTb2Z0d2FyZSBhcyBhIFNlcnZpY2UgKFNhYVMpMA0GCSqGSIb3DQEBDQUAA4ICAQBrMVS/YfnfMr0ziZnesBUOrDNRrNNgt3IgMNDwNhwl6oKWHVIhlYnM/5boljfbpZTAbqvxHI3ztT0/swxQOqTat5qBJRAY/VH1n/T4M9uDjSuu3qfh0ZH5PL9ENqoVW44i5NT/znQev2MGXOAHwz9kZwwzz9MFX6hbGhBqWa+nlAqb7Y72KFzj33m1OVHxV2Wl4YD9f91bZTFpUEGW4Ktbkmxpf/iGIPaf4WHpoBW/O6EzofMKYlz4yXyEBh0wRRVyXltLrj+MFHqhe+PsMBllq/dCaO4W/F+AuHElu7aUYWMASelphWAJiUsNMr5HAoeCSSgilqf1CSoWC+k6e4334Fym+Iy4csMex+PG4rSdqXJVQ+AWEdRajSPKh7yDfpNkdnO6yqQJ/tSd11XQ5cL0M9jWuCD1zHlgA+u+R2cry3yo23jD7qTGLhZqUvXCyWigH30/Q/RXjjDwrc4DJiQ+gRY0FhdTYqlvgMBPr4LcJKnNksivdj+kbz7bVSbrBAzRiazK9l841/5XMtP9BvD0hKCpQFvP9PSgCC8EQnKqgSe26FSJBaAQcA5TnK8NF4jkbElBxf/zyh7P3IjHso35jtgUWD1/itg9BJWbYUwJ4tfILpB2F0wbk1GcZDCDZoyW3Xf3trApz/Zd93gF3joc9Hh9RFveKRzWQ7ddUt3egTCCB/8wggXnoAMCAQICCQDB6YYWDajpgDANBgkqhkiG9w0BAQ0FADCBlTERMA8GA1UEChMIRnJlZSBUU0ExEDAOBgNVBAsTB1Jvb3QgQ0ExGDAWBgNVBAMTD3d3dy5mcmVldHNhLm9yZzEiMCAGCSqGSIb3DQEJARYTYnVzaWxlemFzQGdtYWlsLmNvbTESMBAGA1UEBxMJV3VlcnpidXJnMQ8wDQYDVQQIEwZCYXllcm4xCzAJBgNVBAYTAkRFMB4XDTE2MDMxMzAxNTIxM1oXDTQxMDMwNzAxNTIxM1owgZUxETAPBgNVBAoTCEZyZWUgVFNBMRAwDgYDVQQLEwdSb290IENBMRgwFgYDVQQDEw93d3cuZnJlZXRzYS5vcmcxIjAgBgkqhkiG9w0BCQEWE2J1c2lsZXphc0BnbWFpbC5jb20xEjAQBgNVBAcTCVd1ZXJ6YnVyZzEPMA0GA1UECBMGQmF5ZXJuMQswCQYDVQQGEwJERTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALYCjg4wMvERENlkzalLnQJ44ZQq6ROqpZkHzaaXk5lb2ax+M7rZ/jcE2hwBqY0hr+P1kaWdcGdwUWeZj1AWci4KtGKyH0ORcdLPzEWT83Na95SlqzEfbAEMeJjeM9dcRRDudvS9HRSYzxfTA/BqXdn3lsxsqbZXpW/j6k/vvnzmtqGNPjWjDO5f8XDRzzmjM9P9qJZNIttoWynlYb6JDwqoRYc7LoSrJquDn/6PrenSO7MeYdJzzJuIBkkYX6vs+gU0YAq6kBthTi6FRYLeoiJvwZzX31K+1Q2Hd82ZiMBTo/x9wyh6BopP8StxPNmANmbpVThUVv84+AKYz2uThW6SJHdKZs8c3RHC+O/YUgPXRYslZksT7WOc3tT/gRPWzFNT0nKUc8PDBxV8ciqltd0L+y1sOLG5N0nIgexgAm0IlRs4JL1xusvORzrr1jbwuRi0osj/RpTwdFevLW8c+CVU0XcP15/10xTc0QTN3KvJQTgFbfzwF+frhXL9UvcBRPGI2gX1gj9Y3QYpfnOHvtLXcsE9qCZmAQRf5BLdcJhsDJh7pzRLkDc4dRbSWOeIW1H4lot/JgEhO8TLTIX4/wuEr2qYgzfN+4GGj37PMdymcW1+wt2ALBZyYp5cAFLLNX3Smq/EP2FbOx/51OHOCMccc+H+u33FajNiEynp7WwjAgMBAAGjggJOMIICSjAMBgNVHRMEBTADAQH/MA4GA1UdDwEB/wQEAwIBxjAdBgNVHQ4EFgQU+lUNjDRmUUNM9+ezp2yVr3rmpJcwgcoGA1UdIwSBwjCBv4AU+lUNjDRmUUNM9+ezp2yVr3rmpJehgZukgZgwgZUxETAPBgNVBAoTCEZyZWUgVFNBMRAwDgYDVQQLEwdSb290IENBMRgwFgYDVQQDEw93d3cuZnJlZXRzYS5vcmcxIjAgBgkqhkiG9w0BCQEWE2J1c2lsZXphc0BnbWFpbC5jb20xEjAQBgNVBAcTCVd1ZXJ6YnVyZzEPMA0GA1UECBMGQmF5ZXJuMQswCQYDVQQGEwJERYIJAMHphhYNqOmAMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly93d3cuZnJlZXRzYS5vcmcvcm9vdF9jYS5jcmwwgc8GA1UdIASBxzCBxDCBwQYKKwYBBAGB8iQBATCBsjAzBggrBgEFBQcCARYnaHR0cDovL3d3dy5mcmVldHNhLm9yZy9mcmVldHNhX2Nwcy5odG1sMDIGCCsGAQUFBwIBFiZodHRwOi8vd3d3LmZyZWV0c2Eub3JnL2ZyZWV0c2FfY3BzLnBkZjBHBggrBgEFBQcCAjA7GjlGcmVlVFNBIHRydXN0ZWQgdGltZXN0YW1waW5nIFNvZnR3YXJlIGFzIGEgU2VydmljZSAoU2FhUykwNwYIKwYBBQUHAQEEKzApMCcGCCsGAQUFBzABhhtodHRwOi8vd3d3LmZyZWV0c2Eub3JnOjI1NjAwDQYJKoZIhvcNAQENBQADggIBAGivfr+ThWLvTOs7WAvi+vbMNaJncpYvPZWQH6VjDIfQkZiYTOigajP4qcKC7Z8csRrGwj4XEI7k785vspTelcEzJiJVclUiymGXHUo7f3glDfuNSu7A+xlZsWQQBSC5wQ5kxiZi5K1NCrriKY/JSPxOmejZ5rj9vkQEEh7HwUIurLLJ1zKOBzluYLTzu4A61KVVyA/vtT+F53ZKCp+0r8OZ9M0vX79YcQXGCBzz0FM3trt9GwELdJ9IiMkS82lrobaQLXe338BGwEoMwexPjRheLaVd+3vCogNsYhkkak+Z3btvH4KTmPO4A9wK2Q3LWb70wnx3QEuZBDt4JxhnmRFSw5nxLL/ExiWtwJY1WuRONCEA7FF6UC4vBvlAuNQ1mbvBFU+K52GgsNVV+0oTkdTzQgr42/EvLX3bnXfc4VN4BAdK8XXk8tbVWzS11vfcvdMXMK9WSA1MDP8UP56DvBUYZtC6Dwu9xH/ieGQXa71sGrhd8yXt93eIm8RHG/P6c+VsxZHosWDNp7B4ah7ASsOyT6LijV0Z5eSABNXhZqg8guxv1U+zheuvcTOoW1LeRttSROHDSujTbnEvn84NST19Pt1YbGGY4+w+bpY0b0F6yfIh4K/zOo9qCx70wCNjC3atqo2RQzgl7MQcSaW5ixgcfaMOmXq5VMc8LNgFr9qZMYIB7DCCAegCAQEwgaMwgZUxETAPBgNVBAoTCEZyZWUgVFNBMRAwDgYDVQQLEwdSb290IENBMRgwFgYDVQQDEw93d3cuZnJlZXRzYS5vcmcxIjAgBgkqhkiG9w0BCQEWE2J1c2lsZXphc0BnbWFpbC5jb20xEjAQBgNVBAcTCVd1ZXJ6YnVyZzEPMA0GA1UECBMGQmF5ZXJuMQswCQYDVQQGEwJERQIJAMLphhYNqOnNMA0GCWCGSAFlAwQCAwUAoIG4MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwNjE1MjMxNzIzWjArBgsqhkiG9w0BCRACDDEcMBowGDAWBBRIH9U8U004QYDAKGUZoDb5iFRHZjBPBgkqhkiG9w0BCQQxQgRAiDWRCq1rMLNYKovT4g/mqMOQ2Xwzdp2ncicI9FcqvAbBBtkzAYlgQdSWZ1CK2LVOwncZDokFvULPDhKdxuGg5zAKBggqhkjOPQQDBARnMGUCMF8E0UiY7Hgpyp3ACOZFJBcp1lbm44Qa+UDrfWy51niU9QOkNFkYKRgsKt3L71sWCAIxAKQWNV33Czn+zqpEZ+e7wIm3mdeQzbE+xSOuxBGJH2zThhDsPqLMruSkPewFIzXrYQ==",
    "tsaUrl": "https://freetsa.org/tsr",
    "requestedAt": "2026-06-15T23:17:23.535Z"
  }
}

Skip this step

No spam. Unsubscribe anytime.

Ask Voss

Answers sourced from this article only

I've read this entire post. Ask me anything about what to do in the first 60 minutes after data loss, the triage process, or recovery priorities.
...

10 questions per session