Magit가 두 개의 덩어리로 분할 덩어리


34

SO를 사용하여 magit을 사용하여 덩어리를 분할하는 것에 대한 의문이 있으며 주어진 두 가지 해결책은 영역을 준비하거나 (영역을 표시하고, 적중을 표시) +&를 사용하여 모든 덩어리를 축소 / 성장시키는 것 -입니다. 그것은 내가 추구하는 것이 아닙니다.

magit의 상태 버퍼에서, 덩어리를 두 개의 덩어리로, 포인트에서 또는 적어도 포인트 주위의 선으로 나누고 싶습니다.

이것을 돌리기 (나쁜 diff 형식을 용서하십시오)

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

으로

@@ blah blah
- foo
+ bar

@ blah blah
+ baz

포인트가 바에있을 때.

동기 부여 :

  • baz디버그 문이기 때문에 foo& bar제거하지 않고 커밋에서 삭제하고 싶습니다 .

  • bar및 baz부분적으로 그 변화가 동일 커밋되지 않아야 함을 의미 관련된다.

  • bar크기가 크거나 baz작기 때문에 선택하는 것보다 덩어리를 분리하기가 훨씬 쉽습니다.bar

  • 마지막 점과 마찬가지로 20 줄 커밋에는 준비하지 않아야하는 중간 한 줄이 포함되어 있다고 가정하십시오. 지역을 사용하는 것보다 중간을 무시하고 상단과 하단 두 개의 덩어리를 분리하고 준비하는 것이 더 쉽습니다.

  • 위의 내용은 diff 표현이 수정 된 내용의 전후를 분리하고 중간에 도움이되지 않는 경우에 발생할 수 있습니다. 예 :

@@ line
- old_foo
+ random stuff
+ new foo

이것을 할 수있는 magit에는 아무것도 없습니다. 그것보다 훨씬 더 : magit의 디자인은 아마도 magit 상태의 광대 한 재 디자인없이 코드 작성에 불가능할 수 있습니다.
— Rémi

4
감사합니다. 불행히도 내가 생각할 수있는 가장 좋은 점은 앞뒤로 선택하고 스테이징하는 자동화입니다. 또한 (이전에 기능을 사용하지 않은 사람들에게) 지역을 무대와 무대에서 모두 사용할 수 있다는 점도 주목할 가치가 있습니다. 예를 들어 큰 덩어리를 스테이징 한 다음 스테이징 섹션으로 전환하여 중간에 선을 스테이징 해제 할 수 있습니다. 그러나 @MrBones에 동의하면 분할 훈크 옵션이 선택을 다루는 것보다 쉽다는 데 동의했습니다.
— glucas

흥미롭게도 2 개의 인접 지역을 선택하면 인접하지 않습니다. +1
— Nsukami _

1
개인적으로 전체 덩어리를 준비한 다음 디버그 문을 준비 해제했습니다. (사전 커밋 훅은 단계별 디버그 명령문을 포착하므로 커밋 할 위험이 없습니다.)
— phils

1
Magit에 대해 충분히 알지 못하지만, Emacs의 diff-mode diff-split-hunk가 바로 그 명령 을 가지고 있음을 지적하고 싶습니다 . IOW 귀하의 요청은 diff-split-hunkmagit-status 버퍼에서 사용하는 방법 (또는 이와 동등한 것)입니다.
— Stefan

답변:


17

위의 주석에서 언급했듯이 Magit은을 사용하여 가능한 것 이상으로 덩어리를 여러 덩어리로 나누는 것을 지원하지 않습니다 git diff -U<n>. Magit이 Git 명령을 사용하여 diff를 생성하기 때문입니다. Magit은 항상 Git에서 가져온 diff를 그대로 사용합니다.

(실제로 Magit은 실제로 인간과 관련이없는 헤더를 제거하지만 변경 사항을 적용 할 때 헤더를 복원합니다. 그러나 -U<n>지원 보다 더 많은 부분을 분리 하면 완전히 다른 이야기가 될 수 있습니다. 토끼 구멍이 생길 수 있습니다-Git이 필요한 이유가 있습니다. "작은 덩어리"를 허용하지 않으면 적용 할 수 없습니다).

Magit은 여기에서 요구 한대로 작은 덩어리를 표시하는 것을 지원하지 않지만 덩어리의 일부만 적용하는 것을 지원합니다. 준비하는 동안 영역이 활성화되면 덩어리의 해당 부분 만 적용됩니다.

스테이지하지 말아야 할 부분이 스테이징되어야하는 텍스트의 중간에있을 때는 그다지 도움이되지 않습니다. 다른 사람들이 제안했듯이,이 경우에 수행해야 할 일은 전체 덩어리를 준비한 다음 두 번째 단계에서 커밋하지 않으려는 회선을 준비 해제하는 것입니다.

물론 자동화 할 수도 있습니다. 이것이 자동화 될 수있는 유일한 방법은 " 지역을 제외하고 현재 덩어리 를 준비하는 것입니다. 그러나 그것이 실제로 얼마나 유용한 지에 대해 의문을 가지고 있으며 그것을 강력하게 구현하기가 쉽지 않을까 두려워합니다. 따라서 현재이를 구현할 계획이 없습니다.


47

Magit으로 덩어리를 분할 할 수 있습니다.

커서를 덩어리 안에 두지 말고 덩어리에서 스테이징 할 선을 선택하고 s를 누르십시오 . 덩어리의 선택된 부분 만 준비되는 반면, 덩어리의 나머지 부분은 여전히 ​​비 단계 구역에 위치합니다.

그렇게하면 두 가지로 나 split습니다. 덩어리의 일부를 숨김으로 옮기는 데 동일한 메커니즘을 사용할 수 있다고 생각합니다. k 를 사용하면 덩어리의 일부만 제거합니다.


3
IMO, 이것은 요청을 충족시키기 때문에 허용되는 답변이어야합니다 (이 방법을 기억하려고 할 때이 답변을 몇 번 찾았습니다).
— chaseadamsio

2
네, 이것이 대답으로 받아 들여 져야합니다!
— copyninja

3

덩어리의 일부를 폐기하려면 폐기하려는 덩어리 내의 행을 선택하고 x를 누르십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.