Magitがハンクを2つのハンクに分割


34

SOにはmagitを使用してハンクを分割することに関する質問があります。指定された2つの解決策は、リージョンをステージングする(リージョンをマーク、ヒットステージにする)か、+&を使用してすべてのハンクを縮小/成長させること-です。それは私が望んでいることではありません。

magitのステータスバッファーでは、ポイントで、または少なくともポイントの周囲の行で、ハンクを2つのハンクに分割します。

これを回す(私の悪いdiffフォーマットを許して)

@@ blah blah blah
- foo
+ bar
+ baz
+

@@ blah blah
- foo
+ bar

@ blah blah
+ baz

ポイントがバー上にあるとき。

動機:

  • bazデバッグ文であるため、foo&のコミットから削除barせずに削除したいと思います。

  • barそしてbaz部分的にしかその変更がコミット同じであってはならないことを意味し、関連しています。

  • bar大きくてbaz小さく、選択するよりもハンクを分割する方がはるかに簡単ですbar

  • 最後のポイントと同様に、20行のコミットには、ステージングすべきではない中央の単一行が含まれているとします。リージョンを使用するよりも、中央のハンクを無視して上下の2つのハンクを分割してステージングする方が簡単です。

  • diffプレゼンテーションが変更されたものの前後を分離し、途中で役に立たないものを持っている場合に、上記が時々発生する可能性があります。例えば

@@ line
- old_foo
+ random stuff
+ new foo

これを実行できるmagitには何もありません。それだけではありません:magitの設計により、magit-statusの大幅な再設計なしでは、おそらくこれをコード化することはできません。
レミ

4
ありがとう、理にかなっています。残念なことに、ポイントから前方または後方を選択してステージングすることについての自動化が考えられます。また、この機能をステージングとステージング解除の両方に使用できることにも注意してください(以前にこの機能を使用したことがないユーザー向け)。たとえば、大きなハンクをステージングし、ステージングされたセクションに切り替えて、中央のラインのステージングを解除できます。しかし、@ MrBonesには、選択をいじるよりもスプリットハンクオプションの方が簡単だということに同意しました。
グルーカス

興味深いことに、2つの異なる非隣接領域を選択します。+1
Nsukami _

1
個人的には、ハンク全体をステージングしてから、デバッグステートメントのステージングを解除します。(私のプリコミットフックは段階的なデバッグステートメントをキャッチするので、コミットする危険はありません。)
phils

1
私はMagitについて十分な知識がありませんが、Emacsのdiff-modeにはdiff-split-hunkそれを行うコマンドがあることを指摘したいだけです。IOWのリクエストはdiff-split-hunk、magit-statusバッファーからの(または同等の)使用方法を求めています。
ステファン

回答:


17

上記のコメントで述べたように、Magitは、を使用して可能な範囲を超えて、ハンクを複数のハンクに分割することをサポートしていませんgit diff -U<n>。これは、MagitがそのGitコマンドに依存して差分を作成しているためです。これは変わりません。Magitは常にGitから取得した差分をそのまま使用します。

(実際、Magitは実際には人間に関係のないヘッダーをいくつか除去しますが、変更を適用するとそれらを復元します。しかし、-U<n>サポートするものよりもさらにハンクを分割すると、まったく別の話になり、ウサギの穴に落ちます-Gitには理由があります「より小さいハンク」を許可しないため、適用できません)。

ここで求められているように、Magitは小さなハンクの表示をサポートしていませんが、ハンクの一部のみの適用をサポートしています。ステージング中に領域がアクティブになると、ハンクのその部分のみが適用されます。

ステージングされるべきでない部分がステージングされるべきテキストの真ん中にある場合、それはあまり役に立ちません。他の人が示唆しているように、この場合にすべきことは、ハンク全体をステージングしてから、2番目のステップでコミットしたくない行のステージングを解除することです。

それはもちろん自動化できます。これを自動化できる唯一の方法は、「地域以外の現在のハンクステージングすることです。しかし、実際にそれが実際にどのくらいの頻度で使用されるかについては疑問があります。 。したがって、私は現在これを実装するつもりはありません。


47

Magitでハンクを分割できます。

カーソルをハンクの内側に残すのではなく、ハンクからステージングする行を選択してsを押します。ハンクの選択された部分のみがステージングされますが、ハンクの残りの部分はステージングされていない領域に残ります。

そのようにして、それを2つに分割しました。ハンクの一部をスタッシュに移動するのに同じメカニズムを使用できると思います。kを使用すると、ハンクの一部のみが削除されます。


3
IMO、これは要求を満たすため、受け入れられた答えである必要があります(これを行う方法を思い出そうとすると、この答えを何度か見つけました)。
chaseadamsio

2
ええ、これは答えとして受け入れられるべきです!
copyninja

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.