List which files are staged, unstaged, and untracked.
git status command is a relatively straightforward command. It simply shows you what's been going on with
git add and
git commit. Status messages also include relevant instructions for staging/unstaging files. Sample output showing the three main categories of a
git status call is included below:
# On branch main
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
# 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)
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
Untracked files typically fall into two categories. They're either files that have just been added to the project and haven't been committed yet, or they're compiled binaries like
.exe, etc. While it's definitely beneficial to include the former in the
git status output, the latter can make it hard to see what’s actually going on in your repository.
For this reason, Git lets you completely ignore files by placing paths in a special file called
.gitignore. Any files that you'd like to ignore should be included on a separate line, and the * symbol can be used as a wildcard. For example, adding the following to a
.gitignore file in your project root will prevent compiled Python modules from appearing in
It's good practice to check the state of your repository before committing changes so that you don't accidentally commit something you don't mean to. This example displays the repository status before and after staging and committing a snapshot:
# Edit hello.py
# hello.py is listed under "Changes not staged for commit"
git add hello.py
# hello.py is listed under "Changes to be committed"
# nothing to commit (working directory clean)
The first status output will show the file as unstaged. The
git add action will be reflected in the second
git status, and the final status output will tell you that there is nothing to commit—the working directory matches the most recent commit. Some Git commands (e.g., git merge) require the working directory to be clean so that you don't accidentally overwrite changes.
git log command displays committed snapshots. It lets you list the project history, filter it, and search for specific changes. While
git status lets you inspect the working directory and the staging area,
git log only operates on the committed history.
Log output can be customized in several ways, from simply filtering commits to displaying them in a completely user-defined format. Some of the most common configurations of
git log are presented below.
Display the entire commit history using the default formatting. If the output takes up more than one screen, you can use
Space to scroll and
q to exit.
Limit the number of commits by
. For example,
git log -n 3 will display only 3 commits.
Condense each commit to a single line. This is useful for getting a high-level overview of the project history.
Along with the ordinary
git log information, include which files were altered and the relative number of lines that were added or deleted from each of them.
Display the patch representing each commit. This shows the full diff of each commit, which is the most detailed view you can have of your project history.
git log --author="<pattern>"
Search for commits by a particular author. The
＜pattern＞ argument can be a plain string or a regular expression.
git log --grep="<pattern>"
Search for commits with a commit message that matches
＜pattern＞, which can be a plain string or a regular expression.
Show only commits that occur between
< since > and
< until >. Both arguments can be either a commit ID, a branch name,
HEAD, or any other kind of revision reference.
Only display commits that include the specified file. This is an easy way to see the history of a particular file.
git log --graph --decorate --oneline
A few useful options to consider. The --graph flag that will draw a text based graph of the commits on the left hand side of the commit messages. --decorate adds the names of branches or tags of the commits that are shown. --oneline shows the commit information on a single line making it easier to browse through commits at-a-glance.
5. Check the status of the file.
Author: John Smith
Most of this is pretty straightforward; however, the first line warrants some explanation. The 40-character string after
commit is an SHA-1 checksum of the commit’s contents. This serves two purposes. First, it ensures the integrity of the commit—if it was ever corrupted, the commit would generate a different checksum. Second, it serves as a unique ID for the commit.
This ID can be used in commands like
git log .. to refer to specific commits. For instance,
git log 3157e..5ab91 will display everything between the commits with ID's
5ab91. Aside from checksums, branch names (discussed in the Branch Module) and the HEAD keyword are other common methods for referring to individual commits.
HEAD always refers to the current commit, be it a branch or a specific commit.
The ~ character is useful for making relative references to the parent of a commit. For example,
3157e~1 refers to the commit before
HEAD~3 is the great-grandparent of the current commit.
The Usage section provides many examples of
git log, but keep in mind that several options can be combined into a single command:
git log --author="John Smith" -p hello.py
This will display a full diff of all the changes John Smith has made to the file
The .. syntax is a very useful tool for comparing branches. The next example displays a brief overview of all the commits that are in
some-feature that are not in
git log --oneline main..some-feature