DaleSchool

Git and Version Control

Beginner20min

Learning Objectives

  • Explain why a version control system is needed
  • Install Git and complete the initial setup
  • Create a new repository with git init
  • Understand the output of git status

Working Code

Example 1: Checking your Git installation and configuration

Check if Git is installed:

git --version

Expected output:

git version 2.43.0

Any version 2.x or higher will work. If Git is not installed:

# macOS
brew install git

# Verify
git --version

Initial setup (one-time only, applies to all projects):

git config --global user.name "John Doe"
git config --global user.email "john@example.com"

Example 2: Creating your first repository

mkdir my-project
cd my-project
git init

Output:

Initialized empty Git repository in /Users/dale/my-project/.git/

Example 3: Checking status with git status

git status

Output:

On branch main

No commits yet

nothing to commit (create/copy files and use "git add" to track)

Create a file and check again:

echo "# My First Project" > README.md
git status

Output:

On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	README.md

nothing added to commit but untracked files present

Untracked files are files Git is not yet tracking. They appear in red.

Git 터미널

Start with git --version. Then try git init to initialize a repository.

user@daleschool:~/myproject$

Try It Yourself

git status color meanings

git status

Output colors:

  • Red: Untracked or modified but not staged
  • Green: Staged files (waiting to be committed)
# Add files
echo "First file" > file1.txt
echo "Second file" > file2.txt
git status

Output:

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	README.md
	file1.txt
	file2.txt
# Stage one file
git add README.md
git status

Output:

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   README.md    <- green

Untracked files:
	file1.txt                <- red
	file2.txt

What is HEAD?

HEAD is a pointer to your current working position.

Commit A -> Commit B -> Commit C
                            ^
                           HEAD (current position)

Right now there are no commits, so HEAD has nothing to point to. It becomes active after the first commit.

Git 터미널

Initialize a repository with git init, create some files, and check the status with git status.

user@daleschool:~/myproject$

"Why?" -- What if there were no version control?

Without version control, you end up with problems like these:

  • project_final.zip, project_final_v2.zip, project_final_REALLY_FINAL.zip
  • "It worked yesterday but broke today" -- no idea what changed
  • A teammate edits the same file and someone's work gets overwritten

Git solves all of these:

ProblemGit Solution
Multiple file versionsSnapshots saved as commits
What changed?git diff shows change history
Revert to a previous versionRestore from commit history
Team collaboration conflictsBranches and merges manage conflicts

Git's three areas

Working Directory -> (git add) -> Staging Area -> (git commit) -> Repository
  • Working Directory: Where your actual files live
  • Staging Area: A holding area for changes to include in the next commit
  • Repository: Where commit history is stored (the .git directory)

Common Mistakes

Mistake 1: Forgetting git config

git commit   # Without setting up identity
# Author identity unknown
# Please tell me who you are.

Set your name and email first:

git config --global user.name "Your Name"
git config --global user.email "your@email.com"

Mistake 2: Running git init inside a nested directory

cd ~/projects/myapp
git init

# Accidentally running it again in a subdirectory
cd src
git init   # Creates a nested repository

Run git init only once, at the project root.

Mistake 3: Deleting the .git directory

# Never do this!
rm -rf .git   # All Git history is gone

The .git directory is Git's database. Deleting it is irreversible.

Deep Dive

Checking and managing git config

Your settings are stored in ~/.gitconfig:

git config --list

Output:

user.name=John Doe
user.email=john@example.com
core.editor=vim

Check individual settings:

git config user.name
# John Doe

# View the global config file directly
cat ~/.gitconfig

Per-project settings (local config):

# Use a different email for a specific project
git config user.email "work@company.com"  # Without --global, it's project-specific
Inside the .git directory

git init creates a hidden .git directory:

ls .git/

Output:

HEAD        config      description hooks/      info/       objects/    refs/

Key files:

  • HEAD: Pointer to the current branch
  • config: Repository-specific settings
  • objects/: Actual commit, file, and tree data (stored as SHA-1 hashes)
  • refs/: Branch and tag pointers

Understanding this structure reveals how Git works under the hood.

Setting the default branch name (main vs master)

Recent Git versions default to main:

# Set default branch name for new repositories
git config --global init.defaultBranch main

For existing repositories created with master:

# Rename master to main
git branch -m master main
  1. Run git --version to verify Git is installed.
  2. Set your name and email with git config --global user.name "Name" and git config --global user.email "email".
  3. Create a new directory and initialize it with git init.
  4. Create a README.md file and run git status. Think about what the red and green items mean.
  5. Run git config --list to review your current settings.
Git 터미널

Create a repository with git init, add files, and observe changes with git status.

user@daleschool:~/myproject$

What is the difference between red and green files in git status?