Quando faço alterações em um arquivo no Git, como posso confirmar apenas algumas delas?
Por exemplo, como eu poderia confirmar apenas 15 das 30 linhas que foram alteradas em um arquivo?
git
git-commit
freddiefujiwara
fonte
fonte
git gui
=git add -e
>git add -i -p
; em termos de conveniência:git gui
>git add -i -p
>git add -e
. Assim: escolhergit gui
quando você tem acesso a X. escolhergit add -i -p
para coisas simples e quando você não tem ou quer usar X.git add -e
para estadiamento complexo sem X.Respostas:
Você pode usar
git add --patch <filename>
(ou-p
abreviar), e o git começará a dividir seu arquivo no que ele considera sensatos "pedaços" (partes do arquivo). Em seguida, ele será solicitado com esta pergunta:Aqui está uma descrição de cada opção:
Se o arquivo ainda não estiver no repositório, você poderá fazê-lo
git add -N <filename>
. Depois você pode continuargit add -p <filename>
.Depois, você pode usar:
git diff --staged
para verificar se você efetuou as alterações corretasgit reset -p
para desfilar porções adicionadas por enganogit commit -v
para visualizar sua confirmação enquanto você edita a mensagem de confirmação.Observe que isso é muito diferente do
git format-patch
comando, cujo objetivo é analisar dados de confirmação em.patch
arquivos.Referência para o futuro: Git Tools - Interativo
fonte
-p/--patch
é um atalho para a ação do patch dentro do-i/--interactive
comando que inicia o modo interativo útil .git diff
faz.e
, você pode editar o galã manualmente, substituindo+
ou-
por#
git push
isso já está atualizado. e segit diff
eu vejo os pedaços que eu dissen
. segit diff --staged
eu vejo o commit que quero enviar. Supondo que eu possa enviar por push o commit, como excluo os pedaços que eu disseno
?Você pode usar
git add --interactive
or , e então ( not ); consulte Modo interativo na página de manual git-add , ou simplesmente siga as instruções.git add -p <file>
git commit
git commit -a
O Modern Git também possui
git commit --interactive
(egit commit --patch
, que é um atalho para corrigir a opção no commit interativo).Se você preferir fazê-lo a partir da GUI, pode usar o git-gui . Você pode simplesmente marcar os pedaços que deseja incluir no commit. Pessoalmente, acho mais fácil do que usar
git add -i
. Outras GUIs do git, como QGit ou GitX, também podem ter essa funcionalidade.fonte
O git gui fornece essa funcionalidade sob a visualização diff. Basta clicar com o botão direito do mouse nas linhas em que você está interessado e você verá um item de menu "encene esta linha para confirmar".
fonte
gitk
, mas ele está incluído no Git Bash for Windows; você deve ter uma entrada de menu Iniciar para ele ou pode iniciá-lo com o comandogit gui
. Há também ostage this hunk
que provavelmente é mais útil questage this line
. Pode ser novo, já que esta resposta foi criada há 10 anos.Acredito que essa
git add -e myfile
é a maneira mais fácil (pelo menos de minha preferência), pois ela simplesmente abre um editor de texto e permite que você escolha qual linha deseja exibir e qual não deseja. Em relação aos comandos de edição:conteúdo adicionado:
conteúdo removido:
conteúdo modificado:
Todos os detalhes sobre
git add
estão disponíveis emgit --help add
fonte
-e
é--edit
.git --help add
s
modo de patch interativo.git add -e
) * não * altera o conteúdo do arquivo no disco. Ele apenas move parte das alterações de não faseado para faseado (índice).Se você estiver usando o vim, experimente o excelente plugin chamado fugitivo .
Você pode ver o diff de um arquivo entre a cópia de trabalho e o índice com
:Gdiff
e, em seguida, adicionar linhas ou blocos ao índice usando comandos clássicos do vim diff comodp
. Salve as modificações no índice e confirme:Gcommit
, e pronto.Muito bons screencasts introdutórios aqui (ver esp. Parte 2 ).
fonte
:diffget/:diffput
no modo visual, onde posso escolher linhas específicas, as quais quero redefinir / confirmar. Portanto, verifique novamente: o vim é incrível.Eu recomendaria fortemente o uso do SourceTree da Atlassian. (É grátis.) Isso é trivial. Você pode organizar blocos de código individuais ou linhas de código individuais de maneira rápida e fácil.
fonte
Vale ressaltar que, para usar
git add --patch
em um novo arquivo, você precisa primeiro adicionar o arquivo ao índice comgit add --intent-to-add
:fonte
Quando tenho muitas alterações e acabo criando algumas confirmações, quero salvar meu ponto de partida temporariamente antes de preparar as coisas.
Como isso:
A resposta de Whymarrh é o que eu costumo fazer, exceto que às vezes há muitas mudanças e posso dizer que posso cometer um erro ao encenar as coisas, e quero um estado comprometido no qual possa recorrer para uma segunda passagem.
fonte
Se você usa o emacs, dê uma olhada no Magit , que fornece uma interface git para o emacs. Ele suporta blocos de teste (partes de arquivos) muito bem.
fonte
A Intellij IDEA (e acho que todos os outros produtos da série) tem suporte para confirmações parciais desde a v2018.1
fonte
Para quem usa extensões Git :
Na janela Confirmar, selecione o arquivo que deseja confirmar parcialmente, depois selecione o texto que deseja confirmar no painel direito, clique com o botão direito do mouse na seleção e escolha 'Preparar linhas selecionadas' no menu de contexto.
fonte
s
- muito útil para preparar rapidamente partes de arquivos para uma confirmação.Muito parecido com a resposta da jdsumsion, você também pode esconder seu trabalho atual, mas depois usar um difftool como meld para extrair as alterações selecionadas do esconderijo. Dessa forma, você pode editar os blocos manualmente muito facilmente, o que é um pouco trabalhoso quando
git add -p
:O uso do método stash oferece a você a oportunidade de testar, se seu código ainda funcionar, antes de enviá-lo.
fonte
git commit --amend
, parece que não poderá colocar o estoque posteriormente ou existe uma maneira de fazer isso?Adicionando uma resposta anterior, se você preferir usar a linha de comando, digitar
git add -e myfile
oferece a opção de escolher linha por linha o que você deseja confirmar, porque esse comando abrirá um editor com as diferenças, assim:Como você pode saber, as linhas que começam com
+
são adições, as linhas que começam com-
são exclusões. Assim:-
por espaço.
É o que
git add -h
diz sobre a adição de arquivos desta maneira (patching files):Cuidado: não altere o conteúdo do arquivo, este não é um bom lugar para fazê-lo. Basta alterar os operadores de linhas excluídas ou adicionadas.
fonte
O plugin vim-gitgutter pode encenar pedaços sem sair do editor vim usando
Além disso, ele fornece outros recursos interessantes, como uma coluna de sinal diff, como em alguns IDEs modernos
Se apenas parte do pedaço deve ser encenada por vim-fugitivo
permite a seleção visual da faixa
:'<,'>diffput
ou:'<,'>diffget
para preparar / reverter as alterações de linha individuais.fonte
Tentei
git add -p filename.x
, mas em um mac, achei o gitx ( http://gitx.frim.nl/ ou https://github.com/pieter/gitx ) muito mais fácil de confirmar exatamente as linhas que eu queria.fonte
Com o TortoiseGit:
fonte
Faz dez anos desde que essa pergunta foi feita. E espero que esta resposta seja útil para alguém. Como mencionado na resposta aqui , onde a GUI não é uma opção, a extensão de crecord de Andrew Shadura ajuda a trazer uma janela ncurses na qual podemos selecionar as linhas a serem confirmadas.
Configure a extensão da seguinte maneira:
cd ao seu repositório git e invoque-o da seguinte maneira:
Isso abriria a interface ncurses, que pode ser usada como mostrado abaixo. Pressionar as seguintes teclas na janela ncurses executará determinadas ações:
Screencast mostrando um exemplo de uso
fonte
Para usuários Atom , o pacote github inclui teste interativo, no estilo de
git gui
. Para atalhos, consulte a documentação do pacote .O uso do Atom permite trabalhar com um tema com fundo escuro (por padrão,
git gui
com fundo branco).fonte
Para o emacs também há gitsum
fonte
git-meld-index - citando no site:
O git-meld-index executa o meld - ou qualquer outro gto difftool (kdiff3, difuso etc.) - para permitir a interação interativa de alterações no índice git (também conhecido como área de preparação do 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:
Uso
Em um repositório git, execute:
Você verá o meld (ou o seu git difftool configurado) aparecer com:
ESQUERDA : arquivos temporários de continuação de diretório copiados da sua árvore de trabalho
DIREITO : diretório temporário com o conteúdo do índice. Isso também inclui arquivos que ainda não estão no índice, mas são modificados ou não rastreados na cópia de trabalho - nesse caso, você verá o conteúdo do arquivo HEAD.
Edite o índice (lado direito) até ficar feliz. Lembre-se de salvar quando necessário.
Quando terminar, 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 meld que você acabou de editar.
fonte
Se estiver na
Windows
plataforma, na minha opiniãogit gui
é uma ferramenta muito boa parastage
/commit
poucas linhas dounstaged
arquivo1. Hunk wise:
unstagged Changes
seçãoStage Hunk for commit
2. Linha sábia:
unstagged Changes
seçãoStage Lines for commit
3. Se você deseja preparar o arquivo completo, exceto algumas linhas:
unstagged Changes
seçãoCtrl+T (Stage file to commit)
Staged Changes
SeçãoUnStage Lines for commit
fonte
Como mostra uma resposta acima, você pode usar
git add --patch filename.txt
ou a forma abreviada
git add -p filename.txt
... mas para os arquivos que já estão no seu repositório, é muito melhor usar s - usando o sinalizador --patch no comando commit diretamente (se você estiver usando uma versão recente do git):
git commit --patch filename.txt
... ou, novamente, a forma abreviada
git commit -p filename.txt
... e, em seguida, usando as chaves mencionadas (y / n etc), para escolher as linhas a serem incluídas no commit.
fonte
git add -p filename.txt
" menos espaço para erro? Se você estragar a alteração parcial do arquivo, desfazer uma adição é melhor do que desfazer uma confirmação.O git-cola é uma ótima interface gráfica e também possui esse recurso. Basta selecionar as linhas para encenar e pressionar S. Se nenhuma seleção for feita, o pedaço completo é preparado.
fonte