ย้อนกลับก้อนใหญ่ใน Magit 2.1.0


24

ฉันเพิ่งอัพเกรดเป็น magit 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เวทีก้อนใหญ่

นี่เป็นข้อบกพร่องหรือเป็นความตั้งใจและ / หรือฉันหนาแน่น ถ้าอย่างหลังคุณช่วยฉันเข้าใจไหม


UPDATE: หลังจาก RTFinfo-ing อย่างละเอียดฉันเห็นว่ามีสองคำสั่ง:

  • v magit-reverse กลับรายการการเปลี่ยนแปลง ณ จุดในแผนผังการทำงาน
  • k magit-discard ลบการเปลี่ยนแปลงที่จุดจากต้นไม้ทำงาน

ดูเหมือนว่าk magit-discardจะทำสิ่งที่ฉันเคยvทำมาก่อน มันทำงานได้กับก้อนใหญ่ที่ไม่มีสเตจ

kดังนั้นในทางปฏิบัติผมเพียงแค่ต้องฝึกหน่วยความจำของกล้ามเนื้อของฉันกับการใช้งาน ฉันสามารถโพสต์นั้นเป็นคำตอบด้วยตนเอง แต่ฉันคิดว่าฉันยังสงสัยเกี่ยวกับเหตุผลเพราะฉันจินตนาการว่าความเข้าใจมันจะช่วยให้ฉันเข้าใจจอมเวทโดยรวมดีขึ้น


ดีใจที่คุณกำลังอ่านข้อมูลที่ดี :) ฉันสับสนในสิ่งที่คุณหมายถึงโดย "ย้อนกลับ" ก้อนใหญ่ ฉันไม่เคยได้ยินคำนั้นมาก่อน
PythonNut

kยกเลิกการเปลี่ยนแปลงที่ไม่ได้ระบุไว้ใน magit รุ่นก่อนหน้าและดูเหมือนว่าคำสั่งที่เหมาะสมสำหรับสิ่งที่คุณกำลังทำ vสำหรับการย้อนกลับคอมไพล์: การสร้างคอมมิทใหม่ที่ทำให้เกิดการเปลี่ยนแปลงที่ตรงกันข้ามกับอันก่อน ฉันเดาว่าการคืนค่าการเปลี่ยนแปลงที่ไม่ได้กระทำจริง ๆ นั้นเหมือนกับการยกเลิก แต่การ 'เปลี่ยนกลับ' มีความหมายเฉพาะเป็นคำสั่ง git
ลูกัส

ตกลงมันดูเหมือนvถูกผูกไว้กับmagit-revert-item(ที่ "ย้อนกลับ" คำศัพท์ที่มาจากที่นั่น @PythonNut) และสำหรับรายการ unstaged นี้ใช้ในการทำmagit-discard-item(ในขณะที่ยังผูกพันที่จะk) - เห็นเส้น 4872 ที่นี่ เห็นได้ชัดว่าฉันตั้งใจเรียนรู้ว่าความหมายพิเศษของที่ทำงานเมื่อฉันควรจะได้เรียนรู้การใช้งานv k
Greg Hendershott

แม้ว่าโดยปกติฉันจะไม่ใช่แฟนตัวยงของคำตอบตัวเอง แต่ฉันคิดว่าในกรณีนี้เป็นวิธีที่ดีที่สุดในการสรุปสิ่งนี้ :) โพสต์หนึ่งรายการด้านล่าง
Greg Hendershott

คำตอบ:


20

Magit ใช้ห้า "ใช้ชุดรูปแบบ" ที่อธิบายไว้ในคู่มือ : เวที, เวที, "ปกติใช้", ทิ้งและย้อนกลับ สามคนแรกน่าจะเห็นได้ชัดสำหรับผู้ใช้ Git ส่วนใหญ่ สองหลังไม่มีอยู่ในพอร์ซเลน Git (ใน Magit พวกเขาจะดำเนินการโดยใช้คำสั่งGit ประปาและ Emacs Lisp)

สองตัวแปรนี้มีการอธิบายดังนี้:

  • ยกเลิก ในการเปลี่ยนแปลงแบบฉากให้ลบออกจากแผนผังการทำงานและดัชนี สำหรับการเปลี่ยนแปลงที่ไม่มีการจัดการให้ลบออกจากแผนผังการทำงานเท่านั้น
  • ย้อนกลับ ย้อนกลับการเปลี่ยนแปลงในแผนผังการทำงาน การเปลี่ยนแปลงที่ทำไว้ทั้งแบบมุ่งมั่นและแบบขั้นตอนสามารถย้อนกลับได้ ไม่สามารถย้อนกลับการเปลี่ยนแปลงที่ไม่มีการจัดการได้ ละทิ้งพวกเขาแทน

ตัวแปรสองตัวนี้ทำสิ่งที่แตกต่างกันมากดังนั้นจึงไม่ควรใช้ตัวแปรเหล่านี้กลับไปยังตัวแปรอื่นในกรณีที่ไม่สามารถใช้งานได้ การรักษาพฤติกรรมเก่า (จากการถอยกลับจากการย้อนกลับไปสู่การยกเลิกในบริบทบางอย่าง) อาจจะสะดวกกว่าในระยะสั้น แต่ในระยะยาวผู้ใช้ไม่สามารถพยายามทำความเข้าใจกับตัวแปรทั้งสองนี้ได้

ยกเลิกมากอันตรายกว่าย้อนกลับ อดีต "ทิ้งการเปลี่ยนแปลงที่ไม่มีข้อผูกมัด" (การเปลี่ยนแปลงเหล่านี้หายไปพวกเขาไม่ได้อยู่ที่ใดอีกต่อไป) ในขณะที่อันที่จริง "สร้างการเปลี่ยนแปลง" โดยการเปลี่ยนแปลงที่เก่ากว่าและทำตรงกันข้ามใน worktree (การเปลี่ยนแปลงเก่าจะไม่สูญหาย มันยังอยู่ในการกระทำหรือดัชนี)

การย้อนกลับจาก "การสร้าง" ถึง "การลบ" นั้นอันตรายมากดังนั้น Magit จึงไม่ทำเช่นนั้นอีกต่อไป


หมายเหตุด้วยการใช้โหมด wipใหม่ที่คุณสามารถป้องกันตนเองจากการสูญเสียการเปลี่ยนแปลงเนื่องจากการทิ้งโดยไม่ตั้งใจ


3
ขอบคุณมากที่สละเวลาตอบและอธิบายเหตุผล
Greg Hendershott

10

ดูเหมือนว่าฉันได้เรียนรู้โดยบังเอิญที่vถูกผูกไว้กับmagit-revert-itemไม่ใช้ในการทำmagit-discard-itemในกรณีพิเศษนี้ hunks 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
คำตอบด้วยตนเองที่ดี - อาจยอมรับเช่นกัน!
ลูกัส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.