Skip to main content

Commits

What Is a Commit?​

A commit is a saved snapshot of your project at a specific point in time.

Think of a commit as:

A safe checkpoint in your work

Each commit:

  • Saves the current staged changes
  • Gets a unique ID
  • Becomes part of the project history

What Happens Internally (Simple View)​

When you commit:

  • Git takes files from the staging area (index)
  • Creates a commit object
  • Stores it safely in the repository

Git is efficient:

  • Unchanged files are reused
  • Only new or changed content is stored
  • This makes commits fast and space‑efficient

You don’t need to worry about hashes or blobs at first — Git handles that.


How Often Should You Commit?​

That’s your choice.

Good practices:

  • Commit when a logical task is done
  • One feature = one commit
  • One bug fix = one commit

Git works very well with:

  • Many small commits
  • Or fewer large commits

Small commits are especially helpful when debugging.


Making a Commit​

Commit Only One File​

git commit -s file1

This commits only file1, even if other files are staged.

Commit Everything That Is Staged​

Any of these commands work:

git commit -s
git commit . -s
git commit -a -s

Notes:

  • -s adds a Signed-off-by line
  • -a automatically stages tracked files

What Changes During Commit?​

AreaWhat Happens
Working filesNo change
Staging areaNo change
Commit historyNew commit added
HEAD pointerMoves to new commit

After committing:

git diff

Shows no differences, because everything is saved.


Commit Identifiers (Hashes)​

Every commit gets a unique ID, for example:

56b24d1bbcff213dc9e1625eea5b8e13bb50feb8

This ID:

  • Uniquely identifies a commit
  • Is generated from the content
  • Ensures data integrity

You usually only need the first few characters.


Tags (Human‑Friendly Names)​

Tags give easy names to commits.

Instead of remembering hashes, you can do:

git tag v1.0

Or tag a specific commit:

git tag v1.0 08d869

Tags are useful for:

  • Releases
  • Stable versions
  • Milestones

Using a Tag​

To move your project to a tagged version:

git checkout v1.0

Viewing Commit History​

Basic History​

git log

Shows:

  • Commit ID
  • Author
  • Date
  • Message

Newest commits appear first.

One‑Line History​

git log --pretty=oneline

Example output:

4b4bf2c5 Fourth commit
55eceacc Third commit
f60c0c21 Second commit
712cbafa First commit

See Actual Changes​

git log -p

To inspect a specific commit:

git log -p f60c

This shows:

  • What changed
  • Which lines were added or removed
Summary
  • A commit saves your work locally
  • Commits form a history chain
  • Each commit has a unique ID
  • Tags give readable names to commits
  • git log lets you explore history easily

Reverting vs Resetting Commits​

Sometimes you commit something by mistake:

  • A bug
  • An unfinished feature
  • A wrong change

Git gives you two safe ways to undo commits.


git revert (Safe for Shared Repositories)​

What does git revert do?​

git revert undoes a commit by creating a new commit.

Think of it as:

“Make a new commit that cancels an old commit”

Example​

git revert <commit-id>

You can specify commits using:

  • HEAD → latest commit
  • HEAD~1 → previous commit
  • HEAD~2 → two commits ago
  • Commit hash (short or full)
  • Tag name

Important Behavior​

  • No history is deleted
  • A new commit is added
  • Safe when others already pulled your changes

What Changes with git revert?​

AreaEffect
Working filesUpdated
Staging areaClean
Commit historyNew commit added
Old commitsStill exist

git reset (For Local Undo)​

When to use reset​

Use git reset only if you are the only one using the branch.

Think of it as:

“Pretend these commits never happened”

Basic Reset​

git reset HEAD~2

This:

  • Removes last 2 commits from history
  • Keeps your files unchanged
  • Moves the branch pointer backward

Reset Modes​

--soft​

git reset --soft HEAD~1
  • Commits removed
  • Changes stay staged

--mixed (default)​

git reset HEAD~1
  • Commits removed
  • Changes unstaged

--hard (dangerous)​

git reset --hard HEAD~1
  • Commits removed
  • Files reset to old state
  • Changes are lost

⚠️ Never use --hard on shared branches


Saving Work While Cleaning Main Branch​

Example scenario:

  • Last 3 commits are experimental
  • Older commits are stable

Solution​

git branch work
git reset --hard HEAD~3
git checkout work

Result:

  • main is clean
  • Work continues safely in work branch

Cleaning and Optimizing a Repository​

Git Garbage Collection​

Over time, repositories grow in size.

git gc

This:

  • Removes unnecessary objects
  • Compresses data
  • Makes repo smaller and faster

Checking Repository Health​

git fsck

Finds:

  • Broken references
  • Dangling objects (usually safe)

Removing Dangling Objects​

Preview first:

git prune -n

Actually clean:

git prune

Who Changed This Line? (git blame)​

What is git blame?​

git blame shows:

  • Who modified each line
  • When it was changed
  • Which commit did it

Think of it as:

“Who touched this line?”

Basic Usage​

git blame file.txt

Output shows:

  • Commit ID
  • Author
  • Date
  • Line content

Blame a Line Range​

git blame -L 10,20 file.txt

Useful for:

  • Debugging bugs
  • Code reviews
  • Understanding legacy code
Summary
  • Use git revert for shared branches
  • Use git reset only locally
  • --hard can destroy work
  • git gc cleans your repo
  • git blame tells who changed what

What problem does git bisect solve?​

Sometimes your code used to work, but after many commits, it no longer works. You don’t know which commit introduced the bug.

git bisect helps you quickly find the exact commit that broke things

Instead of checking every commit one by one, Git uses a binary search, which is much faster.

Example: If the bug was introduced somewhere in the last 1024 commits, Git can find it in about 10 steps.

Basic Idea​

  1. Tell Git which commit is bad (bug exists)
  2. Tell Git which commit is good (works fine)
  3. Git checks a commit in the middle
  4. You test and mark it good or bad
  5. Repeat until the exact bad commit is found

Step-by-Step: Manual Bisect​

1. Start bisect mode​

git bisect start

2. Mark the current commit as bad​

git bisect bad

3. Mark a known good commit​

git bisect good V_10

4. Test and report​

If the bug is present:

git bisect bad

If the bug is not present:

git bisect good

5. Exit bisect mode​

git bisect reset

If you have a test script:

  • Exit code 0 → good
  • Exit code 1–127 → bad

Run:

git bisect start
git bisect bad
git bisect good V_10
git bisect run ./myscript.sh

Tips​

  • Small commits make bugs easier to find
  • Automated tests make bisect very powerful
  • Great for finding regressions