Skip to main content

Module 4: Commits, .gitignore, and Push

This module covers the most important daily Git cycle: inspect the state, select changes, create a commit, and push it to GitHub.

Before you begin​

Enter the repository you cloned in Module 2:

cd ~/git-projects/git-practice-remote
git status

Confirm that you are on main and that there are no unexpected changes. If your project is elsewhere, use its actual path.

Step 1: Edit a file and inspect its status​

Append one line to README.md:

echo "Learning Git step by step." >> README.md
git status

modified: README.md means the file in your working directory differs from the last commit.

See exactly which lines changed:

git diff

In a diff:

  • A line beginning with + was added.
  • A line beginning with - was removed.
  • These are diff markers, not part of the file's actual content.

Step 2: Add the change to the staging area​

git add README.md
git status

The file now appears under Changes to be committed. Before committing, inspect what the next commit will contain:

git diff --staged
Why not use git add . immediately?

git add . stages every change below the current directory. As a beginner, naming the file explicitly helps prevent test files, secrets, or unrelated changes from entering the commit.

If you staged the wrong file​

Remove the file from the staging area while keeping the working-directory changes:

git restore --staged README.md

After reviewing it, you can run git add README.md again.

Step 3: Create a commit​

git commit -m "docs: add Git learning note"

A useful commit message briefly explains what the version accomplishes. For example:

  • docs: update installation guide
  • feat: add login form
  • fix: handle empty username

Check the result:

git status
git log --oneline --decorate -5

working tree clean means every current change has been committed.

Step 4: Use .gitignore​

Some files should not be added to version control, including:

  • Password or secret files such as .env
  • Installed dependencies such as node_modules/
  • Python cache directories such as __pycache__/
  • Operating-system files such as .DS_Store
  • Build output or large temporary files

Create .gitignore:

.gitignore
.env
node_modules/
__pycache__/
*.pyc
.DS_Store

Then create a version:

git add .gitignore
git diff --staged
git commit -m "chore: add ignore rules"

Already tracked files are not ignored automatically​

If a file was committed before it was added to .gitignore, stop tracking it while keeping the local file:

git rm --cached <file>
git commit -m "chore: stop tracking generated file"

If a secret has already been pushed, deleting the current file is not enough. Revoke or rotate the secret immediately, then handle the repository history separately.

Step 5: Inspect an older version without changing history​

Find a commit ID:

git log --oneline

Temporarily inspect that version:

git switch --detach <commit-id>

Return to main when finished:

git switch main

A detached HEAD is useful for inspecting an old version, but not for long-term development. To keep new work based on an old version, create a branch:

git switch -c experiment-from-old-version <commit-id>

Step 6: Push to GitHub​

git push -u origin main
  • origin: the default name of the remote repository.
  • main: the local branch to push.
  • -u: links local main to origin/main; later, git push is usually enough.

After the push succeeds, refresh the repository page on GitHub. You should see the README, .gitignore, and latest commits.

Restore an uncommitted change​

To discard changes to one file in the working directory:

git restore <file>
This discards content

git restore <file> replaces your current changes with the version from the last commit. Run git diff first and make sure you no longer need the changes.

Pre-commit checklist​

git status
git diff
git add <file>
git diff --staged
git commit -m "Clearly describe the change"
git status

When the change should be synchronized to GitHub, run:

git push

Command reference​

CommandPurpose
git diffShow differences that are not staged
git add <file>Stage selected changes
git diff --stagedShow what the next commit will contain
git commit -m "..."Create a local version
git log --onelineShow a compact version history
git push -u origin mainPush for the first time and set the upstream
git restore --staged <file>Unstage a file but keep its changes
git restore <file>Discard uncommitted changes to a file