Git: commit partial changes
There are multiple questions on Stack Overflow addressing the problem of staging and committing only parts from files. However, I can't make it work.
Let's say we want to implement a dummy math class in php (the language doesn't matter) with some basic methods like: add
, subtract
, multiply
and divide.
Let's start with the class definition:
<?php
class Math {
}
?>
Now:
$ git add math.php
$ git commit -m "Create Math class."
In the next step we implement both add
and subtract
four methods:
<?php
class Math {
public function add($a, $b) {
return $a + $b;
}
public function subtract($a, $b) {
return $a - $b;
}
}
?>
But now we want to commit the implementation of the add
and the subtract
methods in separate commits.
Is this possible?
What I tried
$ git add -p
The following appears:
I would love to split the hunk into smaller hunks, so I press s
, and the following appears:
It seems that git didn't split it into smaller hunks.
Let's try now to manually edit the current hunk. So I press: e
.
My default text editor (sublime text) opens up, and here I can edit the hunk:
I try to simply delete line 8,9,10,11 - because I want to stage only the add
function. I save, close the editor, but git says:
Your edited hunk does not apply. Edit again (saying "no" discards!) [y/n]?
I'm really new to git add -p
and interactive staging, so maybe it's something I do wrong, or simply it's not possible what I want, and really hope some more experienced git users have some instructions maybe also a solution for me.
Thank you!
You are doing exactly what I've done in the past, and I even recreated your entire experiment on a UNIX machine and it worked just as expected.
I suspect your editor is changing the line endings in the diff hunk when it saves.
This doesn't feel like the absolute “git way” to do it this since git loves the command line, but here's what i do:
Git comes bundled with git gui
– you can start it by running just that command. There you can select your unstaged file, mark the lines you want to commit and click “stages lines for commit”. If you want it to behave more like a command-line tool, you can run git gui citool
, which has the effect that the ui will close when you commit.
Note that this tool is properly integrated with git. You don't need to make your commit in this ui. You can just stage the relevant lines, close it, maybe do some more git add
and then commit via the command line.
In general I love the git comand line interface and even though I am not necessarily a shell fan, I just got to love it after a while. I tried multiple GUIs and threw them all away because they can't compete with the git command line interface. But for git add -p
I would definitely say that that is a task for a GUI. Doing partial commits is just way easier with git gui
. Same goes for complex history browsing. gitk
(also shipped with git) does a way better job there than git log --graph -p
(as long as you really need to understand the tree and don't quite now about the state of the history).
Note: But you still seem to be doing everything right – I tried what you did and have to agree with Ben Jackson. That should definitely work. Your editor must be screwing something up.
Final Note : You seem to be using the git command line with the standard windows cmd
terminal. I strongly recommend switching to mintty. Download the msys version, put it in your Program FilesGitbin
directory and run it (create a shortcut) with mintty -
. This will get you the same shell, but with better everything (especially better resizing and copy&paste).
上一篇: git:如何在提交时忽略对文件的更改?
下一篇: Git:提交部分更改