惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cloudbric
Cloudbric
Schneier on Security
Schneier on Security
V2EX - 技术
V2EX - 技术
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
O
OpenAI News
S
Security @ Cisco Blogs
Scott Helme
Scott Helme
Security Archives - TechRepublic
Security Archives - TechRepublic
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
WordPress大学
WordPress大学
云风的 BLOG
云风的 BLOG
T
Threatpost
Hacker News: Ask HN
Hacker News: Ask HN
Microsoft Azure Blog
Microsoft Azure Blog
Know Your Adversary
Know Your Adversary
博客园 - 三生石上(FineUI控件)
A
About on SuperTechFans
Forbes - Security
Forbes - Security
NISL@THU
NISL@THU
Security Latest
Security Latest
G
Google Developers Blog
D
Docker
T
Threat Research - Cisco Blogs
N
Netflix TechBlog - Medium
C
CERT Recently Published Vulnerability Notes
H
Help Net Security
B
Blog
Martin Fowler
Martin Fowler
N
News and Events Feed by Topic
Simon Willison's Weblog
Simon Willison's Weblog
Hacker News - Newest:
Hacker News - Newest: "LLM"
L
Lohrmann on Cybersecurity
Y
Y Combinator Blog
PCI Perspectives
PCI Perspectives
F
Fortinet All Blogs
MyScale Blog
MyScale Blog
Project Zero
Project Zero
爱范儿
爱范儿
Cisco Talos Blog
Cisco Talos Blog
博客园 - 聂微东
Hugging Face - Blog
Hugging Face - Blog
人人都是产品经理
人人都是产品经理
V
Vulnerabilities – Threatpost
P
Proofpoint News Feed
Cyberwarzone
Cyberwarzone
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
TaoSecurity Blog
TaoSecurity Blog
N
News | PayPal Newsroom
Recorded Future
Recorded Future

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
Git Under the Hood: What Actually Happens When You Commit
ufraaan · 2026-05-01 · via DEV Community

I used to just memorize git commands without understanding what was going on behind the scenes. Add, commit, push, and hope it works. Then one day I actually opened the .git folder and everything clicked.

This post covers the basics of how Git works internally, how to configure it properly, and how branches and merging actually function. If you are tired of blindly typing commands and want to understand what Git is actually doing, this is for you.

Setting Up Git Properly

When you first install Git, it needs to know who you are. Every commit gets tagged with a name and email, so Git stores these in a file called .gitconfig.

You can set these globally, which means every repository on your machine uses the same identity. Or you can set them locally per project. Most people go global for their name and email since those do not change.

You can also change your default editor. Git loves opening Vim for commit messages, which is fine if you know Vim, but most beginners would rather just use VSCode. Run this to fix that:

git config --global core.editor "code --wait"

Enter fullscreen mode Exit fullscreen mode

The --wait flag is important. It tells Git to pause and wait until you close the editor window before it continues.

Then set your name and email:

git config --global user.name "ufraan"
git config --global user.email "ufraan1@gmail.com"

Enter fullscreen mode Exit fullscreen mode

You can check what you set by running the same commands without the values. These settings live in your .gitconfig file. On Linux or macOS it is at ~/.gitconfig. On Windows it is at C:\Users\<YourUsername>\.gitconfig. Open it up and you will see your settings, plus any SSH keys you have configured for talking to GitHub or GitLab.

The .gitignore File

Git tracks everything by default. That means build artifacts, environment files with your API keys, node_modules, and random OS metadata all get picked up. You do not want any of that in your repository.

Create a .gitignore file in your project root to tell Git what to ignore:

node_modules/
*.log
.DS_Store
*.pyc
.env

Enter fullscreen mode Exit fullscreen mode

Quick breakdown of what these cover:

  • node_modules/ gets massive and you can always reinstall it with npm install
  • *.log files are just program output
  • .DS_Store is macOS metadata that has nothing to do with your code
  • *.pyc are compiled Python files generated automatically
  • .env usually has secrets and should never be committed

If you are starting a new project and do not know what to put in there, search for "gitignore generator" online. Pick your tech stack and it will give you a ready-made template.

Once your .gitignore is set up:

git add .
git commit -m "Initial commit"
git log

Enter fullscreen mode Exit fullscreen mode

The git add . command automatically respects your .gitignore file, so it will not stage anything you told it to ignore.

What Happens Behind the Scenes

Run git log --oneline and you will see short commit hashes and your messages. You might also see something like HEAD -> master. But what is actually happening?

Every commit stores a reference to the previous commit. Except the very first one, which has no parent. Each commit also gets a unique hash that acts like a fingerprint for that snapshot. This creates a chain of commits going all the way back to the beginning.

You can see this for yourself by peeking into the .git folder:

ls -la
cd .git
ls

Enter fullscreen mode Exit fullscreen mode

You will find a few important things inside:

  • HEAD points to the branch you are currently on. Open it and you will see something like ref: refs/heads/master
  • objects/ stores all your actual data, including commits and file contents
  • refs/ stores branch pointers
  • logs/ keeps a history of changes to HEAD and other references

So when you run git commit, Git creates a new commit object in the objects directory, updates the branch pointer in refs, and HEAD follows the current branch. That is the whole process.

Understanding Git Branches

Branches are basically parallel timelines for your project. You can work on a feature in isolation without touching the main codebase. Git creates a default branch called master (or main on newer setups), which is usually where the stable version lives.

Let us walk through how this actually works. Create a new folder and initialize a repo:

mkdir gittwo
cd gittwo
git init
git status

Enter fullscreen mode Exit fullscreen mode

After git init, you will see "On branch master". Create a file and track it:

# Create an index.html file with some basic HTML
git status
git add index.html
git commit -m "add index file"
git branch

Enter fullscreen mode Exit fullscreen mode

The output shows * master. The asterisk means that is where HEAD is pointing.

Now make some changes and commit again:

git add index.html
git commit -m "update code for index file"

Enter fullscreen mode Exit fullscreen mode

Let us say you need to work on a navigation bar without affecting master. Create a branch:

git branch nav-bar
git branch

Enter fullscreen mode Exit fullscreen mode

You will see nav-bar listed below master, and the asterisk is still on master. You created the branch but you are not on it yet. Switch over:

git checkout nav-bar
# or the newer command:
git switch nav-bar

git branch

Enter fullscreen mode Exit fullscreen mode

Now the asterisk moved to nav-bar. Create a file on this branch:

# Create nav-bar.html
git add nav-bar.html
git commit -m "add navbar to codebase"

Enter fullscreen mode Exit fullscreen mode

Now switch back to master:

git checkout master

Enter fullscreen mode Exit fullscreen mode

Notice that nav-bar.html disappeared from your editor. It is not deleted. It just lives on the nav-bar branch now. This is the key thing about branches. Each branch has its own working directory state. Switch back to nav-bar and the file comes right back.

You can always check where HEAD points:

git branch
git log --oneline
# Shows HEAD -> master or HEAD -> nav-bar

Enter fullscreen mode Exit fullscreen mode

A few useful branch commands to keep around:

git branch                  # list all branches
git branch bugfix           # create a new branch without switching
git switch bugfix           # switch to a branch
git switch -c dark-mode     # create and switch in one step
git checkout -b pink-mode   # same thing, older syntax
git branch -d branch-name   # delete a branch

Enter fullscreen mode Exit fullscreen mode

One thing to remember. Always commit your changes before switching branches. If you leave work uncommitted and switch, it can either follow you to the new branch or cause problems. Just commit first.

Merging Branches

Once you are done on a branch, you need to bring those changes back into master. That is what merging does.

Fast-Forward Merge

This is the simple case. If master has not changed since you created your branch, Git just moves the master pointer forward to your latest commit. No extra merge commit needed.

git checkout master
git merge nav-bar

Enter fullscreen mode Exit fullscreen mode

Non-Fast-Forward Merge

If both master and your branch have new commits since you split off, Git cannot just fast-forward. It has to create a merge commit that combines both histories. You can also force this behavior even when a fast-forward is possible:

git checkout master
git merge --no-ff nav-bar

Enter fullscreen mode Exit fullscreen mode

The --no-ff flag creates an explicit merge commit. This is useful if you want to keep a clear record of when a feature branch was integrated, even if a fast-forward was possible.

Let us try merging in practice:

git checkout master
git merge nav-bar -m "merge navbar"
git log --oneline

Enter fullscreen mode Exit fullscreen mode

The nav-bar commits are now part of master. You can see nav-bar.html in your editor alongside the other files. Once merged, you can clean up the branch:

git branch -d nav-bar

Enter fullscreen mode Exit fullscreen mode

Do it again with another branch:

git checkout -b footer

# Create footer.html
git add footer.html
git commit -m "add footer section to codebase"

git checkout master
git merge footer

Enter fullscreen mode Exit fullscreen mode

Now footer.html appears in master as well.

Resolving Merge Conflicts

Conflicts happen when two branches modify the same part of the same file. Git does not know which version to keep, so it stops and asks you to decide.

Here is how to trigger and fix one:

# On master, modify index.html
# Add "footer added" inside the body tag
git add index.html
git commit -m "add footer in index file"

# Switch to footer branch
git checkout footer

# Modify the same file differently
# Add "footer was added successfully" inside the body tag
git add index.html
git commit -m "update index file with footer code"

# Switch back to master and try to merge
git checkout master
git merge footer

Enter fullscreen mode Exit fullscreen mode

Git will stop and tell you there is a conflict. Open index.html and you will see something like:

<<<<<<< HEAD
footer added
=======
footer was added successfully
>>>>>>> footer

Enter fullscreen mode Exit fullscreen mode

The section between <<<<<<< HEAD and ======= is your current branch. The section between ======= and >>>>>>> footer is the incoming branch. You need to pick one, combine them, or write something entirely different. Then delete the conflict markers completely.

Once the file looks right:

git add index.html
git commit -m "resolve conflict in index file"

Enter fullscreen mode Exit fullscreen mode

That is it. The conflict is resolved and both branches are merged into master.

My Git Aliases

I use a few aliases to save myself from typing the same commands over and over. Here is what I have in my .zshrc:

alias gs='git status'
alias ga='git add'
alias gcm='git commit -m'
alias gp='git push'
alias gpl='git pull'
alias gc='git clone'
alias gb='git branch'

Enter fullscreen mode Exit fullscreen mode

They are nothing fancy, but gcm and gs alone save a ton of keystrokes over the course of a day.

Wrapping Up

If you want to go deeper into how Git actually works, the Pro Git book is the best resource out there. It is free to read online at https://git-scm.com/book/en/v2 and covers everything from basics to advanced internals. I highly recommend it if you really want to master Git.

Git stops being scary once you understand what is happening under the hood. Commits are just snapshots linked in a chain. Branches are pointers to those snapshots. Merging is moving pointers around. The .git folder is not some black box. It is just files and references that you can look at whenever you want.

Adios! :)