Estou tentando git add --interactive
adicionar seletivamente algumas alterações ao meu índice, mas recebo continuamente a mensagem "Seu trecho editado não se aplica. Editar novamente ...". Eu recebo esta mensagem mesmo se eu escolher a opção e, e imediatamente salvo / fecho meu editor. Em outras palavras, sem editar o pedaço, o patch não se aplica.
Aqui está o exemplo exato que estou usando (estou tentando montar uma pequena demonstração):
Arquivo original:
first change
second change off branch
third change off branch
second change
third change
fourth change
Novo arquivo:
Change supporting feature 1
first change
second change off branch
third change off branch
second change
third change
fourth change
bug fix 1
change supporting feature 1
Estou tentando mostrar como usar git add --interactive
para adicionar apenas a linha "bug fix 1" ao índice. Executando um suplemento interativo no arquivo, eu escolho o modo de patch. Me apresenta com
diff --git a/newfile b/newfile
index 6d501a3..8b81ae9 100644
--- a/newfile
+++ b/newfile
@@ -1,6 +1,9 @@
+Change supporting feature 1
first change
second change off branch
third change off branch
second change
third change
fourth change
+bug fix 1
+change supporting feature 1
Eu respondo com divisão, seguido de "não" para aplicar o primeiro pedaço. O segundo pedaço, tento editar. Originalmente, tentei excluir o resultado final - não funcionou. Deixar o pedaço sozinho também não funciona, e não consigo descobrir por quê.
fonte
-
's no início das linhas que não existem no arquivo para começar; é um diff e não pode deletar linhas que ainda não estejam lá. Então, se uma linha no diff começar com+
e você alterá-la para-
git, passa para WTF? porque agora a linha marcada para remoção não existe para começar (em vez disso, essa linha foi marcada para adição, e quando uma linha marcada para adição está marcada para remoção git não pode remover uma linha que ainda não esteja no arquivo) .Respostas:
Para este exemplo específico, você precisa ajustar os números das linhas no pedaço. Mude a linha:
para que em vez disso leia:
fonte
É como nesta postagem git-add ?
Veja também este commit em git add -p .
A resposta de Ortomala Lokni refere-se à postagem do blog de Joaquín Windmüller " Selecione seletivamente as alterações para fazer commit com git (ou Imma edite seu pedaço) "
Em vez de contar linhas, o que o Git gostaria de fazer é unir pedaços sobrepostos (quando um é editado) antes de aplicar o referido pedaço editado.
Isso foi discutido em meados de 2018 e evitaria cenários como:
fonte
- foo
para `` (apenas um espaço em branco, não "um espaço em branco e a linha inteira"). Levei um tempo para entender que deveria ser `foo`.É claro que estou atrasado para isso, mas mesmo assim gostaria de mencionar para registro que esse problema foi discutido no ano passado na lista de e- mails do git e parece que não mudou muito desde então.
Este problema particular decorre da divisão e tentativa de editar o mesmo pedaço. A análise, conforme postado originalmente por Jeff King, do problema subjacente é essencialmente:
Jeff conclui sua postagem com uma solução alternativa muito pragmática que sempre tem êxito e, portanto, é altamente recomendada:
Ao escolher editar apenas um pedaço não dividido anteriormente, você não terá que lidar com os números das linhas.
fonte
^M
no arquivo diff. Depois de salvar o arquivo com terminações CR, o patch de edição interativa foi aprovado!Quando você não deseja excluir uma linha que foi preparada para exclusão, como em
onde você deseja manter a segunda linha, certifique-se de substituir o
-
por um espaço, em vez de excluir a linha inteira (como faria para se livrar de uma linha adicionada). O Git usará a linha para o contexto.fonte
É importante também modificar corretamente o cabeçalho do pedaço (por exemplo
@@ -1,6 +1,9 @@
). Joaquin Windmuller revela o segredo da edição de cabeçalhos em uma de suas postagens de blog .fonte
Recentemente, ao ler este tópico, descobri como fazer a edição manual.
O truque que usei foi se eu tivesse uma diferença como:
O truque é remover completamente as duas linhas que não quero, fazendo com que a diferença resultante pareça:
Embora isso seja provavelmente óbvio para a maioria das pessoas, não era para mim até hoje e achei que deveria apenas compartilhar minha experiência. Por favor, diga-me se existe algum perigo para este método.
fonte
+
para' '
por pelo menos uma hora.Você pode editar manualmente os números das linhas, o que é definitivamente útil em alguns casos. No entanto, você provavelmente poderia ter evitado esse problema específico NÃO primeiro dividindo o pedaço.
Se você perceber que provavelmente precisará editar algo mais tarde no pedaço que o Git escolheu automaticamente, é melhor apenas editar o pedaço inteiro em vez de dividir, preparar metade e editar a outra metade. Git fará um trabalho melhor descobrindo isso.
fonte
Cheguei a esta questão procurando uma solução para o mesmo problema, e não consegui descobrir como alterar os números das linhas (como sugerido acima) no pedaço para fazer com que o git o aceite no meu caso. Eu encontrei uma maneira muito melhor de fazer isso usando
git gui
. Lá você pode selecionar as linhas no diff que deseja encenar, então clicar com o botão direito e escolher "Linhas de fase do commit". Lembro-me que o git-cola também tem a mesma funcionalidade.fonte
git-cola
parece funcionar em Linux, Windows e MacOS.Um problema adicional que tive quando recebi esse erro foi que as terminações de linha mudaram quando salvei o arquivo de edição.
Eu estava usando o Windows e o Bloco de notas para minhas edições (salva apenas com terminações de linha do Windows). Meu código foi escrito em Notepad ++ e eu o configurei para ter terminações de linha no estilo Unix / Linux.
Quando mudei minhas configurações para ter o Notepad ++ como o editor git padrão, fui capaz de fazer minhas edições no pedaço.
fonte
git config --global core.editor '"C:/Program\ Files\ \(x86\)/Notepad++/notepad++.exe"'
(adapte de acordo com o local onde o notepad ++ está instalado no seu PC)Um motivo para mensagens estranhas "Seu pedaço editado não se aplica" (provavelmente acompanhado de algo como "erro: fragmento de patch sem cabeçalho na linha ...") pode ser seu editor se ele estiver configurado para remover espaços em branco à direita. Obviamente, isso causaria grandes problemas, pois os patches codificam linhas vazias, já que as linhas com um espaço, qualquer pedaço contendo linhas vazias não seria aplicado se fosse salvo com tal editor. Portanto, na verdade, qualquer pedaço contendo quaisquer linhas vazias inalteradas deixaria de ser aplicado após a edição com se a remoção do espaço em branco final estiver ativada.
fonte
Para sua informação, estava recebendo um erro ligeiramente relacionado ... quando adicionei o patch seguindo a instrução sugerida acima ... Não estava apresentando nenhum erro, no entanto. Eu estava recebendo repetidamente me pedindo para encenar o mesmo pedaço ... Eu percebi que estava executando uma versão mais antiga do Vim 7.4 ... Eu atualizei o vim e está funcionando como esperado agora. Espero que isso ajude alguém ..
fonte