Introduction
git switch
and git checkout
are two essential commands that allow users to switch between branches in the current Git repository. Navigating through a repository is important in Git as it allows users to work on different features without affecting the stable code.
The git checkout
command is older, and one of its uses was creating and switching branches. The git switch
command was introduced later to provide better safety checks and usability.
This tutorial will compare the two commands, list their advantages and disadvantages, and explain when to use each of the two commands.
Prerequisites
- Git installed (install Git on Ubuntu, macOS, Windows, CentOS 7, or CentOS 8).
- A Git repository.
Git Checkout Overview
The git checkout
command is essential in the Git toolkit. It has multiple uses, including switching between branches or tags in a Git repository. It can also be used to restore files in the working tree, create new branches, or check out a single commit.
Depending on its usage, the syntax for the git checkout
command is:
- To switch branches, use the following syntax:
git checkout [branch_name]
To create a branch and switch to it, specify the -b
option. For example, the following command creates a new branch called testbranch and switches to it:
git checkout -b testbranch
- To restore files in the working directory to their state from a specific commit, use the syntax below:
git checkout [commit_hash] -- [file_path]
The [commit_hash]
is the unique identifier (hash) of the commit from which you want to retrieve the file.
- To check out a commit in order to explore it without affecting any branch, use the syntax below:
git checkout [commit_hash]
Note: Learn about different Git branching strategies and see the best practices and Git branch naming conventions.
Git Switch Overview
The git switch
command was introduced in Git version 2.23. The aim was to separate the functionality of git checkout
into two commands - git switch
for switching branches and git restore
for restoring working tree files.
Thus, the primary goal of the git switch
command is to switch between branches in a repository and simplify the process, making it more transparent and straightforward. It can also be used to create new branches and switch to them or the branch you were previously on.
The syntax for the git switch
command is:
git switch [options] [branch_name]
The [options]
are not mandatory, and they modify the command's behavior.
What Is the Difference Between Git Checkout and Git Switch?
Although both commands can switch branches, git switch
is more straightforward and explicit in its purpose. The git switch
command was specifically designed to switch branches and doesn't handle other operations like working with individual files.
In contrast, git checkout
has a broader range of functionalities, which can confuse new Git users. The command allows you to switch branches and copy files from any branch to the current one. Additionally, it lets you restore changes from a particular commit.
The Git team now advises users to use git switch
for branch operations and git restore
for file restorations. However, both operations can be done using git checkout.
The sections below provide an overview of the different options for both commands, the advantages and disadvantages of both commands, and provide useful examples.
Git Checkout vs. Git Switch: Options
The options allow you to utilize git switch
and git checkout
different functionalities and control the command's behavior. The sections below explore the available options for both commands and explain their usage.
Git Checkout
The options below provide specific functionalities when utilizing the git checkout
command in Git:
Option | Long Form | Description |
---|---|---|
-b | --branch | Create a new branch and check it out. |
-B | Force create/recreate a branch and check it out. | |
--detach | Detach HEAD at the specified commit and update the index and the files in the working tree. | |
-f | --force | Force checking out, discarding local changes and any untracked files or directories that are in the way. |
-q | --quiet | Suppress feedback messages. |
-t | --track | Create a new branch and set it to track a remote, upstream branch. |
-m | --merge | Perform a three-way merge between the current branch, your working tree contents, and the new branch. |
-p | --patch | Interactively select hunks from the diff between branches. Use it when selectively discarding edits from your current working tree. |
--ours | Resolve conflicts in favor of the current branch (ours ). | |
--theirs | Resolve conflicts in favor of the other branch (theirs ) | |
--orphan | Create a new orphan branch without any commit history. The first commit on the branch will have no parents, and it will be the root of a new history, disconnected from all other branches and commits. | |
--progress | Show progress when checking out branches. Useful for progress reporting when not attached to a terminal. |
Git Switch
The git switch
command accepts the following options:
Option | Long Form | Description |
---|---|---|
-c [branch-name] | --create | Create a new branch and switch to it. |
-C [branch-name] | --force-create | Create a new branch, even if it overwrites an existing branch. |
-d | --detach | Detach HEAD at the specified commit. |
-f | --force | Force switching branches, which discards local changes. |
-q | --quiet | Suppress feedback messages. |
-t | --track | Create a new branch that tracks a remote, upstream branch. Not specifying the -c option for the branch name derives the branch name from the remote-tracking branch. |
- | Switch to the previous branch. | |
--progress | Show progress when switching branches. This option is useful when you are not attached to a terminal. |
Git Checkout vs. Git Switch: Examples
This section provides useful examples for both commands. See how to utilize different options and customize the commands' behaviors:
Git Checkout
1. Checkout to a specific commit hash:
git checkout [commit_hash]
The command switches your working tree and HEAD to the specified commit hash. For example:
Note: You can find the commit hash by running the git log
command.
2. Checkout to a specific branch:
git checkout [branch_name]
This command switches your working tree and HEAD to the specified branch. For example:
The command checks out the new-branch branch.
3. Checkout to a specific remote branch:
git checkout -b [local_branch_name] [remote_branch_name]
This command creates a new local branch named [local_branch_name]
from the specified remote branch [remote_branch_name]
and switches your working tree and HEAD to the new local branch. For example:
4. Checkout to a specific tag:
git checkout [tag_name]
This command switches your working tree and HEAD to the commit associated with the specified tag. For example:
5. Checkout a specific file or directory:
git checkout [file_or_directory_path]
This command restores the specified file or directory to its state at the last commit. For example:
In this case, the file we attempted to check out was already in the same state as the version in the last commit, so Git makes no changes.
Git Switch
1. Switch to a specific branch:
git switch [branch_name]
This command switches your working tree and HEAD to the specified branch. The command is equivalent to git checkout [branch_name]
. For example:
2. Switch to a specific remote branch:
git switch -c [local_branch_name] [remote_branch_name]
This command creates a new local branch named [local_branch_name]
from the specified remote branch [remote_branch_name]
and switches your working tree and HEAD to the new local branch. The command is equivalent to git checkout -b [local_branch_name] [remote_branch_name]
. For example:
3. Move to a specific commit:
git switch --detach [commit_hash]
The --detach
option in git switch
moves to a specific commit without being on any branch, which puts you in a detached HEAD state. The state allows you to view, make changes, and commit, but no branch tracks the changes.
For example:
Note: Avoid making changes while in a detached HEAD state. Instead, create a new branch to make changes.
4. Switch to the previous branch:
git switch -
The command switches you to the branch you were previously on. For example:
Git Checkout vs. Git Switch: Advantages
Git Checkout
- Versatility.
git checkout
is more versatile thangit switch
as it handles various operations. This includes branch switching, checking out files, checking out commits, and more. - Historical Use. The
checkout
command has been part of the Git toolkit for a long time, making it more familiar to experienced Git users.
Git Switch
- Safety.
git switch
is designed specifically for branch operations. This feature reduces the risk of accidentally switching to a commit or detaching from a branch unintentionally. - Clear Purpose. The purpose of the
git switch
command is clear, which enhances readability and understanding within team workflows. - Improved Error Handling.
git switch
prevents certain operations that might lead to data loss, making it a safer choice for branch-related tasks.
Git Checkout vs. Git Switch: Disadvantages
Git Checkout
- Potential Data Loss.
git checkout
can lead to data loss if misused, especially when checking out commits or unintentionally detaching from branches. - Ambiguity. Although versatile, the command can lead to confusion or mistakes, as it's used for multiple purposes. Its versatility also makes it less clear in its intention compared to
git switch
.
Git Switch
- No Direct Commit Checkout. The command can't directly move to specific commits like
git checkout
does. - Compatibility. The command was introduced in Git version 2.23, which means
git switch
is not available in earlier Git versions. This reduces its compatibility with older Git installations.
Git Checkout vs. Git Switch: Which One Should You Use?
The choice between git switch
and git checkout
depends on multiple factors, including the level of safety and clarity you need in your Git workflow. Each command has its strengths and preferred use cases.
git checkout
is highly versatile and handles various operations in a Git workflow. Its flexibility is valuable when performing different tasks within the repository. However, it is also prone to ambiguity and potential data loss if not used correctly.
On the other hand, git switch
was explicitly tailored for branch operations. Its priority is safety, which is achieved by reducing the risk of accidental data loss during branch switches. However, its limitation is the inability to handle commit checkouts directly. If you need to switch to specific commits directly, a better choice is git checkout
.
Ultimately, understanding the strengths and weaknesses of each command allows you to choose the most suitable one based on your specific use case and workflow requirements.
Can You Use Git Checkout and Git Switch Interchangeably?
The two commands are somewhat interchangeable.
git switch
is recommended for branch operations due to improved safety checks, while git checkout
is a more robust and versatile tool for file and commit operations.
Nevertheless, it is possible to use them in the same workflow, but their purpose should be clarified. For example, your team can decide to use git switch
for branch switching and git checkout
for other operations, such as checking out a file, tag, or commit, or updating submodules.
Conclusion
This article has compared two essential Git commands, git switch
and git checkout
, and provided the advantages and disadvantages of each one. The easiest way to decide which one to use is to compare their functionalities, test them by following the examples in this article, and experiment with both.
For more Git tutorials, see how to clone a specific branch in Git or learn to Git push to a remote branch.