Git FAQ
Frequently asked questions around Git and Version Control.
Git FAQ featured image

Git-Apply: A Comprehensive Guide to Patch Management

Git-apply provides a way to apply changes to your codebase that come from outside your normal Git workflow. It's a flexible tool that gives you more control over how and when changes are incorporated into your project, especially when dealing with contributions or changes that don't come through typical means (like pull requests or direct commits), such as email.

This command allows for the use of patch files. Applying a patch is similar to manually implementing the changes or merging another branch that includes those changes. However, unlike merging or rebasing, applying a patch does not alter branch pointers or automatically create a commit.

So, once you apply a patch, keep in mind that you must manually stage and commit the changes.

How It Works

The git apply command takes a patch file as input.

This patch file contains a set of changes (additions, deletions, or modifications) to one or more files. It's essentially the result of the git diff command, organized in a format that can be applied to a different set of files.

When you run git apply, it reads this patch file and applies these changes to the corresponding files in your working directory. It doesn't create any commits or alter your Git history; it really only modifies the files in your working directory.

The full syntax would typically look something like this:

git apply [options] <patch_file>

For example, you could run:

git apply bugfix.patch

This command would instruct Git to take the changes described in the bugfix.patch file and apply them to your current working directory.

Scenarios Where Git-Apply Is Useful

There are several situations in which git apply can prove its usefulness. Here are the most common ones:

1. Collaborating without shared repositories

Imagine you're working on an open-source project, and a contributor who doesn't have push access to your repository sends you a patch file with some improvements.

This is common when dealing with email-based patches, for example — in many open-source projects, contributors send patches via email.

Git-apply enables you to easily apply these emailed patches to your local copy of the project. You can then test these changes in your local environment before deciding to incorporate them.

2. Applying changes across different branches or repositories

Let's say you have a bug fix in one branch that you want to apply to another branch without merging the entire branch.

You can create a patch from the bug fix commit and use git-apply to apply it to the other branch.

It's also possible to port changes between unrelated repositories; if you have two projects with similar codebases but separate Git histories, you might want to port a feature from one to the other.

You can create a patch of the feature and use git-apply to add it to the other project.

3. Staging changes selectively

You can use git apply with the --index option to apply changes to both the staging area (also known as the "index") and your working directory simultaneously. This allows you to stage the changes for commit immediately after applying the patch.

Let's imagine that you have a patch file bugfix.patch and you want to apply it and stage the changes:

git apply --index bugfix.patch

This command will apply the changes to your working directory and also add them to the staging area. After running this, if you do a git status you'll see the changes from the patch ready to be committed.

To illustrate the difference:

Without --index:

git apply bugfix.patch
git status

This might show the files as modified but not staged.

With --index:

git apply --index bugfix.patch
git status

This will show the files as modified and staged for commit.

These options can be particularly useful when you're working with patches and wish to automatically check their compatibility while staging the applied changes.

☝️ If you would like to apply changes only to the staging area without modifying the working directory, you would need to use a different Git command: git apply --cached.

4. Dry-run Testing

Before applying a patch, you may want to check if it will apply cleanly.

You can use git apply --check, which allows you to perform this check without actually modifying any files.

Let's say you have a patch file named feature.patch and you want to check if it can be applied without conflicts:

git apply --check feature.patch

If the command exits silently (no output), it means the patch can be applied cleanly. If there are problems, it will output error messages describing the issues.

For instance, if there's a conflict, you might see something like:

error: patch failed: src/main.js:100
error: src/main.js: patch does not apply

The Case for git am

Git am, short for "apply mailbox," is a powerful command that shines in specific scenarios, particularly in email-based workflows and when dealing with patch series.

In open-source projects or distributed teams that rely on email for patch submissions, git am is indispensable. It allows maintainers to easily apply patches sent via email, preserving the original author's commit information. This workflow is still common in projects like the Linux kernel development.

This command is also used when you have a series of related patches, perhaps exported from another branch or repository, and you would like to apply them sequentially while creating individual commits. This is particularly useful when you want to replay a series of changes on top of your current branch.

If you receive patches in mbox format (a common email archive format), git am can directly process these files, making it straightforward to apply multiple patches from a single file. It's quite flexible, too: it allows you to cherry-pick specific patches, giving you fine-grained control over which changes to incorporate.

Keep in mind that this command preserves commit metadata. If you're importing changes from another repository or developer and want to maintain the original commit information (author, date, and message), then git am is the tool of choice. It ensures that the applied commits retain their original metadata, which can be crucial for project history and attribution.

About Patch Files

A standard Git patch file includes:

  • File paths: Show the file(s) being modified.
  • Diff markers: Lines starting with diff --git denote the beginning of changes for a particular file.
  • Hunk headers: Lines that begin with @@ display the line numbers of the modifications in both the source and target files.
  • Changes: Lines that are added to a file are marked with +, while lines that are removed are marked with -.

Patches are easy to generate! Here's how you can quickly create a patch with the changes you want to include.

1. Creating a Patch File From Current Changes

If you would like to generate a patch for the modifications you've made locally that have not yet been committed, type the following command in the terminal:

git diff > changes.patch

This command sends the output of git diff to a file named changes.patch. As a result, a patch file will be created, capturing the differences between your local repository's state and that of the remote repository.

2. Generating a Patch from a Single Commit

To export the changes from a particular commit as a patch, use the following command in the terminal:

git format-patch -1 <commit_hash>

This command will create a .patch file for the commit identified by <commit_hash>. You can learn more about git format-patch here.

3. Creating a Patch Between Two Branches

To generate a patch that captures the differences between two branches, execute this command in the terminal:

git diff branch1..branch2 > branch_diff.patch

This command will compute the differences between branch1 and branch2 and save them into a file named branch_diff.patch.

Final Words

Throughout this guide, we've explored how git apply works, its various use cases, and how it differs from its cousin, git am. We've also looked into the creation and management of patch files, which are essential for this approach.

Git apply is a testament to Git's flexibility, providing the granularity and precision you need to integrate changes into your codebase. Whether you're a seasoned Git user or just starting out, having git apply in your arsenal will undoubtedly make you a more versatile and efficient developer.

About Us

As the makers of Tower, the best Git client for Mac and Windows, we help over 100,000 users in companies like Apple, Google, Amazon, Twitter, and Ebay get the most out of Git.

Just like with Tower, our mission with this platform is to help people become better professionals.

That's why we provide our guides, videos, and cheat sheets (about version control with Git and lots of other topics) for free.