How to stage changes in your working tree in the index to make them part of the next commit.
The two commands that stage your changes in the index:
git add
: Stage both new files and changes to existing filesgit rm
: Stage the deletion of currently tracked filesIMPORTANT: You must stage your changes in the index for them to be part of the next commit – changes only in your working tree have no effect on the next commit.
ALSO IMPORTANT: If you're experimenting, you can run:
$ git reset --hard
to undo all your local changes and staged content and start over.
Before staging:
$ git status On branch master Your branch is up to date with 'rpjday/master'. Untracked files: (use "git add <file>..." to include in what will be committed) newdir/ newfile nothing added to commit but untracked files present (use "git add" to track) $
Staging:
$ git add newfile newdir
After staging:
$ git status On branch master Your branch is up to date with 'rpjday/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: newdir/google-chrome new file: newdir/grub new file: newdir/useradd new file: newfile $
Before staging:
$ git status On branch master Your branch is up to date with 'rpjday/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: README.asc no changes added to commit (use "git add" and/or "git commit -a") $
Staging:
$ git add README.asc
After staging:
$ git status On branch master Your branch is up to date with 'rpjday/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: README.asc $
Before removal:
$ git status On branch master Your branch is up to date with 'rpjday/master'. nothing to commit, working tree clean $
Git removal:
$ git rm README.asc $ git rm -r theme/
After Git removal:
$ git status On branch master Your branch is up to date with 'rpjday/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) deleted: README.asc deleted: theme/epub/epub.css deleted: theme/epub/epub.xsl deleted: theme/epub/layout.html deleted: theme/html/html.css deleted: theme/html/html.xsl deleted: theme/mobi/mobi.css deleted: theme/mobi/mobi.xsl deleted: theme/pdf/pdf.css deleted: theme/pdf/pdf.xsl $
Stage all changes and deletions of existing files, but not addition of new files:
-u, --update Update the index just where it already has an entry matching <pathspec>. This removes as well as modifies index entries to match the working tree, but adds no new files. If no <pathspec> is given when -u option is used, all tracked files in the entire working tree are updated (old versions of Git used to limit the update to the current directory and its subdirectories).
Stage all changes, additions and deletions:
-A, --all, --no-ignore-removal Update the index not only where the working tree has a file matching <pathspec> but also where the index already has an entry. This adds, modifies, and removes index entries to match the working tree. If no <pathspec> is given when -A option is used, all files in the entire working tree are updated (old versions of Git used to limit the update to the current directory and its subdirectories).
Stage changes and additions, but not deletions:
--no-all, --ignore-removal Update the index by adding new files that are unknown to the index and files modified in the working tree, but ignore files that have been removed from the working tree. This option is a no-op when no <pathspec> is used. This option is primarily to help users who are used to older versions of Git, whose "git add <pathspec>..." was a synonym for "git add --no-all <pathspec>...", i.e. ignored removed files.
--cached Use this option to unstage and remove paths only from the index. Working tree files, whether modified or not, will be left alone.
-f, --force Override the up-to-date check.
where:
The files being removed have to be identical to the tip of the branch, and no updates to their contents can be staged in the index, though that default behavior can be overridden with the -f option.
Example:
$ git status On branch master Your branch is up to date with 'rpjday/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: README.asc no changes added to commit (use "git add" and/or "git commit -a" $
$ git rm README.asc error: the following file has local modifications: README.asc (use --cached to keep the file, or -f to force removal) $
Since Git cannot version empty directories, any git rm
command that results in any empty directories will result in the removal of all resulting empty directories.
$ git log --diff-filter=D --summary commit 97b26b7710aed5d41a6a079fbc7279e4bc31e1f5 Author: Adrien Ollier <aollier@users.noreply.github.com> Date: Mon Nov 12 12:40:05 2018 +0100 removed unused images delete mode 100644 images/emoji.png delete mode 100644 images/notifications.png commit 99c2df95f5839f6c6df75eedbfc06cac35389d91 Author: Adrien Ollier <aollier@users.noreply.github.com> Date: Thu Jun 15 12:52:03 2017 +0200 removed unused images delete mode 100644 book/04-git-server/images/gitlab-broadcast.png delete mode 100644 book/05-distributed-git/images/merging-workflows-4 2.png delete mode 100644 book/06-github/images/blink-pull-request-open copy.png delete mode 100644 book/06-github/images/blink-pull-request-open.png delete mode 100644 book/06-github/images/hubot.png ... snip ...
Display the most recent commit that references the file:
$ git log -1 -- OUTLINE.txt commit b86814bf758645cf1d0ea8a6cbfd1486d257f4dc Author: Scott Chacon <schacon@gmail.com> Date: Tue Oct 14 10:55:34 2014 +0200 remove changes notes and initial outline $
Now display its content from the previous commit (optionally redirect to file):
$ git show b86814bf758645cf1d0ea8a6cbfd1486d257f4dc^:OUTLINE.txt 1. Getting Started 1.1 About Version Control * Local Version Control Systems * Centralized Version Control Systems * Distributed Version Control Systems ... snip ...
You can also:
$ git rev-list -n 1 HEAD -- OUTLINE.txt b86814bf758645cf1d0ea8a6cbfd1486d257f4dc $