Magit 2.1.0でハンクを逆にする


24

magit 2.1.0にアップグレードしました。(そしてemacs 25.0.50とgit 2.3.1にも。)

以前は、*magit*バッファーで次のことができました。

  1. [ステージなし]領域でハンクを選択します。
  2. v「yes」と入力して反転します。

これは便利でした。

しかし、現在、magit 2.1.0ではエラーが発生します"Cannot reverse unstaged changes"

どうして?


エラーメッセージからヒントを得て、私はこれを行うことができることを発見しました。

  1. s塊を切り刻む。(後方に移動し、コミット状態に近づけます。)
  2. 下に移動して、[ステージ]エリアで選択します。
  3. を押してv、はいと答えます。
  4. ただし、ハンクはまだuステージングされているため、最終的にハンクをステージングする必要があります。

これはバグですか、それとも意図的なものですか、そして/または私は密集していますか?後者の場合、理解を助けてもらえますか?


更新:完全にRTFinfo-ingを実行した後、2つのコマンドがあることがわかりました。

  • v magit-reverse 作業ツリーのポイントで変更を元に戻します。
  • k magit-discard 作業ツリーからポイントの変更を削除します。

それはk magit-discard私がv前にやっていたことに慣れていることを行うようです。ステージングされていないハンクで動作します。

したがって、実際には、使用する筋肉の記憶を再訓練する必要がありますk。自己回答として投稿することもできます。しかし、私はそれを理解することが全体的にマギットをよりよく理解するのに役立つと思うので、私はまだ理論的根拠に興味があると思います。


良い情報を読んでくれてうれしいです:)私は、あなたが塊を「逆にする」という意味を混乱させています。その言葉を聞いたことがありません。
PythonNut

kmagitの以前のバージョンでもコミットされていない変更を破棄し、あなたがしていることに対して適切なコマンドのようです。vgit revertの場合:前のコミットと反対の変更を行う新しいコミットを作成します。実際にコミットされていない変更を元に戻すことは、それを破棄することと同じですが、「元に戻す」にはgitコマンドとして特定の意味があります。
グルーカス

OK、vバインドされたように見えますmagit-revert-item(「逆」の用語はそこから来ています、@ PythonNut)、ステージングされていないアイテムの場合、これはmagit-discard-item(同様にバインドされていますk)- ここの行4872を参照してください。どうやらv、使用することを学ばなければならなかったときに、それが機能するという特別な意味を偶然知ったようkです。
グレッグヘンダーショット

私は通常、自己回答の大ファンではありませんが、この場合、これを結論付ける最も慈悲深い方法だと思います。:)以下に投稿しました。
グレッグヘンダーショット

回答:


20

Magit は、マニュアルに記載されている5つの「適用バリアント」を実装します。ステージ、アンステージ、「通常の適用」、破棄、およびリバースです。最初の3つは、ほとんどのGitユーザーにとって明らかなはずです。後者の2つは、Git 磁器には存在しません(Magitでは、Git 配管コマンドとEmacs Lisp を使用して実装されています)。

これらの2つのバリアントは次のように説明されます。

  • 捨てる。段階的な変更で、作業ツリーとインデックスから削除します。ステージングされていない変更では、作業ツリーからのみ削除します。
  • 逆。作業ツリーの変更を元に戻します。コミットされた変更とステージングされた変更の両方を元に戻すことができます。ステージングされていない変更を元に戻すことはできません。代わりにそれらを破棄します。

これらの2つの亜種は非常に異なることを行うため、これらの亜種のどちらも、それ自体を使用できない場合に他の亜種にフォールバックするべきではありません。古い動作(一部のコンテキストでは破棄から逆にフォールバックする)を維持することは、短期的にはより便利かもしれませんが、長期的にはユーザーがこれら2つのバリアントの目的を本当に理解しようとするのを防ぎます。

破棄は、リバースよりもはるかに危険です。前者は「コミットされていない変更を破棄します」(これらの変更は失われ、もはやどこにもありません)、後者は実際に「変更を作成」し、ワークツリーで古い変更を取得し、反対の操作を行います(古い変更は失われませんが、まだコミットまたはインデックスにあります)。

「作成」から「削除」にフォールバックすることは非常に危険であるため、Magitはそれを行いません。


また、新しいwipモードを使用すると、誤って破棄して変更が失われるのを防ぐことができます。


3
根拠に答えて説明するために時間を割いていただきありがとうございます。
グレッグヘンダーショット

10

ステージングされていないハンクのこの特殊なケースでv、にバインドされていたことを偶然知っていたようです。下記のコメントを参照してください。magit-revert-itemmagit-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)))))

ソース:master


ただし、kはに直接バインドされmagit-discard-itemます。そもそもそれを使うことを学んだはずです。これは2.1.0より前でも機能し、現在でも機能しています。

結論として、magit 2.1.0は大幅に再設計されました。いくつかの奇妙なコーナーケースが生き残っていないことは避けられません。そして、私は同意するでしょう、生き残った必要はありません。キーを再学習します。


1
素敵な詳細な自己回答-それを受け入れることもできます!
グルーカス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.