Git is designed to be a distributed version control system. You can actually
send a patch for someone to review without the need to have a centralized Git
repository using the git format-patch
feature. This is very useful when your
remote Git repository is down.
Preparing a patch
When you’re ready to send the changes, use git format-patch [BASE_BRANCH_NAME]
:
$ git format-patch master
0001-Update-build-matrix.patch
0002-Display-current-gemfile-when-run-bundle-update.patch
Since my feature branch is two commits ahead of master
, Git creates two files,
one for each commit. If you inspect the file, you will see the changes alongside
your commit message:
From b2df28155560c68772063df3b3250d811e66f35e Mon Sep 17 00:00:00 2001
From: Prem Sichanugrist <prem@example.com>
Date: Mon, 25 Jan 2016 18:18:38 -0500
Subject: [PATCH 1/2] Update build matrix
Build Appraisal against these versions of Ruby
... snip ...
---
.travis.yml | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index 6b56084..52d0bff 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -3,12 +3,12 @@ sudo: false
before_install: gem install bundler
rvm:
- - 1.8
- - 1.9
- - 2.0
- - 2.1
... snip ...
--
2.7.0
If you want to create just one file, to more easily use as an attachment or
upload somewhere else, you can use the --stdout
option and redirect the output
to a file:
$ git format-patch master --stdout > new-feature.patch
$ cat new-feature.patch
From b2df28155560c68772063df3b3250d811e66f35e Mon Sep 17 00:00:00 2001
From: Prem Sichanugrist <prem@example.com>
Date: Mon, 25 Jan 2016 18:18:38 -0500
Subject: [PATCH 1/2] Update build matrix
Build Appraisal against these versions of Ruby
... snip ...
--
2.7.0
From 54c7c4b5df552ef7540d4612c17dbbcc1079f47c Mon Sep 17 00:00:00 2001
From: Prem Sichanugrist <prem@example.com>
Date: Mon, 25 Jan 2016 18:14:06 -0500
Subject: [PATCH 2/2] Display current gemfile when run `bundle update`
This is done by setting `gemfile` setting directly and not through
`BUNDLE_GEMFILE` setting.
---
... snip ...
While it’s possible to use git diff
and pipe the changes to a file, I think
git format-patch
is a better way because it includes the commit message
describing the changes you made.
To review a patch
When you receive a patch file from someone, you can easily apply the patch using
the git am
command:
# Checkout to a new branch
$ git checkout review-new-feature
# If you received the patch in a single patch file
$ cat new-feature.patch | git am
# If you received multiple patch files
$ cat *.patch | git am
# Check the result
$ git log --oneline
6787572 Display current gemfile when run `bundle update`
928928c Update build matrix
...
Note that the SHA of the patch that you merge with git am
will not be the same
SHA. However, the commit message will be intact.
If you are just getting started using Git, be sure to check out our new book titled Goal-Oriented Git which is currently in beta. It will help you get up to speed on how to use Git on your day-to-day work. If you are already feeling confident, you can check out our Mastering Git trail on Upcase which should help you on your path towards becoming a Git expert. The first three exercises in the trail are free.