Undoing add in Git

If you add a file to staging area and want to undo the action, use below command :

# Undo add action for a file
# --, the following parameter will be parsed as a file path
$ git reset HEAD -- <file-path>

# Examples:

# Undo add action for index.php
$ git reset -- index.php

If you want to undo add action for all files added to staging area :

$ git reset HEAD

If fact, git status tells you how to unstage a file :

$ git add index.php
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:    index.php

Undoing a commit in Git

Undo a commit in Git. Last updated: 2018-12-14

Undo a commit that hasn’t been push yet

If you made some mistakes in a commit, you can redo it in a new commit using --amend option. Just fix your mistakes, stage(add) them and make a new commit as below:

# Redo the last commit.
# --amend, replace the last commit with a new one.
$ git commit --amend

If above solution does not suit you, reset can be used to just undo the commit (be careful to use reset):

# Discard the last commit. The commit's modifications in working tree are kept.
$ git reset HEAD~

# Discard the last commit. The commit's modifications in staging area are kept.
$ git reset --soft HEAD~

# Discard the last commit. The commit's modifications in working tree are not kept.
$ git reset --hard HEAD~

Undo a commit that has been pushed

If a commit has been pushed to the remote repository, changing the history in the remote repository is not a good idea. You can let Git to make a new commit which reverses the modifications in the last commit.

git revert command works for you :

# Reverse a commit.
$ git revert -m 1 HEAD

Afterwards, push it to the remote repository again.

Undoing modifications of a file in Git

To discard the changes of a file no matter it is staged or not:

# Undo modifications of a file from working tree and index
$ git checkout -- <file>

# Examples:
# Undo modifications of index.php
$ git checkout -- index.php

If fact, git status tells you how to undo the changes:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   index.php

Note: stash command is a safer way to discard changes, because it allows you to revert the changes again. See stashing changes for how to use it.

Getting contents of a file in a specific commit in Git

Use below command to show contents of a file in a specific commit:

# Get contents of a file in a specific commit.
# <commit>, specify the commit, such as an commit id.
# <file-path>, file path of relative to the current directory.
$ git show <commit>:<file-path>

Examples:

# Get contents of asset/css/style.css in commit 8bc723c
$ git show 8bc723c:asset/css/style.css

# Get contents of asset/css/style.css in the parent commit.
$ git show HEAD~:asset/css/style.css

Deleting untracked files in Git

git clean command is used to remove untracked files in the working tree.

To delete all untracked files in the current directory, a safe way is to do 2 steps:

# Step 1, check what files will be deleted. 

# -n or --dry-run,  show what files will be deleted without actually deleting them.
$ git clean -n -d

# Step2, do actual deleting action.

# Delete untracked files and untracked directories. 
# -d, delete untracked dirctories. 
# -f, force to delete, if 'clean.requireForce' in Git confiuration is set to false, 'git clean'
# cleans nothing without '-f' option.
$ git clean -f -d

To remove untracked files with or without ignored files:

# Delete only ignored files.
$ git clean -f -X

# Delete untracked files, untracked directories and ignored files.
$ git clean -f -d -x