Membalikkan bingkah di Magit 2.1.0

24

Saya baru saja memutakhirkan ke magit 2.1.0. (Dan juga untuk emacs 25.0.50 dan git 2.3.1.)

Sebelumnya, di *magit*buffer saya bisa:

  1. Pilih bingkah di area Unstaged.
  2. Ketik vdan jawab ya untuk membalikkannya.

Ini berguna.

Tapi sekarang di Magit 2.1.0 memberikan kesalahan: "Cannot reverse unstaged changes".

Mengapa?


Mengambil petunjuk dari pesan kesalahan, saya menemukan saya masih bisa melakukan ini, meskipun agak "mundur" dengan lebih banyak langkah:

  1. ssembunyikan bingkah itu. (Terasa mundur; bergerak lebih dekat ke keadaan berkomitmen.)
  2. Nav ke bawah dan pilih di area Tahapan.
  3. Tekan v, jawab ya.
  4. Namun cowok itu masih dipentaskan, jadi akhirnya aku harus unstage cowok itu.

Apakah ini bug, atau, apakah disengaja dan / atau saya padat? Jika yang terakhir, dapatkah Anda membantu saya memahami?


UPDATE: Setelah sepenuhnya melakukan RTFinfo, saya melihat bahwa ada dua perintah:

  • v magit-reverse Balikkan perubahan pada titik di pohon kerja.
  • k magit-discard Hapus perubahan pada titik dari pohon kerja.

Tampaknya k magit-discardmelakukan apa yang biasa saya vlakukan sebelumnya. Itu bekerja pada cowok yang tidak dipentaskan.

Jadi praktis saya hanya perlu melatih memori otot saya untuk digunakan k. Saya bisa mempostingnya sebagai jawaban sendiri. Tapi kurasa aku masih penasaran dengan alasannya, karena aku membayangkan memahaminya akan membantuku memahami keseluruhan lebih baik.

Greg Hendershott
sumber
Senang Anda Membaca Info Baik :) Saya bingung apa yang Anda maksud dengan "membalikkan" sebongkah. Saya belum pernah mendengar istilah itu sebelumnya.
PythonNut
kmembuang perubahan yang tidak dikomit di versi sebelumnya juga, dan tampaknya perintah yang sesuai untuk apa yang Anda lakukan. vadalah untuk git revert: membuat komit baru yang membuat perubahan berlawanan dari yang sebelumnya. Saya kira mengembalikan suatu perubahan yang belum benar-benar dilakukan sama dengan membuangnya, tetapi 'kembalikan' memiliki arti khusus sebagai perintah git.
glucas
OK, sepertinya vterikat magit-revert-item(terminologi "terbalik" berasal dari sana, @PythonNut) dan untuk item yang tidak dipentaskan, ini digunakan untuk melakukan magit-discard-item(sebagaimana terikat juga k) - lihat baris 4872 di sini . Tampaknya saya secara tidak sengaja mempelajari makna khusus dari v, yang berhasil, ketika saya seharusnya belajar menggunakannya k.
Greg Hendershott
Meskipun saya biasanya bukan penggemar jawaban, saya pikir dalam hal ini adalah cara yang paling berbelas kasih untuk menyimpulkan ini. :) Diposting satu di bawah ini.
Greg Hendershott

Jawaban:

20

Magit mengimplementasikan lima "menerapkan varian" yang dijelaskan dalam manual : stage, unstage, "apply reguler", buang, dan balikkan. Tiga yang pertama harus cukup jelas bagi sebagian besar pengguna Git. Dua yang terakhir tidak ada di porselen Git (di Magit mereka diimplementasikan menggunakan perintah pipa Git dan Emacs Lisp).

Dua varian ini dijelaskan seperti ini:

  • Membuang. Pada perubahan bertahap, hapus dari pohon yang bekerja dan indeks. Pada perubahan yang tidak dipentaskan, hapus hanya dari pohon yang berfungsi.
  • Membalikkan. Membalikkan perubahan di pohon kerja. Perubahan yang dilakukan dan dilakukan dapat dibalik. Perubahan yang tidak bertahap tidak dapat dibalik. Buang saja.

Kedua varian ini melakukan hal-hal yang sangat berbeda, sehingga tidak satu pun dari varian ini yang dapat kembali ke varian lain jika tidak dapat digunakan. Menjaga perilaku lama (mundur dari mundur ke membuang dalam beberapa konteks) mungkin lebih nyaman dalam jangka pendek, tetapi dalam jangka panjang hal itu mencegah pengguna dari benar-benar mencoba memahami untuk apa kedua varian ini.

Buang jauh lebih berbahaya daripada terbalik . Yang pertama "membuang perubahan yang tidak dikomit" (perubahan ini hilang, mereka tidak lagi berada di tempat), sedangkan yang kedua sebenarnya "menciptakan perubahan", dengan mengambil perubahan yang lebih lama dan melakukan yang sebaliknya di worktree (perubahan lama tidak hilang, masih dalam komit atau indeks).

Jatuh dari "menciptakan" ke "menghapus" sangat berbahaya, jadi Magit tidak melakukan itu lagi.


Perhatikan juga dengan menggunakan mode wip baru Anda dapat melindungi diri dari kehilangan perubahan karena dibuang secara tidak sengaja.

tarsius
sumber
3
Terima kasih banyak telah meluangkan waktu untuk menjawab dan menjelaskan alasannya.
Greg Hendershott
10

Sepertinya saya secara tidak sengaja mengetahui bahwa v, tentu saja magit-revert-item, memang terbiasa melakukan magit-discard-itemhal khusus tentang orang-orang tak berperforma yang baik. Lihat <=== HERE ===komentar yang saya berikan di bawah ini:

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

Sumber: kode 1.4.2 .

Tapi sekarang itu tidak terjadi:

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

Sumber: master :


Namun kterikat langsung ke magit-discard-item. Seharusnya aku belajar menggunakannya. Itu bekerja sebelum 2.1.0, dan masih berfungsi.

Sebagai kesimpulan, magit 2.1.0 telah didesain ulang secara signifikan. Tidak dapat dihindari bahwa beberapa kasus sudut aneh mungkin tidak bertahan. Dan, saya setuju, tidak perlu selamat. Saya akan mempelajari kembali kuncinya.

Greg Hendershott
sumber
1
Penjawaban terperinci yang bagus - semoga menerimanya!
glucas