DEV Community

Cover image for Why Version Control Exists: The Pendrive Problem
Ritam Saha
Ritam Saha

Posted on

Why Version Control Exists: The Pendrive Problem

Introduction

Before Git became the backbone of modern software development, collaboration was fragile, manual, and surprisingly primitive.

Developers didn’t clone repositories or push commits. They passed pendrives.

Each pendrive contained a slightly different version of the same project. Nobody knew which one was correct, who changed what, or when a bug was introduced. One wrong overwrite could erase days of work.

This was not a rare inconvenience—it was a structural problem that made teamwork slow, risky, and unscalable.

That everyday pain point eventually forced developers to rethink how code should be shared, tracked, and trusted. Out of this chaos emerged a system that changed software development forever: Git.

In this article, we will explore why Git was created, what problems existed before it, and how developers managed code before modern version control systems.


Before understanding why version control exists, let’s first clarify what version control actually is.

According to the Internet, Version control (also known as revision control, source control, or source code management) is the software engineering practice of tracking and managing changes to computer files—primarily source code.

That definition sounds technical, but the idea is simple.

Version control is a way to track changes in your code so you can see what changed, when it changed, and roll back to an earlier version if something breaks.

In other words, it gives your code a memory.

So the real question is: why was this needed in the first place?


The Pendrive Era

Let’s go back in time and imagine a world without Git.

You are a developer working on a project. One day, you need help implementing a new feature, so you ask your friend Abdul to collaborate. He agrees and asks for the code.

To share it, you zip the project, copy it to a pendrive, and ship it to him. Abdul implements the feature, zips the updated project, and sends the pendrive back.

Two developers sharing code using a pendrive

When you unzip the project, the first issue becomes clear: there is a lot of code, and you have no idea which part was written by whom. Since the feature works, you ignore the issue and move on.

A few days later, you discover a bug in the feature Abdul wrote. You send the entire project back to him on the pendrive. He fixes the bug and returns it.

Now you know the code has changed—but you don’t know what changed or where. To understand the modifications, you have to sit together and compare changes line by line, which is time-consuming.

Another major issue emerges: while Abdul is working on the code, you cannot safely work on it yourself. If you do, you both end up with different versions of the same project—leading to conflicts and wasted effort.

These problems occur when the codebase is sufficiently large, with two developers somehow managing to make it work. Now, imagine the project grows even bigger, there are three developers now: You, Abdul and Chitra. There is no way that they can all actually collaborate in real time on the project while ensuring the code does not get out of sync during the process.

Three developers causing version conflicts

Another major issue is, we are unable to see what was updated when, who updated it, and the whole timeline along with the previous versions, which are getting lost as the timeline progresses and at the end, we are left with a completely bugged-out version of the code while unable to go back to the original version. Let's make it simple with an example:

Assume that Abdul is working to solve a bug in a feature. After some modifications, he hands the pendrive to Chitra as there are some issues arising in her implemented feature. Then she does some modifications to the code. After all of these, when you get back the pendrive, you are completely clueless about what has happened with your project.

Problems Faced Before Version Control Systems

  • Overwritten code: The last person to save often erased someone else’s work.
  • Lost changes: Hours of work could vanish due to outdated copies.
  • No collaboration history: There was no reliable way to trace who changed what or why.
  • Wasted time: Only one developer could safely work at a time.
  • Constant confusion: Teams struggled to identify which version of the code was the correct one.

How Version Control Fixed the Pendrive Problems

Now let’s think about solving these problems.

The first challenge is to track who made what changes. To solve this, imagine creating a software system that:

  1. Tracks code changes
  2. Stores the author of each change
  3. Shows differences between old and new code
  4. Maintains version history

This solution would address the first two problems: tracking changes and identifying contributors.

So then a simple idea comes up, i.e, making a software that tracks changes on the code, simply noting the Author, Time, Context note while committing the update. Let us call this CCT (Code Changes Tracker). Now, they deploy the CCT on the pendrive. Problem solved? Yes, partially, now they can see the history and revert, which was not possible before.

Code Change Tracker

But what about real-time collaboration??

Even with proper version tracking, each developer still had their own local copy of the project. Everyone had history — but not necessarily the same history.

The core question shifted from:

“Who changed this?” or "What changed?"

to:

“Which version should everyone be working on?”

This is no longer just a versioning problem — it’s a collaboration and coordination problem, as only one developer can work at a time because the source code still exists in a single physical location.

So our devs got a better idea, they set up a cloud server to store the code, let us call it CCTS (Code Changes Tracker Server) and deploy the codebase there, along with the CCT. End of the pendrive era. Problem solved? Yes, now the server acts as a single source of truth, and all our developers can work at the same time, on the same project, while knowing what exactly is coded by whom.

Centralized version control server

At this point, it might seem like the problem is solved.

We now have:

  • A system that tracks changes
  • A server that stores the code
  • Multiple developers working together

But early version control systems that followed this model still had a critical weakness: everything depended on the central server.

  1. If the server went down, development stopped.
  2. If the server lost data, the project history was gone.
  3. Developers could not work freely without constant access to that single machine.

In other words, collaboration was possible—but fragile.


The Architectural Shift That Made Git Different

Git solved this problem by flipping the model entirely.

Instead of a central server holding the complete history, every developer received a full copy of the codebase along with its entire history.

This allowed developers to:

  • Work offline
  • Experiment safely
  • Recover from failures
  • Collaborate without a single point of failure

The server was no longer the only source of truth—it became a shared coordination point, not a dependency.

This architectural shift is what truly separates Git from the systems that came before it. Here is the key insight:

  • CCT, our Code Changes Tracker, represents Git — the distributed version control system.
  • CCTS, our Code Changes Tracker Server, represents platforms like GitHub — which make collaboration easier, but are not required for Git to work.

The Birth of Git

Git was created by Linus Torvalds to manage his main project: Linux. As Linux grew larger day by day, tracking changes became extremely difficult. One day, the Linux developers came across BitKeeper — a version control system that promised everything they had been longing for. It was fast, efficient, and perfectly suited for a large, distributed team. Despite being a proprietary tool, BitKeeper offered free licenses to the Linux community, allowing them to use it without paying. Enthralled by its capabilities, the Linux developers entered a committed relationship with it.

However, not all relationships are meant to last. A member of the Linux community attempted to reverse-engineer BitKeeper, trying to uncover its internal workings. This act of curiosity did not sit well with the company behind the tool.

BitKeeper’s creators felt betrayed. Tensions rose, accusations flew, and the trust was shattered*.*

One fateful morning, the Linux community woke up to find that their free access to BitKeeper had been revoked. The tool they had relied on was no longer available.

The Linux community was suddenly without a critical tool. Heartbroken yet determined, Linus Torvalds swore never to rely on proprietary tools again. He decided to build his own distributed version control system — one that would be free, open-source, and completely independent.

And so, Git was born.

Alternatives to Git

  1. SCCS (Source Code Control System)
  2. RCS (Revision Control System)
  3. CVS (Concurrent Versions System)
  4. Mercurial
  5. Apache Subversion
  6. Fossil
  7. AWS CodeCommit

Alternatives to GitHub

  1. Bitbucket
  2. GitLab
  3. Gitea
  4. Codeberg

Conclusion

Version control did not emerge from theory or best practices—it emerged from pain.

The pendrive era showed what happens when there is no reliable way to track changes, no shared history, and no scalable collaboration model. Code was overwritten, bugs were hard to trace, and teamwork simply did not scale.

Git solved the tracking problem by recording every change as history. Platforms like GitHub, GitLab, and Bitbucket solved the coordination problem by giving teams a shared place to collaborate.

That is why version control is no longer optional—it is foundational to modern software development.

If you have ever pushed a commit, resolved a merge conflict, or rolled back a mistake, you are benefiting from solutions that were born out of something as simple—and painful—as passing pendrives.

Understanding this history doesn’t just make you a better Git user. It makes you a better engineer.


Follow for more beginner-friendly breakdowns of core software engineering concepts.

Top comments (0)