Magit 2.1.0’daki bir parçayı ters çevir


24

Az önce 2.1.0 seviyesine yükselttim. (Ayrıca 25.0.50 ve git 2.3.1'e kadar emacs için)

Önceden, *magit*tamponda şunu yapabilirdim:

  1. Dengesiz alanda bir iri parça seçin.
  2. Yazın vve Cevap evet bunu tersine çevirmek için.

Bu kullanışlıydı.

Ama şimdi magit 2.1.0 o hata veriyor: "Cannot reverse unstaged changes".

Niye ya?


Hata mesajından bir ipucu alarak, daha fazla adımda biraz "geriye" şekilde de olsa, bunu hala yapabileceğimi öğrendim:

  1. siri parçalamak. (Geri hissediyor; kararlı duruma yaklaştırıyor.)
  2. Aşağı gidin ve Staged alanında seçin.
  3. Bas v, evet cevapla.
  4. Ancak iri hala Kademeli, bu yüzden nihayet uiriyi yerleştirmem gerekiyor.

Bu bir hata mı, yoksa kasıtlı mı ve / veya yoğun muyum? İkincisi, anlamama yardımcı olabilir misiniz?


GÜNCELLEME: RTF bilgilerinden sonra iyice iki komut olduğunu görüyorum:

  • v magit-reverse Çalışan ağaçtaki noktadaki değişikliği tersine çevirin.
  • k magit-discard Çalışan ağaçtaki noktada değişikliği kaldırın.

Görünüşe göre k magit-discarddaha vönce yapmaya alıştığım şeyi yapıyor. Bu dengesiz bir iri üzerinde çalışır.

Bu yüzden pratik olarak sadece kas hafızamı kullanmak için tekrar denemek gerekiyor k. Bunu bir cevap olarak gönderebilirim. Ama sanırım hala mantığı merak ediyorum, çünkü bunun genel olarak daha iyi anlamayı öğrenmeme yardımcı olacağını hayal ediyorum.


İnce Bilgiyi Okuduğunuza sevindim :) Ne demek istediğinizi bir parçayı "ters çevirerek" kafam karıştı. Bu terimi daha önce hiç duymamıştım.
PythonNut

kmagit'in önceki sürümlerinde kabul edilmemiş bir değişikliği atar ve yaptığınız şey için uygun komutu verir. vgit revert içindir: öncekinin tersi değişikliğini yapan yeni bir taahhüt oluşturmak . Sanırım gerçekten taahhüt edilmemiş bir değişikliği geri almak, onu silmekle aynı, ancak 'geri almak', git komutu olarak özel bir anlama sahip.
glucas,

Tamam, benzediğini vbağlandı magit-revert-itemve unstaged öğeler için bu yapmak için kullanılan (terminoloji var, @PythonNut gelen "ters") magit-discard-item(aynı zamanda bağlı khattını 4872 bakınız -) burada . Anlaşılan v, kullanmayı öğrendiğimde, işe yarayan özel anlamının yanlışlıkla olduğunu öğrendim k.
Greg Hendershott,

Genelde kendinden cevapların büyük bir hayranı olmasam da, bu durumda bunu sonuçlandırmanın en merhametli yolu olduğunu düşünüyorum. :) Aşağıda bir tane gönderildi.
Greg Hendershott,

Yanıtlar:


20

Magit, kılavuzda açıklanan beş "uygulama varyantı" uygular : aşama, kararsızlık, "düzenli başvuru", atma ve geri alma. İlk üçünün çoğu Git kullanıcısı için oldukça açık olması gerekir. Son iki Git porseleninde yoktur (Magit'te Git sıhhi tesisat komutları ve Emacs Lisp kullanılarak uygulanırlar).

Bu iki değişken şöyle tarif edilir:

  • Sil. Aşamalı bir değişiklikte, onu çalışma ağacından ve dizinden kaldırın. Dengesiz bir değişiklikle, yalnızca çalışan ağaçtan kaldırın.
  • Ters. Çalışan ağaçtaki bir değişikliği ters çevirin. Hem taahhütlü hem de aşamalı değişiklikler tersine çevrilebilir. İstenmeyen değişiklikler geri alınamaz. Bunun yerine onları atın.

Bu iki değişken çok farklı şeyler yapar, bu nedenle bu değişkenlerin hiçbiri, kullanılamadığı durumlarda diğer değişkene geri dönmemelidir. Eski davranışları sürdürmek (bazı durumlarda tersten aşağıya atılmak) kısa vadede daha uygun olabilir, ancak uzun vadede kullanıcıların bu iki değişkenin ne için olduğunu gerçekten anlamaya çalışmasını önler.

Atmak tersten çok daha tehlikelidir . İkincisi aslında (eski değişiklik eski bir değişiklik alıp worktree içinde tersini yaparak, "Değişiklikleri yaratır" ise eski, (bu değişiklikler, her yerde artık değil kaybolur) "Uzak kaydedilmemiş değişiklikleri atar" değil kaybetti hala bir taahhütte veya endekstedir).

"Yaratmaktan" "silmek" e geri dönmek çok tehlikelidir, bu yüzden Magit bunu yapmaz.


Ayrıca, yeni silme modlarını kullanarak, yanlışlıkla atılmanız nedeniyle değişikliklerinizi kaybetmekten koruyabileceğinizi de unutmayın .


3
Gerekçeyi cevaplamak ve açıklamak için zaman ayırdığınız için teşekkür ederiz.
Greg Hendershott

10

Yanlışlıkla olduğunu öğrenmişti gibi görünüyor vbağlı, magit-revert-itembir yapmak için kullanılan vermedi magit-discard-itemunstaged hunks bu özel durumda. Aşağıya <=== HERE ===yazdığım yorumu görün :

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

Kaynak: 1.4.2 kodu .

Ama şimdi bu olmuyor:

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

Kaynak: usta :


Ancak kdoğrudan bağlı magit-discard-item. Bunu en başta kullanmayı öğrenmeliydim. Bu 2.1.0'dan önce çalıştı ve hala çalışıyor.

Sonuç olarak, magit 2.1.0 önemli ölçüde yeniden tasarlandı. Bazı garip köşe davalarının hayatta kalmamış olması kaçınılmaz. Ve katılıyorum, hayatta kalmana gerek yok. Anahtarı tekrar öğreneceğim.


1
Güzel ayrıntılı kendi kendine cevap - kabul edebilir!
glucas,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.