Đảo ngược một hunk trong Magit 2.1.0


24

Tôi vừa nâng cấp lên magit 2.1.0. (Và cũng để emacs 25.0.50 và git 2.3.1.)

Trước đây, trong *magit*bộ đệm tôi có thể:

  1. Chọn một hunk trong khu vực Unstaged.
  2. Nhập vvà trả lời có để đảo ngược nó.

Điều này rất tiện dụng.

Nhưng bây giờ trong magit 2.1.0, nó báo lỗi : "Cannot reverse unstaged changes".

Tại sao?


Lấy một gợi ý từ thông báo lỗi, tôi phát hiện ra mình vẫn có thể làm điều này, mặc dù theo cách hơi "ngược" với nhiều bước hơn:

  1. sCơn thịnh nộ. (Cảm thấy ngược; di chuyển nó gần hơn đến trạng thái đã cam kết.)
  2. Điều hướng xuống và chọn nó trong khu vực Staged.
  3. Nhấn v, trả lời có.
  4. Tuy nhiên, hunk vẫn là Staged, vì vậy cuối cùng tôi phải uchống lại hunk.

Đây có phải là một lỗi, hoặc, nó có chủ ý và / hoặc tôi đang dày đặc? Nếu sau này, bạn có thể giúp tôi hiểu?


CẬP NHẬT: Sau khi hoàn toàn RTFinfo-ing, tôi thấy rằng có hai lệnh:

  • v magit-reverse Đảo ngược sự thay đổi tại điểm trong cây làm việc.
  • k magit-discard Loại bỏ sự thay đổi tại điểm từ cây làm việc.

Dường như đó là k magit-discardnhững gì tôi đã từng vlàm trước đây. Nó không hoạt động trên một hunk không có tổ chức.

Vì vậy, thực tế tôi chỉ cần kiềm chế bộ nhớ cơ bắp của tôi để sử dụng k. Tôi có thể đăng nó như là một câu trả lời tự. Nhưng tôi đoán tôi vẫn tò mò về lý do căn bản, bởi vì tôi tưởng tượng việc hiểu nó sẽ giúp tôi hiểu được phép thuật tốt hơn về tổng thể.


Vui mừng khi bạn đọc Thông tin tốt :) Tôi bối rối ý của bạn là gì khi "đảo ngược" một hunk. Tôi chưa bao giờ nghe thuật ngữ đó trước đây.
PythonNut 14/07/2015

kcũng loại bỏ thay đổi không liên quan trong các phiên bản pháp sư trước đó và dường như là lệnh thích hợp cho những gì bạn đang làm. vlà cho git Revert: tạo ra một cam kết mới làm cho sự thay đổi ngược lại của một lần trước. Tôi đoán việc hoàn nguyên một thay đổi chưa thực sự được thực hiện cũng giống như loại bỏ nó, nhưng 'hoàn nguyên' có ý nghĩa cụ thể như một lệnh git.
glucas

OK, có vẻ như vbị ràng buộc với magit-revert-item(thuật ngữ "đảo ngược" xuất phát từ đó, @PythonNut) và đối với các mục không được sử dụng, điều này được sử dụng để thực hiện magit-discard-item(cũng như bị ràng buộc k) - xem dòng 4872 tại đây . Rõ ràng tôi đã vô tình học được ý nghĩa đặc biệt vđó, nó hoạt động, khi tôi phải học cách sử dụng k.
Greg Hendershott

Mặc dù tôi thường không phải là một fan hâm mộ lớn của câu trả lời cho bản thân, tôi nghĩ trong trường hợp này đó là cách thương xót nhất để kết luận điều này. :) Đăng một cái dưới đây.
Greg Hendershott

Câu trả lời:


20

Magit thực hiện năm "biến thể áp dụng" được mô tả trong hướng dẫn : giai đoạn, giai đoạn, "áp dụng thường xuyên", loại bỏ và đảo ngược. Ba người đầu tiên nên khá rõ ràng đối với hầu hết người dùng Git. Hai cái sau không tồn tại trong sứ Git (trong Magit chúng được thực hiện bằng cách sử dụng các lệnh ống nước Git và Emacs Lisp).

Hai biến thể được mô tả như thế này:

  • Bỏ đi. Trên một thay đổi theo giai đoạn, loại bỏ nó khỏi cây làm việc và chỉ mục. Trên một thay đổi chưa được phân loại, chỉ xóa nó khỏi cây làm việc.
  • Đảo ngược. Đảo ngược một sự thay đổi trong cây làm việc. Cả hai thay đổi cam kết và dàn dựng có thể được đảo ngược. Những thay đổi không thể thay đổi không thể đảo ngược. Thay vào đó hãy loại bỏ chúng.

Hai biến thể này làm những việc rất khác nhau, vì vậy cả hai biến thể này đều không quay trở lại biến thể khác trong trường hợp không thể sử dụng chính nó. Giữ hành vi cũ (quay ngược lại từ bỏ để loại bỏ trong một số bối cảnh) có thể thuận tiện hơn trong thời gian ngắn, nhưng về lâu dài nó ngăn người dùng thực sự cố gắng hiểu hai biến thể này để làm gì.

Hủy bỏ nguy hiểm hơn nhiều so với đảo ngược . Cái trước "vứt bỏ những thay đổi không được cam kết" (những thay đổi này bị mất, chúng không còn ở đâu nữa), trong khi cái sau thực sự "tạo ra thay đổi", bằng cách thay đổi cũ hơn và làm ngược lại trong bàn làm việc (thay đổi cũ không bị mất, nó vẫn còn trong một cam kết hoặc chỉ mục).

Rơi lại từ "tạo" sang "xóa" là rất nguy hiểm, vì vậy Magit không làm điều đó nữa.


Cũng lưu ý bằng cách sử dụng các chế độ lau mới, bạn có thể bảo vệ bản thân khỏi bị mất các thay đổi do loại bỏ ngẫu nhiên.


3
Cảm ơn bạn rất nhiều vì đã dành thời gian để trả lời và giải thích lý do.
Greg Hendershott

10

Có vẻ như tôi đã vô tình biết rằng v, bị ràng buộc magit-revert-item, đã từng làm một magit-discard-itemtrường hợp đặc biệt của những người săn mồi không có căn cứ này. Xem <=== HERE ===bình luận tôi đặt dưới đây:

(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")))))

Nguồn: mã 1.4.2 .

Nhưng bây giờ điều đó không xảy ra:

(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)))))

Nguồn: chủ :


Tuy nhiên kbị ràng buộc trực tiếp đến magit-discard-item. Tôi nên học cách sử dụng nó ở nơi đầu tiên. Điều đó đã làm việc trước 2.1.0, và vẫn hoạt động.

Tóm lại, magit 2.1.0 đã được thiết kế lại đáng kể. Không thể tránh khỏi một số trường hợp góc kỳ lạ có thể không sống sót. Và, tôi đồng ý, không cần phải sống sót. Tôi sẽ học lại chìa khóa.


1
Đẹp tự trả lời chi tiết - cũng có thể chấp nhận nó!
glucas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.