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.

  • How can I commit only part of a file in git
  • 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.

    部分与git gui分期

    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).

    链接地址: http://www.djcxy.com/p/4180.html

    上一篇: git:如何在提交时忽略对文件的更改?

    下一篇: Git:提交部分更改