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
Squidly
источник
В Magit нет ничего, что могло бы сделать это. И даже более того: дизайн magit делает это, вероятно, невозможным для кода без огромного изменения статуса magit.
Реми
4
Спасибо, имеет смысл. К сожалению, лучшее, что я мог придумать, - это некоторая автоматизация выбора вперед или назад от точки и затем постановки. Также стоит отметить (для людей, которые ранее не использовали эту функцию), что вы можете использовать регион как для сцены, так и для сцены. Например, вы можете поставить большой кусок, затем переключиться на промежуточную секцию и снять линию посередине. Но согласился с @MrBones, что вариант с разделенным ломтем будет проще, чем возиться с выбором.
glucas
Интересно, что выбор 2 отличает не смежные регионы. +1
Nsukami _
1
Лично я ставлю весь кусок, а затем отключаю отладочный оператор. (Мой хук перед фиксацией ловит поэтапные отладочные операторы, поэтому я не
рискую их выполнить
1
Я не знаю достаточно о Magit, чтобы помочь, но я просто хочу отметить, что в diff-режиме Emacs есть команда, diff-split-hunkкоторая делает именно это. IOW ваш запрос на способ использования diff-split-hunk(или что-то эквивалентное) из буфера magit-status.
Стефан

Ответы:

17

Как упомянуто в комментариях выше, Magit не поддерживает разбиение фрагмента на несколько фрагментов сверх того, что возможно с помощью git diff -U<n>. Это потому, что Magit использует команду Git для создания различий. Это не изменится, Magit всегда будет использовать различия, которые он получает от Git как есть.

(На самом деле, Magit удаляет некоторые заголовки, которые на самом деле не имеют отношения к людям, но восстанавливает их при применении изменений. Но разделение фрагмента дальше, чем то, что -U<n>поддерживает, это совсем другая история, это привело бы к кроличьей норе - причина, почему Git не разрешает "меньшие фрагменты", он не сможет их применить).

Хотя Magit не поддерживает отображение меньших фрагментов, как здесь предлагается, он поддерживает применение только частей фрагмента. Когда регион активен во время постановки, применяется только эта часть блока.

Это не очень помогает, когда часть, которую не нужно ставить, находится прямо в середине текста, который нужно ставить. Как и предполагали другие, в этом случае вы должны сделать весь кусок, а затем отключить строку, которую не хотите фиксировать на втором шаге.

Это, конечно, может быть автоматизировано. Единственный способ, которым я могу увидеть, как это можно автоматизировать, - это «поставить текущую ломоть за исключением региона. Но у меня есть некоторые сомнения относительно того, как часто это может быть полезным, и боюсь, что это будет нелегко реализовать с такой надежностью». И поэтому я в настоящее время не намерен это реализовывать.

Tarsius
источник
47

Вы можете разделить куски с помощью Magit.

Вместо того, чтобы просто оставлять курсор внутри блока, выберите линии, которые вы хотите выделить из блока, и нажмите s . Только выбранная часть фрагмента будет поставлена, тогда как остальная часть фрагмента все еще будет находиться в неустановленной области.

Таким образом, вы разделили его на две части. Я думаю, что вы можете использовать тот же механизм для перемещения частей кусков в тайник. При использовании k вы просто удалите часть фрагмента.

Свен Рике
источник
3
IMO, это должен быть принятый ответ, так как он удовлетворяет запросу (и я нашел этот ответ несколько раз, когда пытался вспомнить, как это сделать).
chaseadamsio
2
Да, это должно быть принято в качестве ответа!
copyninja
3

Если вы хотите удалить части фрагмента, выберите строки внутри фрагмента, который вы хотите удалить, и нажмите x .

NeilDurant
источник