Você pode usar git checkout -p
, o que permite escolher blocos individuais da diferença entre sua cópia de trabalho e índice para reverter. Da mesma forma, git add -p
permite escolher blocos para adicionar ao índice e git reset -p
escolher blocos individuais a partir do diff entre o índice e HEAD para retornar ao índice.
$ git checkout -p file/to/partially/revert
# or ...
$ git checkout -p .
Se você deseja capturar instantaneamente seu repositório git para preservar essas alterações antes de revertê-las, eu gostaria de fazer:
$ git stash; git stash apply
Se você usa isso com freqüência, convém usar o alias:
[alias]
checkpoint = !git stash; git stash apply
A reversão de trechos ou linhas individuais pode ser ainda mais fácil se você usar um bom modo de editor ou plug-in, que pode fornecer suporte para selecionar linhas diretamente para reverter, pois -p
pode ser um pouco desajeitado de usar às vezes. Eu uso o Magit , um modo Emacs que é muito útil para trabalhar com o Git. No Magit, você pode executar magit-status
, encontrar as diferenças para as alterações que deseja reverter, selecionar as linhas que deseja reverter (ou simplesmente colocar o cursor nos pedaços que deseja reverter, se desejar reverter um pedaço de cada vez, em vez de uma linha de cada vez) e pressione k
para reverter essas linhas específicas. Eu recomendo o Magit se você usa o Emacs.
git checkout
também tem uma-p
bandeira, que faz exatamente o que você estava pedindo em um único comando. Desculpas pelo conjunto complexo de etapas anterior; você pode apenas usargit checkout -p
. Quanto a salvar coisas, antes de fazer algo potencialmente destrutivo, costumo fazergit stash; git stash apply
(ou criar um apelido que faça isso comogit checkpoint
algo) gravar a árvore atual em um esconderijo para que eu possa voltar a ela se algo der errado.git commit -a -m "Backup Commit" --edit; git reset HEAD^
seria melhor, porque isso não sujaria meu estado de ocultação, que posso estar usando para outra coisa. Então, enquanto você tiver o SHA1, poderá selecioná-lo nos próximos 30 dias. O --edit permite adicionar informações à mensagem de confirmação para ajudá-lo a encontrar o SHA1 posteriormente, se você desejar. Por outro lado, isso sujaria o reflit git, então acho que é uma troca baseada no que você faz.git checkout -p
aplicar os patches ao índice, mas apenas prepará-los?Em seguida, edite o arquivo de correção e remova as partes que não deseja desfazer;
fonte
patchfile
parece ótimo no vim e realmente ajuda!git apply -R
em vez depatch
(apenas para ficar dentro dos domínios da git, ou no caso ao contrário do quepatch
não está disponível)patch: **** malformed patch at line 41: @@ -428,9 +443,9 @@ you should place your code here."
Você poderia fazer
Para cada arquivo que você deseja redefinir.
fonte
E se
git add -p
para adicionar apenas as alterações que você deseja ao índice.fonte
Quando executo o 'status git', ele diz:
Portanto, para cancelar as edições sem etapas, ele diz para executar:
fonte
A resposta de Brian Campbell trava meu git, versão 1.9.2.msysgit.0, por razões desconhecidas, então minha abordagem é encenar pedaços que eu quero manter, descartar as alterações na cópia de trabalho e depois ficar no palco.
fonte
git stash -p
. Você poderia fazergit stash -p; git reset --hard; git stash pop
. É efetivamente o mesmo que você está fazendo, exceto que você não precisa escrever uma mensagem de confirmação.você pode fazer
git checkout
e dar o nome das partes que deseja desfazer.fonte