Corrigir apenas parte do arquivo no Git

Quando faço alterações em um arquivo no Git, como posso fazer apenas algumas alterações?

Por exemplo, como posso executar apenas 15 linhas de 30 linhas que foram alteradas em um arquivo?

2394
06 июля '09 в 5:25 2009-07-06 05:25 freddiefujiwara é definido 06 de julho de 2009 às 05:25 2009-07-06 05:25
@ 22 respostas

Você pode usar o git add --patch <filename> (ou -p para abreviar), e o git começará a dividir seu arquivo no que considera "partes" razoáveis ​​(partes do arquivo). Então ele vai te dizer esta pergunta:

 Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]? 

Aqui está uma descrição de cada opção:

  • y prepare esta peça para o próximo commit
  • n não coloque esta peça para o próximo commit
  • q saída; não coloque esta peça ou qualquer uma das peças restantes
  • a coloca esta peça e todos os fragmentos subseqüentes no arquivo
  • d não coloque este bloco ou qualquer fragmento posterior no arquivo
  • g selecione uma peça para ir
  • / procura por um bloco que corresponda à expressão regular especificada
  • deixe esta peça não resolvida, veja a próxima peça não resolvida
  • Deixe esta peça sem solução, veja a próxima peça
  • k deixe esta peça sem solução, veja a peça anterior não solucionada
  • K deixe esta peça sem solução, veja a peça anterior
  • s divide a peça atual em fragmentos menores
  • e edite manualmente o bloco atual
  • ? ajuda de impressão

Se o arquivo ainda não estiver no repositório, você pode primeiro fazer o git add -N <filename> . Depois disso, você pode continuar com git add -p <filename> .

Depois disso, você pode usar:

  • git diff --staged para ter certeza de colocar as alterações corretas
  • git reset -p para desfazer por engano fragmentos adicionados
  • git commit -v para visualizar seu commit ao editar uma mensagem de commit.

Por favor, note que isto é muito diferente do comando git format-patch , que visa analisar os dados .patch arquivos .patch .

Link para o futuro: Git Tools - Produção interativa

3149
06 июля '09 в 5:36 2009-07-06 05:36 A resposta é dada por cloudhead .

Você pode usar git add --interactive ou git add -p <file> , e então git commit ( não git commit -a ); veja o modo interativo na página man do git-add ou simplesmente siga as instruções.

O Modern Git também possui git commit --interactive (e git commit --patch , que é um atalho para o parâmetro patch em commit interativo).

border=0

Se você preferir fazer isso a partir da GUI, você pode usar o git-gui . Você pode simplesmente marcar as partes que deseja incluir no commit. Eu pessoalmente acho mais fácil do que usar o git add -i . Outras GUIs do Git, como QGit ou GitX, também podem ter essa funcionalidade.

223
06 июля '09 в 14:49 2009-07-06 14:49 a resposta é dada por Jakub Narębski Autor: Jakub Narębski |

git gui fornece essa funcionalidade como um diff. Basta clicar com o botão direito do mouse na linha de seu interesse e você verá o item de menu "Esta linha para corrigir".

118
06 июля '09 в 5:41 2009-07-06 05:41 Resposta foi dada por Ionuț G. Stan 06 julho '09 at 5:41 am 2009-07-06 05:41

Acredito que o git add -e myfile é a maneira mais fácil (pelo menos a minha preferência), porque ele simplesmente abre o editor de texto e permite que você escolha qual linha deseja executar e qual linha você não deseja. Quanto aos comandos de edição:

Adicionado conteúdo:

O conteúdo adicionado é representado por linhas que começam com "+". Você pode impedir a criação de linhas de adição excluindo-as.

conteúdo remoto:

O conteúdo excluído é representado por strings começando com "-". Você pode impedir sua exclusão convertendo "-" para "" (espaço).

conteúdo modificado:

O conteúdo modificado é representado pelas linhas "-" (supressão do conteúdo antigo), seguidas das linhas "+" (adição de conteúdo substituto). Você pode impedir a instalação de uma modificação convertendo as strings "-" para "" e removendo as linhas "+". Lembre-se de que a alteração de apenas metade de um par pode levar a alterações de índice confusas.

Cada git add está disponível em git --help add

64
25 сент. a resposta é dada pelo theFreedomBanana Set 25 2015-09-25 23:45 '15 às 23:45 2015-09-25 23:45

Se você usar o vim, você pode tentar um ótimo plugin chamado fugitivo .

Você pode ver um arquivo diff entre uma cópia de trabalho e um índice com :Gdiff e, em seguida, adicionar linhas ou colunas ao índice usando comandos clássicos de vim diff, como dp . Salve as alterações no índice e copie-o com :Gcommit e pronto.

Muito bons vídeos de introdução aqui (veja a parte 2 ).

42
23 февр. A resposta é dada por François em 23 de fevereiro. 2012-02-23 13:37 '12 em 1:37 pm 2012-02-23 13:37

Eu recomendo usar o SourceTree da Atlassian. (É grátis.) Isso torna trivial. Você pode criar, de maneira rápida e fácil, pedaços individuais de código ou linhas de código individuais.

2019

29
12 авг. a resposta é dada por user486646 12 ago. 2014-08-12 16:32 '14 às 16:32 2014-08-12 16:32

Vale a pena notar que para usar git add --patch para um novo arquivo, você deve primeiro adicionar o arquivo ao índice usando git add --intent-to-add :

 git add -N file git add -p file 
22
05 дек. A resposta é dada por user1338062 05 dez. 2014-12-05 20:29 '14 às 20:29 2014-12-05 20:29

Quando eu tenho muitas mudanças e, eventualmente, criei alguns commits das mudanças, eu quero salvar temporariamente meu ponto de partida antes de criar coisas.

Aqui está:

 $ git stash -u Saved working directory and index state WIP on master: 47a1413 ... $ git checkout -p stash ... step through patch hunks $ git commit -m "message for 1st commit" $ git checkout -p stash ... step through patch hunks $ git commit -m "message for 2nd commit" $ git stash pop 

A resposta de Whymarh é o que eu costumo fazer, exceto pelo fato de que muitas vezes acontecem muitas mudanças, e posso dizer que posso cometer um erro ao definir as coisas, e quero que algum estado se retire para a segunda passagem. .

19
07 июня '13 в 1:14 2013-06-07 01:14 a resposta é dada jdsumsion Junho 07 '13 at 1:14 2013-06-07 01:14

Se você estiver usando o emacs, confira o Magit , que fornece a interface git para o emacs. Bem suporta fragmentos intermediários (partes de arquivos).

12
08 июля '09 в 10:00 2009-07-08 10:00 Resposta dada por Mark van Lent 08 de julho de 2009 às 10:00 2009-07-08 10:00

Assim como no jdsumsion, você também pode ocultar seu trabalho atual, mas depois usar um difffool, como meld, para extrair as alterações selecionadas do cache. Então você pode até mesmo editar manualmente as peças, o que é um pouco doloroso quando no git add -p :

 $ git stash -u $ git difftool -d -t meld stash $ git commit -a -m "some message" $ git stash pop 

Usando o método stash, você terá a oportunidade de testar se seu código ainda está em execução antes de executá-lo.

8
07 авг. resposta dada derhoch 07 ago. 2013-08-07 16:25 '13 às 16:25 2013-08-07 16:25

Intellij IDEA (e acredito que todos os outros produtos da série) construíram suporte para commits parciais, desde v2018.1

2019

Para aqueles que usam extensões do Git :

Na janela "Copiar", selecione o arquivo que deseja consolidar parcialmente, selecione o texto que deseja corrigir no painel direito, clique com o botão direito do mouse na seleção e selecione "Gerar linhas selecionadas" no menu de contexto.

7
27 июля '15 в 12:52 2015-07-27 12:52 a resposta é dada srgstm 27 de julho '15 às 12:52 2015-07-27 12:52

O plugin vim-gitgutter pode criar pedaços sem sair do editor vim, usando

 :GitGutterStageHunk 

Além disso, fornece outros recursos interessantes, como uma coluna com um sinal diferente, como em alguns IDEs modernos.

Se apenas parte do pedaço deve ser fornecido vim -fugitivo

 :Gdiff 

permite que você selecione o alcance do intervalo visível, então :'<,'>diffput ou :'<,'>diffget para alterar / alterar linhas individuais.

6
09 янв. a resposta é dada c0ffeeartc 09 jan. 2015-01-09 20:11 '15 às 20:11 2015-01-09 20:11

Eu tentei git add -p filename.x , mas em um Mac eu achei que o gitx ( http://gitx.frim.nl/ ou https://github.com/pieter/gitx ) é muito mais fácil de fazer exatamente as linhas que eu queria .

5
16 авг. resposta dada jasongregori 16 ago 2011-08-16 02:43 '11 às 2:43 2011-08-16 02:43

Com o TortoiseGit:

Clique com o botão direito do mouse no arquivo e use o Context Menu → Restore after commit . Isto irá criar uma cópia do arquivo como está. Então você pode editar o arquivo, por exemplo. TortoiseGitMerge e descartar qualquer alteração que você não queira fazer. Depois de salvar essas alterações, você pode confirmar o arquivo.

4
06 апр. a resposta é dada por Fr0sT 06 abr. 2015-04-06 19:16 '15 às 19:16 2015-04-06 19:16

git-meld-index - citando o site:

git -meld-index executa meld - ou qualquer outro git diffftool (kdiff3, diffuse, etc.) - para que você possa modificar interativamente as mudanças no índice git (também conhecido como git).

Isso é semelhante à funcionalidade do git add -p e git add --interactive. Em alguns casos, o meld é mais fácil / rápido de usar do que o git add -p. Isso é porque o meld permite, por exemplo:

  • veja mais contexto
  • veja diferenças intrínsecas
  • Edite-o manualmente e veja as atualizações do 'live' diff (atualizadas após cada pressionamento de tecla)
  • vá para a mudança, sem n para cada mudança que você quer pular.

Uso de

No repositório git, execute:

 git meld-index 

Você verá que o meld (ou o git diffftool configurado) aparece

ESQUERDA : arquivos de diretório temporários copiados da árvore de trabalho

DIREITA : diretório temporário com o conteúdo do índice. Isso também inclui arquivos que ainda não estão no índice, mas que foram alterados ou não foram verificados na cópia de trabalho - nesse caso, você verá o conteúdo do arquivo de HEAD.

Edite o índice (direita) até que esteja feliz. Não esqueça de salvar se necessário.

Quando estiver pronto, feche o meld e o git-meld-index atualizará o índice para corresponder ao conteúdo do diretório temporário no lado direito do comando meld que você acabou de editar.

2
04 июля '15 в 23:26 2015-07-04 23:26 a resposta é dada por Croad > Julho 04 '15 em 23:26 2015-07-04 23:26

Emacs também tem gitsum

2
13 июля '09 в 0:52 2009-07-13 00:52 a resposta é dada em 13 de julho de 2009 às 00:52 2009-07-13 00:52

Adicionando a resposta anterior, se você preferir usar a linha de comando, digite git add -e myfile lhe dá a escolha de selecionar linha por linha que você quer consolidar, porque este comando irá abrir um editor com diferenças, por exemplo:

2019

24 авг. A resposta é dada Beto Aveiga 24 ago. 2018-08-24 18:24 18 às 18:24 de 2018-08-24 18:24

Para usuários Atom , o pacote github inclui uma configuração de estilo git gui interativa. Para etiquetas, consulte a documentação de embalagem.

Usar o Atom permite que você trabalhe com um tema com fundo escuro (por padrão, o git gui tem um fundo branco).

1
10 апр. Resposta dada por Ioannis Filippidis 10 abr 2018-04-10 05:31 18 às 17:31 2018-04-10 05:31

Como uma resposta acima mostra, você pode usar git add --patch filename.txt

ou forma abreviada git add -p filename.txt

... mas para arquivos que já estão em seu repositório, é muito melhor usar o sinalizador -patch para o comando commit (se você estiver usando uma versão bastante recente do git): git commit --patch filename.txt

... ou, novamente, a forma curta git commit -p filename.txt

... e depois usando as chaves especificadas (y / n, etc.), para selecionar as linhas a serem incluídas no commit.

1
30 июня '14 в 11:34 2014-06-30 11:34 a resposta é dada por Samuel Lampa em 30 de junho '14 às 11:34 2014-06-30 11:34

O git-cola é uma excelente interface gráfica, bem como uma função incorporada. Simplesmente selecione as linhas para a cena e pressione S. Se nenhuma seleção for feita, um trecho completo será executado.

0
27 авг. a resposta é dada AndiDog 27 ago. 2015-08-27 14:28 '15 às 14:28 2015-08-27 14:28

Se em uma plataforma Windows , na minha opinião, o git gui é a melhor ferramenta para um stage / commit várias linhas de um arquivo não unstaged .

1. Hank sábio:

  • Selecione um arquivo na seção unstagged Changes
  • Clique com o botão direito do mouse no código que você deseja executar.
  • Escolha o Stage Hunk for commit

2. Linha:

  • Selecione um arquivo na seção unstagged Changes
  • Selecione linha / linhas a serem organizadas.
  • Selecione as Stage Lines for commit

3. Se você deseja criar um arquivo completo, exceto por algumas linhas:

  • Selecione um arquivo na seção unstagged Changes
  • Pressione Ctrl+T (Stage file to commit)
  • O arquivo selecionado agora é movido para a seção Staged Changes .
  • Selecione linha / linhas a serem organizadas.
  • Selecione UnStage Lines for commit
0
28 мая '15 в 15:52 2015-05-28 15:52 Resposta é dada por Anvesh Yalamarthy em 28 de maio de '15 às 15:52 2015-05-28 15:52

Outras questões sobre tags ou Ask a Question