When I make changes to a file in Git, how can I commit only some of the changes?
For example, how could I commit only 15 lines out of 30 lines that have been changed
You can use git add --interactive
or git add -p <file>
, and then git commit
(not git commit -a
); see Interactive mode in git-add manpage, or simply follow instructions.
Modern Git has also git commit --interactive
(and git commit --patch
, which is shortcut to patch option in interactive commit).
If you prefer doing it from GUI, you can use git-gui. You can simply mark chunks which you want to have included in commit. I personally find it easier than using git add -i
. Other git GUIs, like QGit or GitX, might also have this functionality as well.
I believe that git add -e myfile
is the easiest way (my preference at least) since it simply opens a text editor and lets you choose which line you want to stage and which line you don't.
Regarding editing commands:
added content:
Added content is represented by lines beginning with "+". You can prevent staging any addition lines by deleting them.
removed content:
Removed content is represented by lines beginning with "-". You can prevent staging their removal by converting the "-" to a " " (space).
modified content:
Modified content is represented by "-" lines (removing the old content) followed by "+" lines (adding the replacement content). You can prevent staging the modification by converting "-" lines to " ", and removing "+" lines. Beware that modifying only half of the pair is likely to introduce confusing changes to the index.
Every details about git add
are available on git --help add
If it's on Windows
platform, in my opinion git gui
is very good tool to stage
/commit
few lines from unstaged
file
1. Hunk wise:
unstagged Changes
sectionStage Hunk for commit
2. Line wise:
unstagged Changes
section Stage Lines for commit
3. If you want to stage the complete file except couple of lines:
unstagged Changes
sectionCtrl+T (Stage file to commit)
Staged Changes
SectionUnStage Lines for commit
You can use git add --patch <filename>
(or -p
for short), and git will begin to break down your file into what it thinks are sensible "hunks" (portions of the file). It will then prompt you with this question:
Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?
Here is a description of each option:
If the file is not in the repository yet, you can first do git add -N <filename>
. Afterwards you can go on with git add -p <filename>
.
Afterwards, you can use:
git diff --staged
to check that you staged the correct changesgit reset -p
to unstage mistakenly added hunksgit commit -v
to view your commit while you edit the commit message.Note this is far different than the git format-patch
command, whose purpose is to parse commit data into a .patch
files.
Reference for future: Git Tools - Interactive Staging
Worth noting that to use git add --patch
for a new file you need to first add the file to index with git add --intent-to-add
:
git add -N file
git add -p file
It's been 10 years since this question was asked. And I hope this answer will be useful to someone. As mentioned in the answer here, where GUI is not an option, Andrew Shadura's crecord extension helps bring a ncurses window in which we can select the lines to commit.
Set up the extension as follows:
git clone https://github.com/andrewshadura/git-crecord
cd git-crecord
./setup.py install
ln -s $PWD/git-crecord ~/.local/bin/git-crecord
cd to your git repo and invoke it as follows:
git crecord
This would bring up the ncurses interface which can be used as shown below. Pressing the following keys in the ncurses window will do certain actions:
f hunk toggle fold (arrow keys can also be used)
space toggle hunk selection
a toggle commit or amend
c confirm and open commit window
Screencast showing a sample usage