Зворотний шматок у Магіті 2.1.0


24

Я щойно перейшов на магніт 2.1.0. (А також до emacs 25.0.50 та git 2.3.1.)

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

  1. Виберіть лунку в районі Нестандартний.
  2. Введіть vі відповідь "Так", щоб відмінити його.

Це було зручно.

Але тепер в Magit 2.1.0 він дає помилку: "Cannot reverse unstaged changes".

Чому?


Взявши підказку з повідомлення про помилку, я виявив, що все-таки можу це зробити, хоча дещо «назад» шляхом, виконавши більше кроків:

  1. stage лук. (Відчуває себе назад; переміщуючи його ближче до закріпленого стану)
  2. Наведи вниз і виберіть його в Поетапній області.
  3. Натисніть v, відповідь "так".
  4. Однак лук все ще є поетапним, тож нарешті мені доведеться uзгорнути ногу.

Це помилка, чи це навмисно та / або я густо? Якщо останнє, чи можете ви допомогти мені зрозуміти?


ОНОВЛЕННЯ: Після ретельного RTFinfo, я бачу, що є дві команди:

  • v magit-reverse Зворотну зміну в точці робочого дерева.
  • k magit-discard Видаліть зміни в точці з робочого дерева.

Здається, це k magit-discardробить те, що я раніше звик vробити. Це спрацьовує на нерозбірливій луззі.

Тому практично мені просто потрібно переучити свою м’язову пам’ять, щоб використовувати k. Я можу це зробити як самовідповідь. Але я думаю, що мені все ще цікаво обґрунтування, тому що я думаю, що розуміння це допоможе мені зрозуміти магіт краще в цілому.


Радий, що ти читаєш прекрасну інформацію :) Мене бентежить те, що ти маєш на увазі під "перевертанням" частини. Я ніколи раніше не чув цього терміна.
PythonNut

kтакож відкидає неприпустимі зміни в попередніх версіях magit і, здається, є відповідною командою для того, що ви робите. vє для повернення git: створення нового комітету, який вносить протилежну зміну попереднього. Я думаю, що повернення зміни, яка насправді не була здійснена, - це те саме, що відкинути її, але "повернути" має конкретне значення як команда git.
глюкас

Гаразд, схоже, це vбуло пов'язано magit-revert-item("зворотна" термінологія походить звідти, @PythonNut), а для нестандартних елементів це робилося magit-discard-item(як також пов'язано k) - див. Рядок 4872 тут . Мабуть, я випадково дізнався той особливий сенс v, який спрацював, коли я повинен був навчитися користуватися k.
Грег Хендершот

Хоча я зазвичай не є великим прихильником самовідповідей, я думаю, що в цьому випадку це наймилосердніший спосіб зробити це. :) Опубліковано нижче.
Грег Хендершот

Відповіді:


20

Magit реалізує п’ять варіантів "застосувати", описані в посібнику : етап, нестабільність, "регулярне застосування", відкидання та зворотний зв'язок. Перші три повинні бути досить очевидними для більшості користувачів Git. Останні два не існують у фарфорі Git (в Magit вони реалізовані за допомогою команд Git сантехніка та Emacs Lisp).

Ці два варіанти описані так:

  • Відмовтеся. Після поетапної зміни вийміть її з робочого дерева та індексу. У разі нестандартної зміни видаліть її лише з робочого дерева.
  • Зворотний. Зворотна зміна робочого дерева. Як здійснені, так і поетапні зміни можна змінити. Ненаписані зміни неможливо змінити. Відмовтеся замість них.

Ці два варіанти роблять дуже різні речі, тому жоден із цих варіантів не повинен переходити до іншого варіанту у випадках, коли його не можна використовувати. Збереження старої поведінки (відхилення від зворотного до відкидання в деяких контекстах), можливо, було б зручніше в короткостроковому періоді, але в довгостроковій перспективі це заважає користувачам реально намагатися зрозуміти, для чого ці два варіанти.

Відкидання набагато небезпечніше, ніж зворотне . Перші «викидають незапущені зміни» (ці зміни втрачаються, їх вже ніде немає), а другі насправді «створюють зміни», приймаючи старі зміни і роблячи навпаки робоче дерево (стара зміна не втрачається, він все ще знаходиться в коміті або індексі).

Відхилення від "створення" до "видалення" дуже небезпечно, тому Магіт більше цього не робить.


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


3
Дуже дякую, що знайшли час, щоб відповісти та пояснити обґрунтування.
Грег Хендершотт

10

Схоже, я випадково довідався, що v, magit-revert-itemзвичайно, робив це magit-discard-itemв цій особливій справі нестандартних полювань. Дивіться <=== 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, і досі працює.

На закінчення магніт 2.1.0 був значно перероблений. Неминуче, що деякі дивні кутові випадки, можливо, не збереглися. І, погодився б, не потрібно було виживати. Я вивчу ключ.


1
Приємна детальна самовідповідь - може також прийняти це!
глюкас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.