25

Stack Overflow 上存在多个问题,解决了仅从文件中暂存和提交部分的问题。但是,我无法让它工作。

假设我们想在 php 中实现一个虚拟数学类(语言无关紧要),使用一些基本方法,如:add、、和subtractmultiplydivide.

让我们从类定义开始:

<?php
    class Math {
    }
?>

现在:

$ git add math.php
$ git commit -m "Create Math class."

在下一步中,我们实现了这两种方法addsubtract四种方法:

<?php
    class Math {
        public function add($a, $b) {
            return $a + $b;
        }

        public function subtract($a, $b) {
            return $a - $b;
        }
    }
?>

但是现在我们要在单独的提交中提交theadd和方法的实现。subtract

这可能吗?

我试过的

$ git add -p

出现以下内容:

在此处输入图像描述

我很想把大块分成更小的块,所以我按s,然后出现以下内容:

在此处输入图像描述

似乎 git 没有把它分成更小的块。

现在让我们尝试手动编辑当前的块。所以我按:e

我的默认文本编辑器(崇高文本)打开,在这里我可以编辑大块:

在此处输入图像描述

我尝试简单地删除第 8,9,10,11 行 - 因为我只想暂存该add函数。我保存,关闭编辑器,但 git 说:

Your edited hunk does not apply. Edit again (saying "no" discards!) [y/n]?

我真的是git add -p交互式舞台的新手,所以也许这是我做错了,或者根本不可能是我想要的,真的希望一些更有经验的 git 用户有一些说明,也许对我来说也是一个解决方案。

谢谢!

4

2 回答 2

17

你所做的正是我过去所做的,我什至在一台 UNIX 机器上重新创建了你的整个实验,它按预期工作。

我怀疑您的编辑器在保存时更改了 diff hunk 中的行尾。

于 2013-04-21T18:29:16.980 回答
14

这感觉不像是绝对的“git方式”,因为 git 喜欢命令行,但这就是我所做的:

Git 捆绑在一起git gui——您可以通过运行该命令来启动它。在那里你可以选择你的未暂存文件,标记你想要提交的行,然后点击“stages lines for commit”。如果你想让它更像一个命令行工具,你可以运行git gui citool,它的效果是当你提交时 ui 将关闭。

使用 git gui 进行部分暂存

请注意,此工具已与 git 正确集成。您无需在此 ui 中进行提交。您可以只暂存相关行,关闭它,也许做更多git add,然后通过命令行提交。

总的来说,我喜欢 git 命令行界面,尽管我不一定是 shell 粉丝,但我只是在一段时间后就喜欢上了它。我尝试了多个 GUI 并将它们全部扔掉,因为它们无法与 git 命令行界面竞争。但是因为git add -p我肯定会说这是 GUI 的任务。使用git gui. 复杂的历史浏览也是如此。gitk(也与 git 一起提供)在那里做得比git log --graph -p(只要你真的需要了解树并且现在不太了解历史状态)做得更好。

笔记:但你似乎做的一切都是正确的——我尝试了你所做的并且必须同意本杰克逊的观点。那肯定行得通。你的编辑一定搞砸了。

最后说明:您似乎正在使用带有标准 Windowscmd终端的 git 命令行。我强烈建议切换到mintty。下载 msys 版本,将其放在您的Program Files\Git\bin目录中并使用mintty -. 这将为您提供相同的外壳,但具有更好的一切(尤其是更好的调整大小和复制粘贴)。

于 2013-04-21T22:27:05.217 回答