Existe um comando que permite desfazer parcialmente as alterações em um arquivo (ou arquivos) no diretório de trabalho?
Suponha que você edite um arquivo muito, mas perceba que deseja desfazer algumas das alterações de volta ao estado consolidado, mas não as outras alterações.
Estou imaginando uma opção para git checkout
que funcione muito parecido git add -p
, ou seja, percorre o arquivo pedaço por pedaço e pergunta se você deseja mantê-lo ou não.
revert
permitem que você selecione quais alterações em um arquivo são revertidas? Perguntando genuinamente, já que só tenho experiência com CVS e Git. No Git,git checkout -- path/to/file
é um único comando que reverte todas as alterações naquele arquivo, mas não é o mesmo que o anterior.git checkout --patch
egit reset --patch
que funcionam comogit add --patch
no último git.--
geralmente indica o fim da análise de opções e que quaisquer argumentos que venham depois dela devem ser interpretados literalmente. Isso significa que você não teria que adicionar./
antes de qualquer nome de arquivo que comece com um sinal de menos, se o nome do arquivo vier depois--
.git checkout --patch
o diff parece estar ao contrário. Os símbolos de menos são ADICIONANDO texto à minha cópia de trabalho, e os símbolos de mais estão REMOVENDO linhas de minha cópia de trabalho.Com a versão git> = 1.7.1 eu posso
Não tenho certeza de quando esse recurso foi introduzido.
fonte
git reset -p
para separar seletivamente as alterações da área / índice de teste. Também não sei de cara em qual versão do Git isso foi introduzido.git checkout $file
reverte o estado do arquivo$file
para o último estado confirmado. Acho que você pode usargit checkout SHA-1 -- $file
para reverter o arquivo para o commit identificado pelo SHA-1.fonte
De quantos commits você precisa voltar e selecionar? Se for apenas um, talvez pegue um branch antes dele, faça o checkout do arquivo que você confirmou e use
git add -p
para adicioná-lo como deseja. Em seguida, você pode voltar para onde estava e fazer o checkout do arquivo do branch temporário.isso é:
Outras alternativas incluem voltar e editar o commit com
git rebase -i
(marcando o commit comoedit
, então fazer umgit reset HEAD^
e refazer o commit quando cair de volta no shell).Se as mudanças que você precisa selecionar estão espalhadas por uma série de commits, pode ser melhor extraí-los como patches (ou um patch cobrindo todos eles) e editar manualmente o patch, retirando as mudanças que você deseja manter, e alimentar o resíduo em
git apply --reverse
.fonte