git: add files by hunk
Often I just want to commit some bits of a file and not others. Perhaps I have a change at the top that's ready to be committed but one at the bottom I want to defer.
For cases like this, simply use
git add -p
And git will interactively ask you about each hunk:
$ git add -p
diff --git a/chance.js b/chance.js
index ec32b52..cf4ddbb 100644
--- a/chance.js
+++ b/chance.js
@@ -143,6 +143,7 @@
Chance.prototype.integer = function (options) {
var num, range;
+ // This is a useless change, do not commit ;)
options = initOptions(options, {min : MIN_INT, max : MAX_INT});
Stage this hunk [y,n,q,a,d,/,e,?]?
It'll show you a diff for each one and you can add or ignore it.
Choosing the option ?
will bring up the help menu, which I've pasted below for convenience (shout out to @bobz for the suggestion!)
Stage this hunk [y,n,q,a,d,/,e,?]? ?
y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk nor any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk nor any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help
You'll see there are actually some hidden options there which can be quite useful!
I use it basically every time I commit so I added an alias for this in my .gitconfig:
[alias]
a = add -p
Then I can just use
git a
And it will ask me hunk by hunk what I want to commit.
Not only is this useful for staging only part of a file, but helps when working with a team as it'll force you to review each change before adding it.
Using this, I can make sure I'm never the guy who accidentally commits the merge conflict :)
Written by Victor Quinn
Related protips
2 Responses
Enhancement request: what do all the response options do?
Done! Thanks for the suggestion @bobz