Обратный кусок в Magit 2.1.0

24

Я только что обновился до версии 2.1.0. (А также к emacs 25.0.50 и git 2.3.1.)

Ранее в *magit*буфере я мог:

  1. Выберите кусок в области Unstaged.
  2. Введите vи ответьте да, чтобы изменить это.

Это было удобно.

Но теперь в Magit 2.1.0 он дает ошибку: "Cannot reverse unstaged changes".

Зачем?


Получив подсказку из сообщения об ошибке, я обнаружил, что все еще могу сделать это, хотя и несколько «задом наперед», с помощью следующих шагов:

  1. sтейдж ломоть (Чувствует себя задом наперед; приближает его к совершенному состоянию.)
  2. Перейдите вниз и выберите его в области «Постановка».
  3. Нажмите v, ответьте да.
  4. Тем не менее, кусок все еще в uстадии постановки, так что, наконец, я должен поставить кусок.

Это ошибка, или это намеренно и / или я плотный? Если последнее, вы можете помочь мне понять?


ОБНОВЛЕНИЕ: После полного RTFinfo-я вижу, что есть две команды:

  • v magit-reverse Отмените изменение в точке рабочего дерева.
  • k magit-discard Удалить изменение в точке из рабочего дерева.

Кажется, это k magit-discardделает то, что я привык vделать раньше. Это работает на необработанном ломоть.

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

Грег Хендершотт
источник
Рад, что ты читаешь прекрасную информацию :) Я запутался, что ты имеешь в виду под "реверсированием" куска. Я никогда не слышал этот термин раньше.
PythonNut
kтакже отменяет несогласованные изменения в более ранних версиях magit и кажется подходящей командой для того, что вы делаете. vпредназначен для git revert: создание нового коммита, который делает противоположное изменение предыдущего. Я полагаю, что отмена изменения, которое на самом деле не было зафиксировано, - это то же самое, что отмена его, но «возврат» имеет особое значение как команда git.
glucas
ОК, похоже, что он vбыл привязан magit-revert-item(оттуда происходит "обратная" терминология, @PythonNut), а для неустановленных элементов это использовалось magit-discard-item(как и связано k) - см. Строку 4872 здесь . Видимо, я случайно узнал то особое значение v, которое сработало, когда я должен был научиться использовать k.
Грег Хендершотт
Хотя я обычно не большой поклонник самоотдачи, я думаю, что в этом случае это самый милосердный способ сделать вывод. :) Написал один ниже.
Грег Хендершотт

Ответы:

20

Magit реализует пять «вариантов применения», описанных в руководстве : этап, нестандартный режим, «регулярное применение», сброс и обратный ход. Первые три должны быть довольно очевидны для большинства пользователей Git. Последние два не существуют в фарфоре Git (в Magit они реализованы с использованием сантехнических команд Git и Emacs Lisp).

Эти два варианта описаны так:

  • Отбросить. При поэтапном изменении удалите его из рабочего дерева и индекса. При неизменном изменении удалите его только из рабочего дерева.
  • Обратный. Отменить изменения в рабочем дереве. И совершенные, и поэтапные изменения могут быть отменены. Неустановленные изменения не могут быть отменены. Откажитесь от них.

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

Сброс намного опаснее обратного . Первый «отбрасывает незафиксированные изменения» (эти изменения теряются, их больше нет нигде), тогда как последний фактически «создает изменения», принимая более старые изменения и делая противоположное в рабочем дереве (старое изменение не теряется, это все еще в коммите или индексе).

Переход от «создания» к «удалению» очень опасен, поэтому Magit больше этого не делает.


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

Tarsius
источник
3
Большое спасибо, что нашли время, чтобы ответить и объяснить обоснование.
Грег Хендершотт
10

Похоже , я случайно узнал , что v, непременно magit-revert-item, было использовано , чтобы сделать magit-discard-itemв этом особом случае unstaged скряги. Смотрите <=== HERE ===комментарий, который я положил ниже:

(defun magit-revert-item ()
  "Revert the item at point.
The change introduced by the item is reversed in the current
working tree."
  (interactive)
  (magit-section-action revert (info)
    ([* unstaged] (magit-discard-item))  ;; <=== HERE ===
    (commit (when (or (not magit-revert-item-confirm)
                      (yes-or-no-p "Revert this commit? "))
              (magit-revert-commit info)))
    (diff   (when (or (not magit-revert-item-confirm)
                      (yes-or-no-p "Revert this diff? "))
              (magit-apply-diff-item it "--reverse")))
    (hunk   (when (or (not magit-revert-item-confirm)
                      (yes-or-no-p "Revert this hunk? "))
              (magit-apply-hunk-item it "--reverse")))))

Источник: код 1.4.2 .

Но теперь этого не происходит:

(defun magit-reverse (&rest args)
  "Reverse the change at point in the working tree."
  (interactive (and current-prefix-arg (list "--3way")))
  (--when-let (magit-current-section)
    (pcase (list (magit-diff-type) (magit-diff-scope))
      (`(untracked ,_) (user-error "Cannot reverse untracked changes"))
      (`(unstaged  ,_) (user-error "Cannot reverse unstaged changes"))
      (`(,_      list) (magit-reverse-files (magit-section-children it) args))
      (`(,_     files) (magit-reverse-files (magit-region-sections) args))
      (`(,_      file) (magit-reverse-files (list it) args))
      (_               (magit-reverse-apply it args)))))

Источник: мастер :


Однако kнапрямую связан с magit-discard-item. Я должен был научиться использовать это в первую очередь. Это работало до 2.1.0, и все еще работает.

В заключение, magit 2.1.0 был значительно переработан. Это неизбежно, что некоторые странные угловые случаи, возможно, не выжили. И, я бы согласился, не нужно выживать. Я заново изучу ключ.

Грег Хендершотт
источник
1
Хороший подробный самоответ - с таким же успехом можно его принять!
glucas