Magit dividir pedaço em dois pedaços

34

Há uma pergunta sobre o SO sobre a divisão de blocos usando o magit, e as duas soluções apresentadas são: estágio da região (marcar uma região, estágio de sucesso) ou reduzir / aumentar todos os blocos usando +& -. Não é disso que estou procurando.

No buffer de status do magit, quero dividir um pedaço em dois pedaços, no ponto, ou pelo menos nas linhas ao redor do ponto.

Transformando isso (desculpe minha formatação diff ruim)

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

Para dentro

@@ blah blah
- foo
+ bar

@ blah blah
+ baz

Quando o ponto está na barra.

Motivações:

  • bazsendo uma instrução de depuração, eu gostaria de removê-la do commit de foo& barsem me livrar dele.

  • bare bazsendo apenas parcialmente relacionados, o que significa que suas alterações não devem estar no mesmo commit.

  • baré grande e bazpequeno, tornando muito mais fácil dividir o pedaço em vez de selecionarbar

  • Semelhante ao último ponto, digamos que um commit de 20 linhas contenha uma única linha no meio que não deve ser preparada. Seria mais fácil dividir e classificar os dois pedaços superiores e inferiores ignorando o meio do que usar a região.

  • O exposto acima pode surgir algumas vezes quando a apresentação diff separa o antes e o depois de algo que foi modificado e tem algo inútil no meio. por exemplo

@@ line
- old_foo
+ random stuff
+ new foo
Squidly
fonte
Não há nada no magit que possa fazer isso. Mais do que isso: o design do magit torna isso provavelmente impossível de codificar sem um vasto redesenho do status do magit.
Rémi
4
Obrigado, faz sentido. Infelizmente, o melhor que consegui pensar seria em alguma automação para selecionar para frente ou para trás a partir do ponto e, em seguida, preparar. Também é importante notar (para pessoas que não usaram o recurso antes) que você pode usar a região tanto para o palco quanto para o palco. Por exemplo, você pode montar um grande pedaço, depois mudar para a seção faseada e desfazer uma linha no meio. Mas concordou com o @MrBones que uma opção de split-hunk seria mais fácil do que mexer na seleção.
glucas
Interessante, selecionar 2 distingue regiões não adjacentes. +1
Nsukami _
1
Pessoalmente, eu prepararia o pedaço inteiro e, em seguida, desfaria a instrução de depuração. (My pre-commit capturas gancho encenado instruções de depuração, por isso não há perigo de me cometer um.)
phils
1
Eu não sei o suficiente sobre o Magit para ajudar, mas só quero salientar que o modo diff do Emacs tem o comando diff-split-hunkque faz exatamente isso. IOW, sua solicitação é uma maneira de usar diff-split-hunk(ou algo equivalente) do buffer de status do magit.
27417 Stefan #

Respostas:

17

Como mencionado nos comentários acima, o Magit não suporta dividir um pedaço em vários pedaços além do que é possível usando git diff -U<n>. Isso porque o Magit conta com o comando Git para criar as diferenças. Isso não vai mudar, o Magit sempre usará as diferenças que obtém do Git como está.

(Na verdade, o Magit retira alguns cabeçalhos que não são realmente relevantes para os seres humanos, mas os restaura ao aplicar mudanças. Mas dividir um pedaço além do que -U<n>suporta é uma história totalmente diferente, isso levaria a uma toca de coelho - há uma razão pela qual o Git não permite "pedaços menores", não seria possível aplicá-los).

Embora o Magit não suporte a exibição de pedaços menores, conforme solicitado aqui, ele suporta a aplicação de apenas partes de um pedaço. Quando a região está ativa durante a preparação, somente essa parte do pedaço é aplicada.

Isso não ajuda muito quando a parte que não deve ser encenada está bem no meio do texto que deve ser encenada. Como outros sugeriram, o que você deve fazer nesse caso é preparar todo o pedaço e desestabilizar a linha que você não deseja confirmar em uma segunda etapa.

Claro que isso poderia ser automatizado. A única maneira de ver em que isso pode ser automatizado é "encenar o pedaço atual, exceto a região. Mas tenho algumas dúvidas sobre a frequência com que isso seria realmente útil e temo que não seja fácil implementá-lo com robustez. E, portanto, atualmente não pretendo implementar isso.

tarso
fonte
47

Você pode dividir pedaços com o Magit.

Em vez de simplesmente deixar o cursor dentro do pedaço, selecione as linhas que deseja colocar no pedaço e pressione s . Somente a parte selecionada do pedaço será preparada, enquanto o restante ainda fica na área não preparada.

Dessa forma, você o dividiu em dois. Eu acho que você pode usar o mesmo mecanismo para mover partes de pedaços para o esconderijo. Ao usar k, você apenas limpará parte do pedaço.

Sven Rieke
fonte
3
Na IMO, essa deve ser a resposta aceita, pois atende à solicitação (e eu encontrei essa resposta algumas vezes ao tentar lembrar como fazer isso).
chaseadamsio
2
Sim, isso deve ser aceito como resposta!
usar o seguinte comando
3

Se você deseja descartar partes de um pedaço, selecione as linhas dentro do pedaço que deseja descartar e pressione x .

NeilDurant
fonte