If I have made multiple sets of changes to a large file, is it possible to split those into separate commits using git?
4 Answers
You want git add --patch (documentation), which will allow you to select which changes to stage.
5 Comments
git add --patch, please have the courtesy to provide an explanation as to why.git add -p which allows us to select which hunk to stageOne more option which I constantly use is just because i forget about the patch option :):
Say you have updated files: aaa.txt, bbb.txt, ccc.txt and you want to push the aaa.txt file in the first commit and then bbb.txt and ccc.txt in the second commit:
step 1:
--------------------
git add aaa.txt
git commit -m "Added first file"
git stash
git push
step 2:
--------------------
git stash pop
git add -A
git commit -m "Added the rest of the modified data"
git push
Might be a little more verbose, but in my opinion I it gives a bit more control.
Cheers!
Comments
Williams answer is perfectly valid. But sometimes it is easier to do things by hand. For example if you accidentally updated some third-party library with a lot of files before committing the changes you previously made. With git add -p (same as --patch) you would need to walk through all of this files. So in this case it is much more convenient to just stage the file you want to commit and do a second commit with all of the other changes:
> git add /path/to/your/file.txt
> git commit -m "my commit message"
[master a0c5ea6] my commit message
1 file changed, 2 insertions(+), 1 deletion(-)
> git add --all
> git commit -m "updated library xyz"
1 Comment
git add -p allows you to select the particular file at the command line, and within the interactive session you can jump to a particular hunk using g, or search for a hunk matching a regex using /. The point of add -p is to select hunks from a file, but this proposed solution requires adding the entire file, which is not what the OP wants.
rebase --interactiveis the way to go. If not,git add --patchis one of the options you should consider.