Commit only part of a file in Git

2018-12-31 19:31发布

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?

22条回答
只靠听说
2楼-- · 2018-12-31 19:42

git-cola is a great GUI and also has this feature built-in. Just select the lines to stage and press S. If no selection is made, the complete hunk is staged.

查看更多
孤独寂梦人
3楼-- · 2018-12-31 19:43

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.

查看更多
冷夜・残月
4楼-- · 2018-12-31 19:43

vim-gitgutter plugin can stage hunks without leaving vim editor using

:GitGutterStageHunk

Beside this, it provides other cool features like a diff sign column as in some modern IDEs

If only part of hunk should be staged vim-fugitive

:Gdiff

allows visual range selection then :'<,'>diffput or :'<,'>diffget to stage/revert individual line changes.

查看更多
旧人旧事旧时光
5楼-- · 2018-12-31 19:50

git-meld-index -- quoting from the website:

git-meld-index runs meld -- or any other git difftool (kdiff3, diffuse, etc.) -- to allow you to interactively stage changes to the git index (also known as the git staging area).

This is similar to the functionality of git add -p, and git add --interactive. In some cases meld is easier / quicker to use than git add -p. That's because meld allows you, for example, to:

  • see more context
  • see intra-line diffs
  • edit by hand and see 'live' diff updates (updated after every keypress)
  • navigate to a change without saying 'n' to every change you want to skip

Usage

In a git repository, run:

git meld-index

You'll see meld (or your configured git difftool) pop up with:

LEFT: temporary directory contining files copied from your working tree

RIGHT: temporary directory with the contents of the index. This also includes files that are not yet in the index but are modified or untracked in the working copy -- in this case you'll see the file contents from HEAD.

Edit the index (right hand side) until happy. Remember to save when needed.

When you're done, close meld, and git-meld-index will update the index to match the contents of the temporary directory on the right hand side of meld that you just edited.

查看更多
还给你的自由
6楼-- · 2018-12-31 19:50

Adding on a previous answer, if you prefer using the command line, entering git add -e myfile gives you the choice to choose line by line what you want to commit because this command will open an editor with the differences, like so:

enter image description here

As you may known lines that start with + are addtions, lines that start with - are deletions. So:

  • To not stage an addition just delete that line.
  • To not stage a deletion just replace - with space .

This is what git add -h says about adding files this way (patching files):

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.

Caution: do not change the content of the file, this is not a good place to do so. Just change the operators of deleted or added lines.

查看更多
栀子花@的思念
7楼-- · 2018-12-31 19:51

Should you use emacs, take a look at Magit, which provides a git interface for emacs. It supports staging hunks (parts of files) quite well.

查看更多
登录 后发表回答