DEV Community

Cover image for Why Version Control Exists: The Pendrive Problem
Pratham
Pratham

Posted on

Why Version Control Exists: The Pendrive Problem

Ever wondered why developers swear by Git? Let me tell you a story.


If you've ever worked on a college project with friends, you know the drill. Someone shows up with a pendrive, copies the latest code, works on it at home, and brings it back the next day. Sounds simple, right?

Well, it works... until it doesn't.

Imagine doing this with thousands of lines of code, multiple people coding simultaneously, and your entire project depending on not losing a single line. That's when things start to fall apart.

Before version control systems like Git became the norm, developers actually worked this way. They used pendrives, created folders named Project_Final_REAL_v3_ACTUAL_FINAL, and somehow managed to build software.

This is the story of why we desperately needed something better.


The Pendrive Era: How Developers Actually Worked

Let me paint you a picture. Meet Piyush, a developer building a simple e-commerce website. Here's what his Desktop looks like:

Desktop/
  β”œβ”€β”€ EcommerceProject/
  β”œβ”€β”€ EcommerceProject_Backup_Monday/
  β”œβ”€β”€ EcommerceProject_Backup_Wednesday/
  β”œβ”€β”€ EcommerceProject_Working_Version/
  β”œβ”€β”€ EcommerceProject_FINAL/
  β”œβ”€β”€ EcommerceProject_FINAL_v2/
  └── EcommerceProject_ACTUAL_FINAL_USE_THIS/
Enter fullscreen mode Exit fullscreen mode

Sound familiar? Let's see what happens when things get real.


Problem 1: You Can't Go Back in Time

Monday, 10:00 AM β€” Piyush writes a shopping cart feature.

File: cart.js

function addToCart(item) {
  let cart = [];
  cart.push(item);
  console.log("Item added!");
  return cart;
}
Enter fullscreen mode Exit fullscreen mode

He tests it. It works perfectly.

Tuesday, 2:00 PM β€” Piyush thinks, "Let me make this better."

He rewrites the entire function:

function addToCart(item) {
  let cart = getCartFromDatabase();
  cart.push(item);
  saveCartToDatabase(cart);
  updateCartIcon();
  console.log("Enhanced cart updated!");
  return cart;
}
Enter fullscreen mode Exit fullscreen mode

He saves the file. The old code? Gone. Just... deleted from existence.

Thursday, 11:00 AM β€” The tester reports: "Cart was working fine on Monday. Now it's acting weird."

Piyush's problem: He needs Monday's code back. But it doesn't exist anymore. It's not in the Recycle Bin. It's not saved anywhere. It's just... gone forever.

This is the first big problem: You can't travel back in time to see what your code looked like before. Once you hit save, the old version disappears.


The "Solution": The Final Naming Disaster

Okay, Piyush learns his lesson. He starts making backups by copying the entire project folder every evening.

EcommerceProject_Dec12_Before_Cart_Changes/
EcommerceProject_Dec13_Cart_Working/
EcommerceProject_Dec14_BROKEN_Dont_Use/
EcommerceProject_Dec15_Fixed_Cart/
EcommerceProject_Dec16_FINAL/
EcommerceProject_Dec17_FINAL_FINAL/
EcommerceProject_Dec18_FINAL_REAL_THIS_TIME/
Enter fullscreen mode Exit fullscreen mode

Diagram : The "Final" Folder Naming Chaos

πŸ“Š THE "FINAL" NAMING DISASTER
════════════════════════════════════════════════════════════════

Piyush's Desktop After 3 Months:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  πŸ“ Desktop                                               β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject                                β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_Backup_Monday                  β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_Backup_Wednesday               β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_Working_Version                β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_FINAL                ← Which   β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_FINAL_v2             ← one     β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_FINAL_FINAL          ← is      β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_FINAL_REAL           ← the     β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_ACTUAL_FINAL         ← actual  β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_FINAL_USE_THIS       ← final?  β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_Oct3_Working         ← ???     β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_STABLE_VERSION                 β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_DONT_DELETE                    β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_Before_Big_Change              β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_Working_Good                   β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_Latest_Working                 β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_TESTED_VERSION                 β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_Dec15_Backup                   β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_PRODUCTION_COPY                β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_DO_NOT_USE                     β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_BROKEN                         β”‚
β”‚    β”œβ”€β”€ πŸ“ EcommerceProject_FIXED                          β”‚
β”‚    └── πŸ“ EcommerceProject_THIS_ONE_WORKS        β¬… πŸ€”    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

PROBLEMS:
─────────
❓ Which folder has the working cart feature?
❓ Which folder should be deployed to production?
❓ Which folder has the bug fix from 2 weeks ago?
❓ What's the difference between "FINAL" and "ACTUAL_FINAL"?
❓ Why are there 3 folders with "WORKING" in the name?

RESULT:
───────
⏱️  Wastes 3 hours searching through folders
😰 Tests 23 different versions
❌ Still not sure which one is correct
πŸ’Ύ Wastes 15 GB of disk space on duplicates


WITH VERSION CONTROL (Git):
═══════════════════════════

Desktop/
  └── πŸ“ EcommerceProject/          ← Just ONE folder!
        └── .git/                   ← All history stored here
            β”œβ”€β”€ commit abc123: "Added cart feature"
            β”œβ”€β”€ commit def456: "Fixed login bug"
            β”œβ”€β”€ commit ghi789: "Added payment validation"
            └── commit jkl012: "Optimized database queries"

βœ… One folder
βœ… Complete history
βœ… Clear descriptions of what changed
βœ… Can see exactly what was done in each version
βœ… Can roll back to any version instantly
Enter fullscreen mode Exit fullscreen mode

Six months later, a bug appears.

"I fixed this bug before," Piyush thinks. "But which folder was it in?"

He opens 23 folders. Tests 23 versions. Wastes 3 hours. Finally finds it buried in EcommerceProject_Oct3_Working_Version_Good/.

The problem? Folder names are written by humans. Humans lie. Humans forget. And humans use the word "final" way too many times.

You know what Piyush really needed? A system that automatically tracks versions with meaningful descriptions, not random folder names.



Diagram : Timeline - File Versions Getting Lost

πŸ“Š TIMELINE: How File Versions Get Lost Over Time
═════════════════════════════════════════════════════════════════

WITHOUT VERSION CONTROL:

Monday          Tuesday         Wednesday       Thursday        Friday
9:00 AM         9:00 AM         9:00 AM         9:00 AM         9:00 AM
   β”‚               β”‚               β”‚               β”‚               β”‚
   v               v               v               v               v
β”Œβ”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”
β”‚ v1.0 │───────>β”‚ v2.0 │───────>β”‚ v3.0 │───X───>β”‚ v4.0 │───────>β”‚ v5.0 β”‚
β”‚      β”‚  Save  β”‚      β”‚  Save  β”‚      β”‚ FORGOT β”‚      β”‚  Save  β”‚      β”‚
β”‚Added β”‚  over  β”‚Added β”‚  over  β”‚Fixed β”‚   TO   β”‚Added β”‚  over  β”‚Added β”‚
β”‚login β”‚        β”‚cart  β”‚        β”‚ bug  β”‚ BACKUP β”‚searchβ”‚        β”‚UI    β”‚
β””β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”˜
   βœ…              βœ…              ❌              βœ…              βœ…
Available      Available         LOST!        Available      Available

PROBLEM ON FRIDAY:
─────────────────
Bug appears that was fixed on Wednesday
❌ Wednesday's code is GONE
❌ No way to recover it
❌ Must recreate the fix from memory
❌ Waste hours debugging again


WITH VERSION CONTROL (Git):

Monday          Tuesday         Wednesday       Thursday        Friday
9:00 AM         9:00 AM         9:00 AM         9:00 AM         9:00 AM
   β”‚               β”‚               β”‚               β”‚               β”‚
   v               v               v               v               v
β”Œβ”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”
β”‚ v1.0 │───────>β”‚ v2.0 │───────>β”‚ v3.0 │───────>β”‚ v4.0 │───────>β”‚ v5.0 β”‚
β”‚      β”‚ commit β”‚      β”‚ commit β”‚      β”‚ commit β”‚      β”‚ commit β”‚      β”‚
β”‚Added │───────>β”‚Added │───────>β”‚Fixed │───────>β”‚Added │───────>β”‚Added β”‚
β”‚login β”‚        β”‚cart  β”‚        β”‚ bug  β”‚        β”‚searchβ”‚        β”‚UI    β”‚
β””β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”˜
   βœ…              βœ…              βœ…              βœ…              βœ…
   β”‚               β”‚               β”‚               β”‚               β”‚
   β”‚               β”‚               β”‚               β”‚               β”‚
   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                   ALL VERSIONS PRESERVED FOREVER
                   Can go back to ANY point in time!

BENEFIT:
────────
βœ… All versions saved automatically
βœ… Can see exactly what changed and when
βœ… Can roll back to Wednesday's fix instantly
βœ… Complete history with descriptions
Enter fullscreen mode Exit fullscreen mode

When the Team Grows: The Real Chaos Begins

Problem 2: Two Developers, One Pendrive, Total Chaos

Hitesh joins Piyush's team. Now things get interesting.

Here's how they share code:

  1. Piyush's workflow:
* Codes all day on his laptop

* Copies project folder to pendrive

* Walks to Hitesh's desk and gives him the pendrive

* Hitesh copies it to his laptop
Enter fullscreen mode Exit fullscreen mode
  1. Hitesh's workflow:
* Works on his copy all day

* Next morning, copies his project back to pendrive

* Gives pendrive to Piyush

* Piyush copies it to his laptop

* **Piyush's changes from yesterday? DELETED.**
Enter fullscreen mode Exit fullscreen mode

Why? Because Hitesh worked on yesterday's code. His version doesn't have Piyush's latest changes. When Piyush copies his folder, it overwrites his work.

He doesn't even realize it until someone asks, "Hey, where did that feature go?"



Diagram : Two Developers with Pendrive - The Overwrite Problem

πŸ“Š THE PENDRIVE OVERWRITE PROBLEM
═══════════════════════════════════════════════════════════

Day 1 - Monday:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                                         β”‚
β”‚  Piyush's Laptop          PENDRIV       Hitesh's Laptop β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚ Version 1.0 β”‚                        β”‚ Version 1.0 β”‚ β”‚
β”‚  β”‚ + Adds      β”‚                        β”‚             β”‚ β”‚
β”‚  β”‚ Payment     β”‚                        β”‚             β”‚ β”‚
β”‚  β”‚ Feature     β”‚                        β”‚             β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚         β”‚                                               β”‚
β”‚         β”‚ Copies to pendrive                            β”‚
β”‚         β”‚ at end of day                                 β”‚
β”‚         v                                               β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                        β”‚
β”‚  β”‚  PENDRIVE   β”‚                                        β”‚
β”‚  β”‚ Version 1.1 β”‚ ◄─── Has Piyush's payment feature      β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                        β”‚
β”‚                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Day 2 - Tuesday Morning:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                                           β”‚
β”‚  Piyush's Laptop          PENDRIVE       Hitesh's Laptop  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚ Version 1.1 β”‚      β”‚ Version 1.1 │────>β”‚ Version 1.1 β”‚ β”‚
β”‚  β”‚ (Payment    β”‚      β”‚             β”‚     β”‚ (Payment    β”‚ β”‚
β”‚  β”‚  Feature)   β”‚      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚  Feature)   β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                          β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                                                  β”‚        β”‚
β”‚                                                  β”‚        β”‚
β”‚                              Hitesh adds shipping feature β”‚
β”‚                                                  β”‚        β”‚
β”‚                                                  v        β”‚
β”‚                                          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚                                          β”‚ Version 1.2 β”‚  β”‚
β”‚                                          β”‚ (Payment +  β”‚  β”‚
β”‚                                          β”‚  Shipping)  β”‚  β”‚
β”‚                                          β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                  β”‚
                                          Copies to pendrive
                                             at end of day
                                                 v
                                          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                          β”‚  PENDRIVE   β”‚
                                          β”‚ Version 1.2 β”‚
                                          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Day 3 - Wednesday Morning:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   THE DISASTER                          β”‚
β”‚                                                         β”‚
β”‚  Piyush's Laptop          PENDRIVE                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                   β”‚
β”‚  β”‚ Version 1.1 β”‚      β”‚ Version 1.2 β”‚                   β”‚
β”‚  β”‚ (Payment    β”‚  <───│ (Shipping   β”‚                   β”‚
β”‚  β”‚  Feature)   β”‚      β”‚  ONLY)      β”‚                   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                   β”‚
β”‚         β”‚                                               β”‚
β”‚         β”‚ Piyush copies from pendrive                   β”‚
β”‚         v                                               β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                        β”‚
β”‚  β”‚ Version 1.2 β”‚ ⚠️ PAYMENT FEATURE DELETED!            β”‚
β”‚  β”‚ (Shipping   β”‚                                        β”‚
β”‚  β”‚  ONLY)      β”‚ Because Hitesh worked on old version   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ that didn't have payment feature       β”‚
β”‚                                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

❌ RESULT: Piyush's Monday work is completely gone
❌ Nobody knows it happened until much later
❌ Hours/days of work lost silently
Enter fullscreen mode Exit fullscreen mode

Problem 3: The Parallel Work Disaster

This is where things get really messy.

Monday, 9:00 AM β€” Both Piyush and Hitesh start working. Neither knows what the other is planning to do.

They both edit the same file: checkout.js

Piyush's Computer (9:00 AM)

Starting code:

function processCheckout(cart) {
  console.log("Processing...");
  return true;
}
Enter fullscreen mode Exit fullscreen mode

Piyush adds payment validation (9:30 AM):

function processCheckout(cart) {
  if (cart.total > 0) {
    // Piyush's addition
    console.log("Processing...");
    return true;
  }
  return false; // Piyush's addition
}
Enter fullscreen mode Exit fullscreen mode

Hitesh's Computer (9:00 AM)

Starting code (same as Piyush's starting point):

function processCheckout(cart) {
  console.log("Processing...");
  return true;
}
Enter fullscreen mode Exit fullscreen mode

Hitesh adds shipping calculation (10:00 AM):

function processCheckout(cart) {
  console.log("Processing...");
  calculateShipping(cart); // Hitesh's addition
  return true;
}
Enter fullscreen mode Exit fullscreen mode

The Collision (5:00 PM)

Hitesh finishes first. He copies his code to the pendrive and gives it to Piyush.

Piyush copies it to his laptop.

Result:

// This is what Piyush now has:
function processCheckout(cart) {
  console.log("Processing...");
  calculateShipping(cart); // Hitesh's work
  return true;
}
Enter fullscreen mode Exit fullscreen mode

What about Piyush's payment validation code? GONE. Vanished. Deleted without a trace.

Piyush doesn't even know it happened. He thinks his payment validation is still there. It's only when someone tries to checkout with an empty cart and the site crashes that they realize something's wrong.



Diagram : Parallel Work - The Collision Explained

πŸ“Š PARALLEL WORK COLLISION: Step-by-Step Breakdown
══════════════════════════════════════════════════════════

MONDAY MORNING - 9:00 AM
Both developers start with same file:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚          BOTH HAVE IDENTICAL CODE                      β”‚
β”‚                                                        β”‚
β”‚  Piyush's Laptop     checkout.js     Hitesh's Laptop   β”‚
β”‚  ───────────────────────────────────────────────────   β”‚
β”‚  function processCheckout(cart) {                      β”‚
β”‚      console.log("Processing...");                     β”‚
β”‚      return true;                                      β”‚
β”‚  }                                                     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜


DURING THE DAY - 9:00 AM to 5:00 PM
Each developer makes different changes:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Piyush's Laptop    β”‚              β”‚   Hitesh's Laptop    β”‚
β”‚   (9:30 AM)          β”‚              β”‚   (10:00 AM)         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€              β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ function process     β”‚              β”‚ function process     β”‚
β”‚ Checkout(cart) {     β”‚              β”‚ Checkout(cart) {     β”‚
β”‚   if (cart.total>0){ β”‚  DIFFERENT!  β”‚   console.log(...);  β”‚
β”‚     console.log(...);β”‚    <────>    β”‚   calculateShipping  β”‚
β”‚     return true;     β”‚              β”‚   (cart);            β”‚
β”‚   }                  β”‚              β”‚   return true;       β”‚
β”‚   return false; βœ…   β”‚              β”‚ } βœ…                 β”‚
β”‚ }                    β”‚              β”‚                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    Payment validation                    Shipping calculation


5:00 PM - THE COLLISION
─────────────────────────

Step 1: Hitesh finishes first
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Hitesh copies to PENDRIVE            β”‚
β”‚ Pendrive now has: Shipping code βœ…   β”‚
β”‚ Pendrive does NOT have: Payment ❌   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Step 2: Piyush gets the pendrive
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Piyush copies FROM pendrive          β”‚
β”‚ This OVERWRITES his file             β”‚
β”‚                                      β”‚
β”‚ BEFORE COPY:                         β”‚
β”‚   βœ… Payment validation              β”‚
β”‚   ❌ Shipping calculation            β”‚
β”‚                                      β”‚
β”‚ AFTER COPY:                          β”‚
β”‚   ❌ Payment validation  β¬… DELETED! β”‚
β”‚   βœ… Shipping calculation            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

FINAL RESULT:
─────────────
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Everyone's laptop now has:           β”‚
β”‚   βœ… Shipping calculation (Hitesh)   β”‚
β”‚   ❌ Payment validation (LOST!)      β”‚
β”‚                                      β”‚
β”‚ Piyush doesn't know his work is gone β”‚
β”‚ Hitesh doesn't know he deleted it    β”‚
β”‚ Problem discovered days later        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜


WITH VERSION CONTROL (Git):
═══════════════════════════

Step 1: Both push their changes
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Piyush: git push β†’ Payment code βœ…   β”‚
β”‚ Hitesh: git push β†’ Shipping code βœ…  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Step 2: Git detects conflict
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ ⚠️  Git says: "Hold on! Both of you  β”‚
β”‚     edited the same file. Let me     β”‚
β”‚     help you merge properly."        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Step 3: Intelligent merge
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Git combines BOTH changes:           β”‚
β”‚   βœ… Payment validation (Piyush)     β”‚
β”‚   βœ… Shipping calculation (Hitesh)   β”‚
β”‚                                      β”‚
β”‚ Both features preserved!             β”‚
β”‚ No work lost!                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
Enter fullscreen mode Exit fullscreen mode

The "WhatsApp Before Coding" Fix

After losing work three times, they create a rule:

"Message on WhatsApp before editing any file."

Real conversation:

Piyush: I'm editing checkout.js today
Hitesh: OK, I'll work on homepage.js
Enter fullscreen mode Exit fullscreen mode

This works! For about a week.

Then reality hits:

Tuesday, 9:00 AM:

  • Piyush messages: "Working on cart.js"

  • Works for 3 hours

  • Goes to lunch

  • Forgets to message when she's done

Tuesday, 2:00 PM:

  • Hitesh thinks: "He messaged 5 hours ago, she's probably done now"

  • Opens cart.js

  • Starts editing

  • Piyush returns from lunch

  • Opens cart.js

  • Both are editing the same file

  • Disaster waiting to happen

The deeper problem: This "system" requires:

  • Both people being online

  • Both people remembering to message

  • Both people correctly guessing when the other is done

  • Perfect human discipline

Spoiler: Humans are not perfect. We forget. We assume. We make mistakes.


The File Ownership Strategy

They try something new:

"Each person owns specific files. Never touch the other person's files."

Piyush owns:
   cart.js
   checkout.js
   payment.js

Hitesh owns:
   homepage.js
   products.js
   search.js
Enter fullscreen mode Exit fullscreen mode

This actually works! They can code in parallel without stepping on each other's toes.

Monday:

  • Piyush edits cart.js β†’ No problem

  • Hitesh edits products.js β†’ No problem

  • End of day: They share the pendrive

  • No conflicts!

They're productive. They're happy.


When File Ownership Falls Apart

Then a bug report arrives: "Add to cart button doesn't work on product page"

The problem needs fixes in:

  • products.js (Hitesh's file) β€” where the button lives

  • cart.js (Piyush's file) β€” where the cart function lives

Who fixes it?

Option 1: Piyush fixes it

  • [x] Can't touch products.js (that's Hitesh's file)

  • Has to explain to Hitesh what changes to make

  • Waits for Hitesh to make the changes

  • Tests it

  • Doesn't work

  • More back-and-forth explanations

  • More waiting

Option 2: Hitesh fixes it

  • [x] Can't touch cart.js (that's Piyush's file)

  • Same painful dance

Option 3: Both fix their parts separately

  • Each person edits their own file

  • [x] Their changes must work together perfectly

  • [x] They're coding based on assumptions about what the other person will do

  • [x] Often doesn't work on the first try

  • [x] Debugging takes forever because they can't see each other's changes

What should take 30 minutes ends up taking 4 hours.

The file ownership strategy breaks whenever real work crosses file boundaries β€” which happens all the time in real projects.


Three Developers: When Things Get Truly Impossible

The Three-Way Collision

Anirudh joins the team. Now there are three developers.

Same day, same file, no coordination:

File: payment.js (starting version, 9:00 AM)

function processPayment(amount) {
  console.log("Processing: " + amount);
  return true;
}
Enter fullscreen mode Exit fullscreen mode

Piyush's version (works 9:00 AM - 11:00 AM):

function processPayment(amount) {
  console.log("Processing: $" + amount); // Added dollar sign
  return true;
}
Enter fullscreen mode Exit fullscreen mode

Copies to pendrive. Done for the day.


Hitesh's version (works 10:00 AM - 12:00 PM):

function processPayment(amount) {
  if (amount > 0) {
    // Added validation
    console.log("Processing: " + amount);
    return true;
  }
  return false;
}
Enter fullscreen mode Exit fullscreen mode

Copies to pendrive. Done for the day.


Anirudh's version (works 11:00 AM - 1:00 PM):

function processPayment(amount) {
  console.log("Payment processing started"); // Changed message
  sendEmailNotification(); // Added email feature
  return true;
}
Enter fullscreen mode Exit fullscreen mode

Diagram : Three Developers - The Three-Way Collision

πŸ“Š THREE-WAY COLLISION: Multiple Developers, Same File
════════════════════════════════════════════════════════

MONDAY 9:00 AM - Everyone starts with same code:

                   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                   β”‚   payment.js v1.0   β”‚
                   β”‚                     β”‚
                   β”‚ function process    β”‚
                   β”‚ Payment(amount) {   β”‚
                   β”‚   console.log(...); β”‚
                   β”‚   return true;      β”‚
                   β”‚ }                   β”‚
                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              β”‚
            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
            β”‚                 β”‚                 β”‚
            β”‚                 β”‚                 β”‚
      β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”
      β”‚  Piyush    β”‚    β”‚ Hitesh   β”‚    β”‚ Anirudh    β”‚
      β”‚            β”‚    β”‚          β”‚    β”‚            β”‚
      β”‚ Works      β”‚    β”‚ Works    β”‚    β”‚ Works      β”‚
      β”‚ 9am-11am   β”‚    β”‚ 10am-12pmβ”‚    β”‚ 11am-1pm   β”‚
      β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜
            β”‚                β”‚                 β”‚
            β”‚                β”‚                 β”‚
      Adds dollar     Adds validation    Adds email
        sign             check           notification
            β”‚                β”‚                 β”‚
            v                v                 v
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚  payment.js v2a  β”‚ β”‚payment.js v2bβ”‚ β”‚ payment.js v2c   β”‚
  β”‚                  β”‚ β”‚              β”‚ β”‚                  β”‚
  β”‚ console.log      β”‚ β”‚ if(amount>0) β”‚ β”‚ console.log      β”‚
  β”‚ ("...$"+amount); β”‚ β”‚   ...        β”‚ β”‚ ("Payment...");  β”‚
  β”‚                  β”‚ β”‚ return false β”‚ β”‚ sendEmail();     β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
            β”‚                β”‚                 β”‚
            β”‚                β”‚                 β”‚
            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                             β”‚
                             v
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚  5:00 PM       β”‚
                    β”‚  WHO WINS?     β”‚
                    β”‚                β”‚
                    β”‚  Usually the   β”‚
                    β”‚  last person   β”‚
                    β”‚  to copy!      β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                             β”‚
                             v
                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                  β”‚    [X] RESULT:       β”‚
                  β”‚                      β”‚
                  β”‚ Two developers' work β”‚
                  β”‚ completely DELETED   β”‚
                  β”‚                      β”‚
                  β”‚ Must manually merge  β”‚
                  β”‚ = 45 min + 3 typos   β”‚
                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
Enter fullscreen mode Exit fullscreen mode

Copies to pendrive. Done for the day.


The Merge Horror

5:00 PM β€” They meet to combine their code:

Piyush: "I added the dollar sign"

Hitesh: "I added validation"

Anirudh: "I added email notifications"

Manager: "Great! Combine all the changes into one file."

The team looks at three completely different versions of the same function. How do they merge these?


The Manual Merge Process (Real Painful Steps)

Anirudh volunteers to merge (rookie mistake).

Her process:

  1. Opens Notepad

  2. Opens Piyush's file in one window

  3. Opens Hitesh's file in a second window

  4. Opens his own file in a third window

  5. Creates a fourth window: payment_MERGED.js

  6. Manually reads all three versions and types out the combined version:

function processPayment(amount) {
  if (amount > 0) {
    // From Hitesh
    console.log("Payment processing started: $" + amount); // Combined all three
    sendEmailNotification(); // From Anirudh
    return true;
  }
  return false; // From Hitesh
}
Enter fullscreen mode Exit fullscreen mode
  1. Time taken: 45 minutes

  2. Mistakes made: 3 typos (found later during testing)

  3. Features lost: None (she got lucky this time)

This works for ONE file.

Their project has 247 files.

And this happened on just ONE day.

Imagine doing this every single day, for every file that multiple people touched. It's exhausting, error-prone, and just doesn't scale.


The Experiment Nightmare

When You Want to Try Something New

Real scenario:

Anirudh: "I want to try a new payment gateway. But it's riskyβ€”might break everything."

Her options with the pendrive system:

Option 1: Work in the main code

  • [x] If it breaks, the entire team is blocked

  • [x] Team can't work while she experiments

  • [x] Too risky

Option 2: Copy the entire project

He creates:

MainProject/              ← Team works hise
ExperimentalProject/      ← Anirudh works hise
Enter fullscreen mode Exit fullscreen mode

What happens over 2 weeks:

Week 1:

  • Anirudh codes in ExperimentalProject/

  • Piyush and Hitesh code in MainProject/

  • The projects start drifting apart

MainProject changes (by the team):

 Fixed login bug
 Added search feature
 Optimized database queries
 Updated 47 files
Enter fullscreen mode Exit fullscreen mode

ExperimentalProject changes (by Anirudh):

 Integrated new payment gateway
 Modified 23 files
 Created 5 new files
Enter fullscreen mode Exit fullscreen mode

Week 2 β€” Anirudh's experiment works!

Anirudh: "The new payment gateway is perfect! Let's add it to the main project!"

The nightmare begins:

Files changed in BOTH projects:

  • payment.js ← Changed by Anirudh AND the team

  • checkout.js ← Changed by Anirudh AND the team

  • database.js ← Changed by the team

  • config.js ← Changed by Anirudh AND the team

Anirudh must now:

  1. Open MainProject/payment.js

  2. Open ExperimentalProject/payment.js

  3. Compare them line by line

  4. Manually copy his changes

  5. Make sure not to delete the team's changes

  6. Test everything

  7. Fix the bugs

  8. Repeat for 12 more files

Time to merge the experiment back: 3 full days

Bugs introduced during merge: 8

Anirudh's stress level: Through the roof

Anirudh's conclusion: "Next time I'll just not experiment. It's not worth the pain."

The real cost? Innovation dies. Developers stop trying new things because merging experiments back is too painful.


All the Problems in One Place

Let me summarize every single problem developers faced in the pendrive era:

1. No Time Travel

Once you save over your code, the old version is gone forever. Can't go back to see what worked before.

2. No Change History

You don't know:

  • What changed between versions

  • Who made the change

  • When it was changed

  • Why it was changed

3. Silent Overwrites

Work gets deleted without warning. You copy someone's folder, it overwrites yours, and you don't even notice until it's too late.

4. Lost Work from Parallel Editing

Two people edit the same file. One person's work gets completely erased when they share the pendrive.

5. Communication Overhead

You need to constantly message each other: "I'm editing this file," "Are you done yet?" "Can I edit now?" It's exhausting.

6. File Ownership Rigidity

Strict ownership rules help prevent conflicts, but they break down when work crosses file boundaries (which is most of the time).

7. Manual Merging Hell

Combining changes from multiple people is slow, error-prone, and doesn't scale beyond 2-3 people.

8. The "Which Version Is Latest?" Mystery

When you have multiple copies with names like FINAL, FINAL_v2, FINAL_ACTUAL, nobody knows which one is actually the latest.

9. Can't Experiment Safely

Trying new ideas means creating a separate copy of the entire project. Merging it back is so painful that people stop experimenting.

10. No Code Review

Code goes straight from one person's computer to the main project. No review step. No discussion. No quality check.

11. No Accountability

When a bug appears, you can't trace it back to who wrote that code or why they wrote it that way.

12. Can't Roll Back

Critical bug in production? Good luck finding the right backup folder to roll back to. You'll waste hours just trying to find it.


Why Teams Used This System Anyway

Before we judge too harshly, let's be honest: this was the best developers could do with the tools available at the time.

It worked (barely) for:

  • Solo developers working alone

  • Tiny teams (2-3 people) with strict discipline

  • Projects that changed slowly

  • Short-term projects

It completely broke down with:

  • Teams larger than 3 people

  • Fast-moving projects with daily changes

  • Any kind of experimentation

  • Cross-file changes (which is 90% of real work)


The Temporary Fixes (And Why They All Failed)

Solution What It Solved What It Couldn't Solve Why It Failed
Manual backups Going back in time (sometimes) Can't see what changed, wastes disk space You forget to backup, or can't find the right backup
Clever folder names Organization (maybe) Names lie, humans forget FINAL_v47 is meaningless
WhatsApp coordination Basic awareness Doesn't scale, depends on everyone being online Humans forget to message
File ownership Prevents some conflicts Breaks for cross-file work Real work crosses boundaries
Manual merging Combining changes (slowly) Doesn't scale, error-prone Takes too long, introduces bugs

Diagram: Comparison Table - Pendrive vs Version Control


πŸ“Š THE COMPLETE COMPARISON: Pendrive Era vs Version Control
═══════════════════════════════════════════════════════════════════════

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚     SCENARIO        β”‚   PENDRIVE METHOD    β”‚   VERSION CONTROL (Git)β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Going back to       β”‚ [X] Hope you made a  β”‚ [+] git checkout       β”‚
β”‚ yesterday's code    β”‚    backup and can    β”‚    Instant time travel β”‚
β”‚                     β”‚    find it (3 hrs)   β”‚    (2 seconds)         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ See what changed    β”‚ [X] Open 2 files,    β”‚ [+] git diff           β”‚
β”‚                     β”‚    compare manually  β”‚    Shows exact changes β”‚
β”‚                     β”‚    (20 minutes)      β”‚    (2 seconds)         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Two people edit     β”‚ [X]Last person wins, β”‚ [+] Git intelligently  β”‚
β”‚ same file           β”‚    other work LOST   β”‚    merges both         β”‚
β”‚                     β”‚    (data loss)       β”‚    (no data loss)      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Who broke the code? β”‚ [X] "I don't know"   β”‚ [+] git blame          β”‚
β”‚                     β”‚    No way to tell    β”‚    Shows exact person  β”‚
β”‚                     β”‚    (impossible)      β”‚    and when            β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Work from home      β”‚ [X] Manual pendrive  β”‚ [+] git pull/push      β”‚
β”‚                     β”‚    transfer, or      β”‚    Automatic sync      β”‚
β”‚                     β”‚    huge email files  β”‚    from anywhere       β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Experiment safely   β”‚ [X] Copy entire      β”‚ [+] git branch         β”‚
β”‚                     β”‚    project, merge    β”‚    Work in isolation,  β”‚
β”‚                     β”‚    back = 3 days     β”‚    merge = 5 minutes   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Rollback to         β”‚ [X] Find backup      β”‚ [+] git revert         β”‚
β”‚ production          β”‚    folder, test,     β”‚    Instant rollback    β”‚
β”‚                     β”‚    hope it works     β”‚    to any version      β”‚
β”‚                     β”‚    (2-4 hours)       β”‚    (30 seconds)        β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Code review         β”‚ [X] Not possible     β”‚ [+] Pull requests      β”‚
β”‚                     β”‚    Code goes direct  β”‚    Review before merge β”‚
β”‚                     β”‚    to production     β”‚    Catch bugs early    β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Track who did what  β”‚ [X] Ask everyone,    β”‚ [+] Complete history   β”‚
β”‚                     β”‚    check timestamps, β”‚    with author, date,  β”‚
β”‚                     β”‚    guess (1 hour)    β”‚    and reason          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Disk space used     β”‚ [X] 23 copies =      β”‚ [+] One folder +       β”‚
β”‚                     β”‚    15 GB wasted      β”‚    compressed history  β”‚
β”‚                     β”‚                      β”‚    = 200 MB            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜


TIME SPENT PER WEEK:
════════════════════

PENDRIVE METHOD:
────────────────
⏱️  Merging files manually:      6 hours
⏱️  Finding right version:        3 hours
⏱️  Recreating lost work:         4 hours
⏱️  Coordinating with team:       2 hours
⏱️  Debugging merge mistakes:     3 hours
────────────────────────────────────────
πŸ“Š TOTAL TIME WASTED:           18 hours/week
πŸ’° COST: Writing 50% less code

VERSION CONTROL (Git):
──────────────────────
⏱️  Learning Git:                 1 hour (one time)
⏱️  Daily operations:             30 minutes/week
────────────────────────────────────────
πŸ“Š TOTAL TIME SPENT:            30 minutes/week
πŸ’° BENEFIT: Focus on actual coding
Enter fullscreen mode Exit fullscreen mode

The Moment of Realization

Every team that grew beyond 2-3 people eventually hit the same wall:

"We're spending more time managing code than writing code."

Developers were exhausted from:

  • Manually merging files for hours

  • Losing work to silent overwrites

  • Debugging bugs that came from merge mistakes

  • Arguing about who edited which file

  • Digging through dozens of backup folders

  • Explaining to each other what changes they made

That's when version control stopped being optional. It became a necessity for survival.


What This Taught Us

The pendrive era taught developers one critical lesson:

When humans must manually track changes across multiple people, time, and files β€” humans will fail. Always.

We're good at writing code. We're terrible at:

  • Remembering what we changed yesterday

  • Manually merging complex changes

  • Coordinating perfectly with teammates

  • Never forgetting to communicate

  • Always making perfect backups

We needed a system that could:

  • Automatically track every change

  • Intelligently merge parallel work

  • Let everyone work simultaneously without conflicts

  • Provide a complete, searchable history

  • Allow safe experimentation

  • Make rolling back effortless

  • Tell us exactly who changed what and why

That system is Git.


What Comes Next?

Now you understand the pain. You know why version control exists. It wasn't created because developers were lazy or wanted fancy tools. It was created out of desperate necessity.

In the next article, I'll show you how Git solves every single one of these problemsβ€”how it gives you time travel, safe parallel work, intelligent merging, and most importantly: the freedom to code without fear of losing your work.


The pendrive era is over. But understanding why it failed helps us appreciate what Git gives us: the ability to collaborate without chaos.


Have you experienced any of these pendrive nightmares? Share your stories in the comments! I'd love to hear them.


Quick Visual: The Pendrive Problem

PENDRIVE WORKFLOW:
==================

Monday:
  Piyush codes β†’ Copies to pendrive β†’ Gives to Hitesh

Tuesday:
  Hitesh codes β†’ Copies to pendrive β†’ Gives to Piyush

Result:
  [X] Piyush's Monday work: DELETED
  [X] Nobody notices until it's too late
  [X] Hours wasted recreating lost code


WHAT WE NEEDED (Git):
=====================

Piyush codes β†’ Saves to shared system β†’ System tracks his changes
Hitesh codes β†’ Saves to shared system β†’ System tracks his changes

Result:
   Both changes preserved
   System intelligently merges them
   Complete history of who did what and when
   Can roll back anytime
   Everyone works in parallel safely
Enter fullscreen mode Exit fullscreen mode

Next up: Git for Beginners: Basics and Essential Commands

Top comments (0)