git add variations

2020-06-09

 | 

~3 min read

 | 

541 words

When adding files to my git staging area, I tend to like to review specific files and do so interactively using the -p flag to patch.

This allows me to stage specific hunks and split my commits into logical pieces.

But, what if I want to add multiple files at once? I have some options that all work slightly differently. Let’s take a look.

Below, I’ll explore these different options:

  1. git add -A (or git add --all)
  2. git add -u (or git add --update)
  3. git add .
  4. git add *

The example we’ll be working with is:

current-status
$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout --<file>..." to discard changes in working directory)
		deleted:	 deleted.txt
		modified:	 modified.txt
		deleted: 	 sub_dir/deleted.txt
		modified: 	 sub_dir/modified.txt

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

		.gitignore
		sub_dir/new_file.txt
		new_file.txt

no changes added to commit (use "git add" and/or "git commit -a"

git add -A

The first example, is git add -A (which is different than -a, which despite having references in the manual is now an unknown switch for git add):

$ git add -A
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   .gitignore
	deleted:    deleted.txt
	modified:   modified.txt
	new file:   new_file.txt
	deleted:    sub_dir/deleted.txt
	modified:   sub_dir/modified.txt
	new file:   sub_dir/new_file.txt

Here, everything was added to staging - including untracked files, deleted files, and files in subdirectories.

git add -u

Next up is git add -u which tracks updates. You can only update a tracked file, so:

$ git add -u
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	deleted:    deleted.txt
	modified:   modified.txt
	deleted:    sub_dir/deleted.txt
	modified:   sub_dir/modified.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	.gitignore
	new_file.txt
	sub_dir/new_file.txt

git add -u adds all files in the entire working tree

git add .

$ git add .
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   .gitignore
	deleted:    deleted.txt
	modified:   modified.txt
	new file:   new_file.txt
	deleted:    sub_dir/deleted.txt
	modified:   sub_dir/modified.txt
	new file:   sub_dir/new_file.txt

In this case, git add . actually behaves exactly the same as git add -A. However, that’s because I was in the root directory when I executed the command.

Notice how things change if I reset my working tree and then cd into the sub_dir:

$ cd sub_dir
$ git add .
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	deleted:    deleted.txt
	modified:   modified.txt
	new file:   new_file.txt

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	deleted:    ../deleted.txt
	modified:   ../modified.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	../.gitignore
	../new_file.txt

git add *

The star is actually a bash command, and it’s the wildcard. As a result, it can lead to some unexpected results where some deleted files get added to staging and others don’t. It’s not recommended.


Hi there and thanks for reading! My name's Stephen. I live in Chicago with my wife, Kate, and dog, Finn. Want more? See about and get in touch!