2013-04-21 180 views
23

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

比方说,我们要实现一个虚拟的数学课在PHP(语言无所谓)与像一些基本的方法:addsubtractmultiplydivide.

让我们从类定义开始:

<?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; 
     } 
    } 
?> 

但现在我们要提交add的执行情况,并在不同的提交的subtract方法。

这可能吗?

我试过

$ git add -p

下出现:

enter image description here

我很想拆分大块成更小帅哥,让我按s,下面出现:

enter image description here

看来,git并没有把它分成小块。

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

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

enter image description here

我尝试只是删除线8,9,10,11 - 因为我想阶段只有add功能。 我保存,关闭编辑器,但混帐说:

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

我真正的新git add -p和互动升级,所以也许这件事情我做错了,或者根本就不可能我想要什么,真的希望一些更有经验的git用户有一些说明也许对我来说也是一个解决方案。

谢谢!

+1

您是否在尝试学习这种做法的“git方式”?就我个人而言,我不打扰这些细节。我只是删除一个函数,提交它,将其添加回来,并提交。 – TheBuzzSaw 2013-04-21 18:26:17

+0

是的,这正是我在上一个项目中所做的。也许这是更简单的方法。不过,我很想用git来做,然后决定选择哪种方式。 – 2013-04-21 18:27:34

+0

[只提交Git中文件的一部分]的可能的重复(http://stackoverflow.com/questions/1085162/commit-only-part-of-a-file-in-git) – 7ochem 2015-04-03 08:31:21

回答

15

您正在做我以前所做的工作,我甚至在UNIX计算机上重新创建了整个实验,并且其工作方式与预期一致。

我怀疑你的编辑器在保存时会改变diff hunk中的行尾。

+1

我回来了。我将所有编辑器设置为使用unix行结束符,并且所有内容都按预期工作。 – 2013-04-22 20:25:59

12

这并不觉得自己是绝对的“混帐的方式”做这个,因为混帐喜欢命令行,但这里是我做的:

Git自带了git gui捆绑 - 你可以只运行启动该命令。在那里你可以选择未分类的文件,标记你要提交的行并点击“提交阶段行”。如果您希望它更像是一个命令行工具,那么可以运行git gui citool,这会导致在您提交时ui会关闭。

Partial staging with git gui

注意,该工具正确使用Git集成。你不需要在这个UI中做出承诺。您可以将相关行放在上面,关闭它,也可以再做一些git add,然后通过命令行进行提交。

一般来说,我喜欢git comand界面,即使我不一定是shell粉丝,我只是在一段时间后才喜欢它。我尝试了多个GUI,并将它们全部扔掉,因为它们无法与git命令行界面竞争。但对于git add -p我肯定会说这是GUI的一项任务。通过git gui进行部分提交更容易。复杂的历史浏览也一样。 gitk(也随git一起发布)比git log --graph -p做得更好(只要你确实需要了解树并且不太了解历史的状态)。

注意:但你似乎仍在做一切正确 - 我尝试了你所做的并且必须同意本杰克逊。这应该肯定有效。你的编辑必须搞砸了。

最后说明:您似乎在使用git命令行与标准窗口cmd终端。我强烈建议切换到mintty。下载msys版本,将其放入您的Program Files\Git\bin目录并使用mintty -运行它(创建快捷方式)。这会让你获得相同的外壳,但更好的一切(尤其是更好的调整大小和复制&粘贴)。

+0

'git add -p'是一种传统的git方式。我一直使用它,并从来没有任何问题。它可能只是编辑器,似乎并没有添加git所期望的正确的行结尾。顺便说一句,在Windows上使用'git gui'你应该使用cygwin或者msys。 – Tuxdude 2013-04-21 23:49:20

+0

我知道'git add -p'可以工作,并且应该为OP正在努力实现的目标而工作。我的观点是,如果能够正确地滚动文件并在无需切换到编辑器的情况下播放单行文件,则可以轻松放置文件的某些部分。如果你在Windows上使用git,它总是使用cygwin或msys - 由于其shell脚本,git不能在windows上本地运行。 – Chronial 2013-04-22 00:52:54

+0

感谢您的详细评论。我也试过git gui,但同样的错误出现了。 Ben Jackson和你指出的结局是解决问题的关键。现在,git gui也能按预期工作。 – 2013-04-22 20:28:19