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


34

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

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

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

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

으로

@@ blah blah
- foo
+ bar

@ blah blah
+ baz

포인트가 바에있을 때.

동기 부여 :

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

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

  • 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.