I didn’t learn more Git I learned what Git actually is, and everything got quieter after that
Press enter or click to view image in full sizeI used Git for years without really understanding it. Not in a “I’m new” way. In a shipping-code, opening-PRs, fixing-bugs, acting-confident way.
From the outside, I looked fine. From the inside, Git felt like a haunted house. Doors slammed shut. Commands did things I didn’t fully expect. Sometimes it worked. Sometimes it absolutely did not. Either way, I avoided touching anything once it looked stable.
My Git workflow was basically vibes.
I knew the rituals:
-
git pullwhen things felt off -
git add .when I wanted Git to stop asking questions -
git commit -m "fix"when I was tired -
git pushand hope nobody replied too fast
If something broke, I’d copy-paste a command from Stack Overflow, press Enter, and wait. If it worked, I moved on. If it didn’t, I learned a new level of fear. At no point did I feel like I was in control.
The worst part wasn’t the confusion. It was the silence around it. Everyone else seemed fine. Git was “basic.” A solved problem. So I assumed the issue was me. Maybe I was just bad at version control. Maybe this was one of those things you either get early… or never.
Then, randomly, without drama, Git clicked.
Not because I learned a new command. Not because someone explained rebase better. But because I finally saw Git described as a system instead of a spellbook. No flags. No shortcuts. Just: what Git stores, what branches are, and what actually happens when you commit.
And once that mental model landed, everything calmed down. Merges stopped feeling dangerous. Rebases stopped feeling forbidden. Git stopped feeling fragile.
TL;DR: Git isn’t hard. It’s just usually taught backwards. Once you understand the model, the commands stop being scary and start feeling
The big lie: Git is a list of commands
Most people learn Git like this: memorize a few commands, don’t ask too many questions, hope nothing explodes.
git pull
git add .
git commit -m "stuff"
git push
It works. Until it doesn’t.
That’s the lie most tutorials start with that Git is the commands. It’s not. The commands are just buttons. Git itself is the system underneath. And preventing you from seeing that system is why everything feels random.
Think about how Git is usually introduced. Someone tells you to “just pull” before you start. Sometimes it works. Sometimes you get conflicts. Nobody explains why. You’re just told conflicts are bad and to be careful.
Then you’re told to run git add . because it’s faster than thinking. You don’t really know what you’re adding just that Git will stop nagging you afterward.
Then comes the commit:
git commit -m "fix"
Not because you know what a commit is, but because the workflow demands one.
At no point do you feel oriented. You’re reacting, not understanding. Git becomes something you appease, not something you control.
This approach collapses the moment you leave the happy path. A weird merge. A rebase warning. A detached HEAD. Suddenly the spellbook runs out of spells.
That’s why Git feels hostile. Not because it’s complicated but because learning only the commands robs you of context.
Once I stopped asking
“what command do I run?” and started asking “what state is my repo in right now?”
Git stopped feeling random.
Because Git isn’t a list of commands.
It’s a way of storing history.
And that’s the part most tutorials skip.
The mental model that changes everything: snapshots and pointers
The moment Git finally clicked for me had nothing to do with learning a new command.
It was this sentence:
Git stores snapshots, not diffs.
That’s it. That’s the unlock.
Most people assume Git tracks line-by-line changes like some kind of fancy Dropbox. It doesn’t. Every time you commit, Git takes a picture of your entire project at that moment. If a file didn’t change, Git just points to the old version. Cheap, fast, no drama.
A commit isn’t an action. It’s a thing.
And once you see that, everything else starts making sense.
Here’s the part that removes 80% of the fear: branches aren’t copies of your code. They’re just pointers to commits.
That’s it. No hidden folders. No parallel universes. Just labels pointing at snapshots.
A -- B -- C (main)
<br> D (feature)
main is a pointer. feature is another pointer. HEAD is the one you’re currently standing on. When you commit, the pointer you’re on just moves forward.
That’s why branches are cheap. That’s why switching branches doesn’t duplicate files. That’s why nothing is as fragile as it feels.
The first time I ran:
git log --graph --oneline
and actually understood what I was looking at, Git stopped feeling dangerous. It felt… boring. Predictable. Calm.
And that’s the goal.
Once you stop thinking of Git as a set of commands and start seeing it as snapshots with movable pointers, the fear drops fast.
Nothing is magic anymore.
It’s just history.

Merges, rebases, and why people argue about them online
Once you understand commits and pointers, the merge vs rebase debate stops sounding religious and starts sounding… practical.
Here’s the simple version:
- Merge keeps history exactly as it happened
- Rebase rewrites history to make it look cleaner
That’s it. No good vs evil.
A merge says: “these things happened in parallel.”
A rebase says: “pretend they happened in a straight line.”
Merge:
A -- B -- C ---- M
\ /
D -- E
Rebase:
A -- B -- C -- D' -- E'
People get scared of rebase because rewriting history sounds dangerous. And it can be if you rewrite history other people are using. That’s where the horror stories come from.
But rebasing your own local work? That’s just editing your diary before anyone reads it.
The problem is teams often ban rebase instead of explaining it. So devs learn rules without reasons, and the fear sticks around.
Once you understand that both merge and rebase are just different ways of moving pointers, the arguments lose their bite.
They’re tools. Context matters.
Anyone telling you there’s only one right way is skipping the explanation part again.
why Git feels worse now (even if you’re better at it)
If Git feels more annoying than it used to, you’re not imagining it.
It’s not just you and it’s not Git itself. It’s everything wrapped around it.
Today, you’re not just dealing with Git. You’re dealing with pull requests, CI pipelines, bots, branch protections, required checks, and automated comments yelling at you for things you didn’t even touch.
You → Git → GitHub → CI → Bots → Policies
GitHub and GitLab made Git easier to use, but also easier to avoid understanding. You click buttons, resolve conflicts in a UI, and let automation decide what’s allowed.
That’s great… until something goes wrong.
Now you’re debugging history you didn’t write, conflicts you didn’t create, and rules nobody remembers adding. Git feels heavier, not because it changed, but because the ecosystem piled on top of it.
It’s like power steering. Driving got easier, but you lost road feel. When something slips, it’s harder to tell why.
Git didn’t get worse.
The stack around it got thicker.
And without a mental model, all that extra weight turns small problems into stressful ones.
The moment Git stops being scary
Git stops being scary the moment you realize you can almost always go back.
That’s the missing confidence piece.
Most fear around Git comes from thinking one wrong command will permanently destroy everything. It won’t. Git is built around history. And history is stubborn.
The first time this really clicked for me was discovering this:
git reflog
Reflog is basically Git’s secret save file. It tracks where HEAD has been, even if you rewrote history or checked out something weird. If you ever think “I’ve completely ruined this repo,” reflog is usually sitting there like, no, you haven’t.
Once you know you can recover, you stop tiptoeing.
You commit more freely. You experiment. You branch without fear. Git stops feeling like a minefield and starts feeling like a safety net.
That’s what mastery looks like with Git. Not speed. Not fancy commands.
Just the calm confidence that whatever you do, you can undo.
And once that fear is gone, Git finally feels like it’s working for you not against you.
Git isn’t hard, we just teach it badly
Looking back, Git was never the problem. The way we teach it is.
We start with commands instead of concepts. We hand people spellbooks instead of maps. Then we act surprised when they’re scared to touch anything outside the happy path.
Once you understand that Git is just snapshots and pointers, most of the fear evaporates. Merges stop feeling dangerous. Rebases stop feeling forbidden. Mistakes stop feeling permanent.
Better tools help, but they don’t replace understanding. GUIs, bots, and AI assistants can smooth the edges, but if you don’t know what’s happening underneath, the anxiety comes right back the moment something breaks.
The good news is this: if Git ever felt impossible, that wasn’t a skill issue. You weren’t missing intelligence. You were missing the mental model.
And once you have that, Git stops being magic.
It’s just history.
Helpful resources (no fluff, just good stuff)
If you want Git to really sink in, these explain the model, not just the commands:
- Official Git book (free, surprisingly good): https://git-scm.com/book/en/v2
- Learn Git Branching (visual, interactive, worth 20 minutes): https://learngitbranching.js.org/
- Visual Git reference (old-school but clear): https://marklodato.github.io/visual-git-guide/
- GitHub Flow (what most teams actually do): https://docs.github.com/en/get-started/quickstart/github-flow
Top comments (0)