Quero reverter as alterações feitas por um commit específico em um determinado arquivo.
Posso usar o comando git revert para isso?
Alguma outra maneira simples de fazer isso?
Quero reverter as alterações feitas por um commit específico em um determinado arquivo.
Posso usar o comando git revert para isso?
Alguma outra maneira simples de fazer isso?
Respostas:
A maneira mais limpa que eu já vi de fazer isso é descrita aqui
git show some_commit_sha1 -- some_file.c | git apply -R
Semelhante à resposta do VonC, mas usando git show
e git apply
.
fatal: unrecognized input
-3
flag ao git request para mesclagem de três vias quando o patch falha, pois geralmente estou corrigindo uma alteração um pouco no tempo.
some_file.c
inclui o caminho para o arquivo, se houver um caso contrário você vai silenciosamente remendo nada :)
Supondo que não há problema em alterar o histórico de consolidação, aqui está um fluxo de trabalho para reverter alterações em um único arquivo em uma consolidação anterior:
Por exemplo, você deseja reverter as alterações em 1 arquivo ( badfile.txt
) no commit aaa222
:
aaa333 Good commit
aaa222 Problem commit containing badfile.txt
aaa111 Base commit
Rebase na confirmação básica, corrija a confirmação do problema e continue.
1) Inicie o rebase interativo:
git rebase -i aaa111
2) Marque o problema de confirmação para edição no editor, alterando pick
para e
(para edição):
e aaa222
pick aaa333
3) Reverta as alterações no arquivo incorreto:
git show -- badfile.txt | git apply -R
4) Adicione as alterações e corrija o commit:
git add badfile.txt
git commit --amend
5) Termine o rebase:
git rebase --continue
edit
não estavam aparecendo como alterados. Mas git show -- badfile.txt | git apply -R
deu a resposta que eu precisava <3
git revert
é para todo o conteúdo do arquivo em uma consolidação.
Para um único arquivo, você pode escrevê-lo :
#!/bin/bash
function output_help {
echo "usage: git-revert-single-file <sha1> <file>"
}
sha1=$1
file=$2
if [[ $sha1 ]]; then
git diff $sha1..$sha1^ -- $file | patch -p1
else
output_help
fi
(Nos utilitários git-shell-scripts da smtlaissezfaire )
Nota:
Outra maneira é descrita aqui se você ainda não confirmou sua modificação atual.
git checkout -- filename
git checkout
possui algumas opções para um arquivo, modificando o arquivo de HEAD, substituindo sua alteração.
Dropped.on.Caprica menciona nos comentários :
Você pode adicionar um alias ao git para fazer isso
git revert-file <hash> <file-loc>
e reverter esse arquivo específico.
Veja esta essência .
[alias]
revert-file = !sh /home/some-user/git-file-revert.sh
git revert-file <hash> <file-loc>
e reverter esse arquivo específico. Eu tirei essa resposta (embora eu tenha que fazer algumas edições para funcionar corretamente). Você pode encontrar uma cópia do meu .gitconfig
e roteiro editado aqui: gist.github.com/droppedoncaprica/5b67ec0021371a0ad438
Eu simplesmente usaria a --no-commit
opção para git-revert
remover os arquivos que você não deseja reverter do índice antes de finalmente enviá-lo. Aqui está um exemplo mostrando como reverter facilmente apenas as alterações para foo.c no segundo commit mais recente:
$ git revert --no-commit HEAD~1
$ git reset HEAD
$ git add foo.c
$ git commit -m "Reverting recent change to foo.c"
$ git reset --hard HEAD
O primeiro git-reset
"desestabiliza" todos os arquivos, para que possamos adicionar novamente apenas o arquivo que queremos reverter. A final git-reset --hard
se livra do arquivo restante revertido que não queremos manter.
Muito mais simples:
git reset HEAD^ path/to/file/to/revert
então
git commit --amend
e depois
git push -f
o arquivo se foi e confirma o hash, a mensagem etc. é a mesma.
git checkout -- path/to/file/to/revert
passo? Além disso, não é verdade que o hash é o mesmo depois, certo? A última frase pode ser melhor como algo como: "O resultado é que a última confirmação é substituída por uma nova que difere apenas no fato de não conter as alterações no arquivo revertido".
git reset HEAD^ path/to/file/to/revert/in/commit
O comando acima retirará o arquivo do commit, mas ele será refletido no git status
.
git checkout path/to/file/to/revert/in/commit
O comando acima reverterá as alterações (como resultado, você obtém o mesmo arquivo que HEAD).
git commit
(Passe --amend
para alterar o commit.)
git push
Com isso, o arquivo que já está no commit é removido e revertido.
As etapas acima devem ser seguidas na ramificação em que a confirmação é feita.
Você pode seguir este procedimento:
git revert -n <*commit*>
( -n
reverta todas as alterações, mas não as confirma)git add <*filename*>
(nome do (s) arquivo (s) que você deseja reverter e confirmar)git commit -m 'reverted message'
(adicione uma mensagem para reverter)Se você deseja redefinir as alterações em um arquivo a partir do seu último commit, é isso que geralmente estou usando. Eu acho que essa é a solução mais simples.
Observe que o arquivo será adicionado à área de preparação.
git checkout <prev_commit_hash> -- <path_to_your_file>
Espero que ajude :)