Magit将大块分成两个大块


34

在SO方面存在一个关于使用magit拆分大块的问题,给出的两个解决方案是对区域进行分级(标记区域,命中阶段),或者使用 +-。那不是我所追求的。

在magit的状态缓冲区中,我想在某个点或至少在该点周围的直线上将一个块分为两个块。

扭转这个(不好意思的差异格式)

@@ blah blah blah
- foo
+ bar
+ baz
+

进入

@@ blah blah
- foo
+ bar

@ blah blah
+ baz

当该点在栏上时。

动机:

  • baz是一个调试语句,所以我想从foo&的提交中删除它,bar而又不会摆脱它。

  • bar并且baz仅部分相关,这意味着它们的更改不应在同一提交中。

  • bar既大又baz小,这使得拆分大块头而不是进行选择变得容易得多bar

  • 与最后一点类似,假设20行提交包含不应上演的中间一行。比起使用区域,将顶部和底部的两个大块块分割并上演而忽略中间的大块块会更容易。

  • 当diff演示将修改过的内容的前后分开,而中间没有帮助时,有时会出现上述情况。例如

@@ line
- old_foo
+ random stuff
+ new foo

magit中没有什么可以做到的。它甚至不止于此:magit的设计使它在没有大量重新设计magit-status的情况下可能无法编写代码。
雷米

4
谢谢,很有道理。不幸的是,我能想到的最好的办法就是围绕点选择前进或后退然后进行登台工作。同样值得注意的是(对于以前从未使用过该功能的人),您可以在该区域进行舞台演出和不舞台演出。例如,您可以暂存一个大块,然后切换到暂存的部分并在中间暂存一条线。但是同意@MrBones的观点,大块拆分的选项比摆弄选择更容易。
glucas 2015年

有趣的是,选择2个不同的非相邻区域。+1
Nsukami _

1
就个人而言,我会暂存整个大块,然后取消暂存调试语句。(我的预提交钩子捕获了已调试的调试语句,因此没有提交我的危险。)
phils 2015年

1
我对Magit的了解还不够,但是我只想指出Emacs的diff-mode具有执行diff-split-hunk此操作的命令。IOW您的请求是一种diff-split-hunk从magit-status缓冲区使用(或等效方法)的方法。
Stefan

Answers:


17

如上面的评论中所述,Magit不支持使用来将块拆分为多个块git diff -U<n>。那是因为Magit依靠该Git命令来创建差异。这不会改变,Magit将始终按原样使用从Git获得的差异。

(实际上,Magit确实剥离了一些与人类无关的标头,但是在应用更改时确实将其还原。但是将大块拆分成比所-U<n>支持的要大得多的故事是一个完全不同的故事,这会导致一个兔子洞-这就是Git的原因不允许“小伙伴”,因此无法应用它们)。

虽然Magit不支持按此处的要求显示较小的块,但确实支持仅应用部分块。当暂存期间该区域处于活动状态时,仅应用大块的该部分。

当不应上演的部分恰好在应上演的文本中间时,这没有太大帮助。正如其他人所建议的那样,在这种情况下,您应该执行的工作是将整个任务都暂存,然后取消暂存您不想在第二步中提交的行。

这当然可以是自动化的。我能看到的唯一自动化的方法是“ 区域以外的当前大块头。但是我确实对这实际上有用的频率有一些怀疑,并担心要强大地实现它并不容易因此,我目前不打算实施此方法。


47

您可以使用Magit分割大块。

不仅仅是将光标留在块中,还可以选择要从块中过渡的行,然后按s。只有选中的大块部分会上演,而其余的大块仍然位于未上演的区域。

这样,您将其拆分为两个。我认为您可以使用相同的机制将大块的部分移动到隐藏处。使用k时,您将清除部分大块。


3
IMO,这应该是可以接受的答案,因为它满足了请求(并且在尝试记住如何执行此操作时,我已经多次找到了该答案)。
chaseadamsio

2
是的,应该将其作为答案!
copyninja

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.