Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Increase git hunk granularity

Tags:

git

I usually add changes with git add -p, and many times there are large hunks with several blocks of code, separated by blank lines.

However, git won't split the hunk any further, and I have to resort to manual editing.

How can I increase the granularity of the hunks, such that every block of code will be in a separate hunk?

Edit: This is a different question from Git: show more context when using git add -i or git add -e?, since I'M not looking to increase the context around each hunk, but rather increase the number of hunks.

like image 625
dimid Avatar asked Jan 05 '16 10:01

dimid


2 Answers

It cant be done,

These are the options you can do within add -p:

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 and all the remaining hunks in the file
d - do not stage this hunk nor any of the remaining 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

Once you use the s it will pick the chunk of code which can be considered as a standalone change. If you want to split it even more you will have to use the e to edit the hunk and then add it back to the stage area.

Summary:

To split hunks you use the s flag.
If you need to split it into even smaller chunks you will need to manually edit it using the e option.

enter image description here

like image 175
CodeWizard Avatar answered Sep 23 '22 03:09

CodeWizard


As @codeWizard said in his answer, git just doesn't support what you want, and it hence can't be done in git add.

Now, you could write a script yourself that does the following:

  1. copy your locally changed version of to somewhere outside the tree
  2. git checkout -- <changedfile> to bring your modified file to an unmodified state
  3. write a user interface of your own to select ranges in the file that you want to add now
  4. add the modifications to the in-tree .
  5. git commit
  6. If desirable, go to 3. again
like image 41
Marcus Müller Avatar answered Sep 22 '22 03:09

Marcus Müller