Como reverter uma pasta para um determinado commit criando um patch

97

Aqui está o meu histórico da pasta 'somefolder'

$ git log somefolder

commit 89cd
More changes to somefolder

commit ef47a
Updating somefolder and other stuff

commit e095
Bugs fixed in somefolder

Eu quero reverter alguma pasta de volta para o commit 'Bugs corrigidos em alguma pasta ".

Já que o segundo commit envolveu mudanças fora de alguma pasta, eu não quero reverter este commit.

Eu acho que a maneira mais segura seria criar um diff / patch entre commit e095 e 89cd que se aplica apenas a alguma pasta, e então aplicar esse patch. Como eu posso fazer isso?

hitfactory
fonte

Respostas:

155

Você pode usar git checkout para atualizar seu repositório para um estado específico.

git checkout e095 -- somefolder

Quanto à sua pergunta sobre como gerar o diff, também funcionaria. Basta gerar a diferença para ir de seu estado atual de volta para e095:

git diff 89cd..e095 -- somefolder
Jamessan
fonte
30
isso não remove os arquivos que foram adicionados naquele commit, use em git reset e095 -- some/foldervez disso
shime
2
Do git 2.22 você pode usar o --no-overlayfor git checkoutpara que os arquivos rastreados que não estão no commit do qual você está fazendo check-out sejam removidos.
Mariusz Pawelski
53

Você pode usar git resetpara redefinir o índice, que também incluirá a remoção de arquivos que foram adicionados em commits mais recentes ( git checkoutpor si só não faz isso):

git reset e095 -- somefolder

No entanto git reset, não atualiza a cópia de trabalho e a --hardopção não funciona com pastas. Então use git checkoutpara fazer a cópia de trabalho igual ao índice:

git checkout -- somefolder

e se você também deseja remover qualquer arquivo adicionado, você também precisa de fazer:

git clean -fd somefolder
Matthew Buckett
fonte
esta resposta funciona para mim quando o diretório inclui novos arquivos.
Yahoho
2
Essa resposta é muito melhor se você realmente quiser um instantâneo limpo do repositório naquele momento.
data princess
Muito melhor mesmo!
Alexis Pautrot