Learn Python with Talk Python's 270 hours of courses

Get inside the .git folder

Episode #311, published Thu, Apr 8, 2021, recorded Thu, Apr 1, 2021

These days Git is synonymous with source control itself. Rare are the current debates of whether to use git vs SVN vs some fossil like SourceSafe vs you name it. But do you know how Git works? What about it's internals? I'm sure you've seen a .git folder in your project's root. But to most folks, it's a black box.

In this episode, you'll meet Rob Richardson. He's going pop the lid on that black box as we dive into git internals and the .git folder, among other things source control.

Watch this episode on YouTube
Play on YouTube
Watch the live stream version

Episode Deep Dive

Guest introduction and background

Rob Richardson is a longtime software developer with over 20 years of programming experience. He started coding at a young age by tinkering with simple drawing programs and eventually turned his passion into a full-time career. Rob is well-versed in a wide array of technologies, including Python, ASP.NET, Node.js, and DevOps. He is also an active speaker and mentor within the developer community, frequently teaching and sharing his knowledge about version control, cloud-based development, and web technologies.

What to Know If You’re New to Python

If you are just beginning your Python journey, here are a few things mentioned in this episode to help you follow along with Git and source control:

  • Familiarize yourself with Python’s command-line usage (e.g., installing Python, creating virtual environments).
  • Understand basic terminal commands so you can navigate projects and work with Git more easily.
  • Practice version control in small, personal projects to build confidence before collaborating with others.

Key points and takeaways

  1. Inside the .git Folder The entire history of your project lives in the .git folder, including every commit, branch, and tag you’ve ever created. You can explore the objects, references, logs, configs, and hooks all within this directory. Having clarity on what’s inside makes Git less magical and helps you understand how to fix issues that arise.
  2. Distributed Version Control vs. Centralized Systems Unlike older centralized systems like Subversion, Git is a distributed version control system, meaning each clone of the repository includes the full history. This allows offline commits, easy branching, and powerful collaboration without requiring constant server communication.
  3. Refs and Branches Branches in Git are simply references (pointers) to specific commits rather than large or fragile structures. You can create a branch by adding a file in .git/refs/heads with the commit SHA you want it to point to. This design makes branching and merging lightweight and flexible.
    • Links and tools:
  4. Commit Save Points vs. Publishing Git empowers developers to commit code locally as often as needed (“save points”) without forcing these intermediate states on the entire team. Only once you perform a push do your changes get published to a shared remote. This separation encourages experimentation and rapid iteration.
  5. Hooks for Automation The .git/hooks folder contains scripts you can use to automate tasks such as code formatting, running tests, and checking commit messages. For instance, you can run Black before every commit or set up a pre-push hook to ensure your build passes.
  6. Recovering Lost Commits with reflog If you accidentally move or delete a branch before merging, git reflog can help you find the commit’s SHA so you can restore it. Git keeps a local log of where each reference pointed in the past, providing a time window to “undo” mistaken changes.
  7. Git Configuration Levels There are three main Git config levels: system, global (user-specific), and local (per-repository). For example, your name and email might be in ~/.gitconfig (global), while a remote URL and branch settings would live in .git/config of a specific project.
  8. Advanced Tools: Oh My Zsh and Oh My Posh Adding branch and Git status awareness to your terminal is straightforward with community tools like Oh My Zsh (macOS/Linux) and Oh My Posh (Windows). They give you a more informative prompt, often showing your current branch, commit status, and even things like local environment data.
  9. GitIgnore for Managing Untracked Files Projects typically include .gitignore files that exclude compiled code, large binaries, and OS-specific metadata from being committed. This helps maintain a clean repository and avoids merge conflicts over environment or build artifacts. GitHub even hosts a large set of common .gitignore templates for different languages.
  10. Scaling Git for Large Repositories When codebases become extremely large, operations like clone and checkout can take a long time. Solutions such as VFS for Git or partial cloning can selectively download file data when needed. This approach helps huge projects (like the Windows codebase) remain manageable.
  1. Confidence Through Version Control When you truly understand Git, you become fearless about experimenting with your code. Branching, rolling back commits, or refactoring is less risky because you can always revert mistakes. This encourages learning, innovation, and a smoother collaboration process.

Interesting quotes and stories

Rob’s Early Programming Spark: Rob shared how he discovered programming at around 10 years old by experimenting with drawing programs in the library. He recalled the thrill of making something “appear on the screen” purely from his own imagination and lines of code.

Git Fearlessness: The conversation highlighted that once you realize you can’t really “break” Git, you commit more often and explore more. As Rob said, “You can create these save points all the time without inflicting it on your teammates.”

Key definitions and terms

  • Distributed Version Control: Each working copy of the code is a full-fledged repository with a complete history, allowing easier branching and offline work.
  • Refs: Short for references, these are pointers in Git that track commit SHAs for branches and tags (found in the .git/refs folder).
  • Blob: A Git object type that contains file contents at the time of a commit, stored (often compressed) in .git/objects.
  • Index (Staging Area): A binary file .git/index used by Git to track changes that are added (staged) but not yet committed.

Learning resources

Overall takeaway

Git is an incredibly powerful yet approachable version control system once you understand its underlying structure. By exploring the .git folder and the fundamentals—objects, refs, logs, and hooks—you gain both the confidence and freedom to experiment freely with your code. Whether you’re a newcomer to Python or a seasoned developer, a solid grip on Git ensures smoother collaboration, easier rollbacks, and a more fearless approach to coding.

Links from the show

Rob's Site: robrich.org
Rob on Twitter: @rob_rich

YouTube Live Stream Recording: youtube.com

Talk at PWC: loudswarm.com
Git Explorer App: github.com
Pre-commit framework: pre-commit.com
.gitignore project: github.com
git-hooks project: npmjs.com
Git Source Control: git-scm.com
SVN: subversion.apache.org

Oh My Posh Shell: ohmyposh.dev
Oh My ZSH Shell: ohmyz.sh

Oh !*#! Git Site: oh*!#!git.com
Work-safe version: dangitgit.com
Episode transcripts: talkpython.fm

--- Stay in touch with us ---
Subscribe to Talk Python on YouTube: youtube.com
Talk Python on Bluesky: @talkpython.fm at bsky.app
Talk Python on Mastodon: talkpython
Michael on Bluesky: @mkennedy.codes at bsky.app
Michael on Mastodon: mkennedy

Talk Python's Mastodon Michael Kennedy's Mastodon