Categories
git git-commit

Commit only part of a file in Git

3301

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 in a file?

2

  • 7

    related stackoverflow.com/q/34609924/52074: if you need to split a hunk into smaller hunks.

    Oct 31, 2018 at 14:56

  • 5

    Summary: in terms of capability: git gui = git add -e > git add -i -p; in terms of convenience: git gui > git add -i -p > git add -e. So: pick git gui when you have access to X. pick git add -i -p for simple stuff and when you don’t have or want to use X. git add -e for complex staging without X.

    Jul 5, 2019 at 16:08


4467

+300

You can use:

git add --patch <filename>

or for short:

git add -p <filename>

Git will 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:

  • y stage this hunk for the next commit
  • n do not stage this hunk for the next commit
  • q quit; do not stage this hunk or any of the remaining hunks
  • a stage this hunk and all later hunks in the file
  • d do not stage this hunk or 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
    • You can then edit the hunk manually by replacing +/- by # (thanks veksen)
  • ? print hunk help

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 changes
  • git reset -p to unstage mistakenly added hunks
  • git 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

14

  • 124

    It’s might be useful to note that -p/--patch is a shortcut to the patch action inside the -i/--interactive command that initiates the useful Interactive mode.

    Feb 15, 2015 at 9:30

  • 7

    >What happens if that file is already staged? It will show only unstaged changes. Same as git diff does.

    Jun 3, 2015 at 9:52

  • 4

    How can I edit the current hunk manually? I don’t know what to do after I type e.

    – Hunsu

    Nov 1, 2015 at 13:47

  • 39

    After pressing e, You can edit the hunk manually by replacing + or - by #

    – veksen

    Nov 24, 2015 at 20:31

  • 3

    hmm… when I do git commit file it commits everything, not just the specific changes I wanted (even though git diff --staged showed only the specific changes I wanted) edit: git commit -p will let you select the “hunk”s and commit in one go; and it does commit only the specific changes

    – Rafa

    May 9, 2019 at 10:40


278

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.

5

  • 1

    Interestingly, windows.github.com had support for partial file commits but seems to have dropped it recently..

    – Juri

    Sep 1, 2014 at 20:41

  • 1

    @Juri I think the support for partial file commits is back in.

    – Ela782

    Feb 24, 2015 at 10:40

  • @Juri You’re welcome. I actually never noticed that it had been in there before – I saw it last week and thought “oh, what an amazing new feature”! 🙂

    – Ela782

    Feb 24, 2015 at 17:25

  • 1

    Nowadays windows.github.com redirects to the rebranded GitHub Desktop which is nicer than Git GUI and supports partial commits…but doesn’t support commit signing. Sigh.

    – user4942583

    Feb 2, 2018 at 0:37

  • @user4942583 : GPG commit signing was added to GitHub Desktop a year ago.

    – kaios

    May 5 at 15:36

174

git gui provides this functionality under the diff view. Just right click the line(s) you’re interested in and you should see a “stage this line to commit” menu item.

5

  • 18

    for complex patches this is usually the fastest approach for me.

    – hochl

    Apr 8, 2015 at 7:35

  • 9

    This is a very efficient and intuitive way to add changes to the staging area in a fine grained manner. Also multiple lines can be selected and all changes within that selection will be added.

    – jox

    Apr 26, 2015 at 23:13

  • 3

    Note that this is not gitk, but it is included with Git Bash for Windows; you should have a start menu entry for it or can start it with the command git gui. There’s also stage this hunk which is probably more useful than stage this line. Might be new since this answer was created 10 years ago.

    – Chris

    Nov 26, 2019 at 16:37


  • That what I was looking for 🙂

    – StayCool

    Dec 18, 2020 at 9:24

  • 1

    It also seems to be the only software with this ability, that is supported on Linux :/

    – kdb

    Nov 22, 2021 at 10:29