Fiz algumas alterações em um arquivo que foi confirmado algumas vezes como parte de um grupo de arquivos, mas agora quero redefinir / reverter as alterações nele novamente para uma versão anterior.
Fiz uma pesquisa git log
junto com a git diff
para encontrar a revisão de que preciso, mas não tenho idéia de como retornar o arquivo ao seu estado anterior no passado.
git
version-control
git-checkout
Odeia_
fonte
fonte
--cached
verificargit diff
. linkRespostas:
Supondo que o hash do commit que você deseja é
c5f567
:A página do manual git checkout fornece mais informações.
Se você deseja reverter para o commit antes
c5f567
, acrescente~1
(onde 1 é o número de confirmações que você deseja voltar, pode ser qualquer coisa):Como uma observação lateral, sempre me senti desconfortável com esse comando, porque ele é usado para coisas comuns (alteração entre ramificações) e coisas destrutivas e incomuns (descartando alterações no diretório de trabalho).
fonte
develop
) você vai querergit checkout develop -- file/to/restore
(note o traço duplo)Você pode revisar rapidamente as alterações feitas em um arquivo usando o comando diff:
Em seguida, para reverter um arquivo específico para essa confirmação, use o comando reset:
Pode ser necessário usar a
--hard
opção se você tiver modificações locais.Um bom fluxo de trabalho para gerenciar pontos de referência é usar tags para marcar pontos na linha do tempo. Não consigo entender bem sua última frase, mas o que você pode querer é divergir um ramo de um ponto anterior no tempo. Para fazer isso, use o prático comando checkout:
Em seguida, você pode refazê-lo na sua linha principal quando estiver pronto para mesclar essas alterações:
fonte
git checkout <commit hash> <filename>
funcionou melhor para mim do quegit reset
git checkout <commit hash> <filename>
trabalhou para mim. Esta não deve ser a resposta aceita, IMHO.git reset
nao fiz.git reset
para redefinir único arquivo, você receberá um errofatal: Cannot do hard reset with paths
git reset --hard <commit hash> <filename>
. Isto irá erro com ofatal: Cannot do hard reset with paths.
que Motti Strom disse: usegit checkout <commit hash> <filename>
Você pode usar qualquer referência a um commit do git, incluindo o SHA-1, se for mais conveniente. O ponto é que o comando se parece com isso:
git checkout [commit-ref] -- [filename]
fonte
--
, e a aceita, que não?rm -- -f
(remover um arquivo chamado-f
) parece ser o exemplo canônico. Mais detalhes aquirm
comando usa getopt (3) para analisar seus argumentos.getopt
é o comando para analisar argumentos de comando. gnu.org/software/libc/manual/html_node/Getopt.htmlIsso será redefinido
foo
para HEAD. Você também pode:para uma revisão de volta, etc.
fonte
git checkout -- foo
para evitar erros sefoo
houver algo especial (como um diretório ou arquivo chamado-f
). Com o git, se você não tiver certeza, sempre prefixe todos os arquivos e diretórios com o argumento especial--
.--
não é um comando git e não é especial para o git. É um bash embutido para significar o final das opções de comando. Você pode usá-lo com muitos outros comandos bash também.--
é uma palavra especial incorporada no bash. Mas é uma convenção comum suportada por muitos analisadores de linha de comando e usada por muitas CLIs, incluindo o git.E para reverter para a última versão confirmada, que é mais frequentemente necessária, você pode usar este comando mais simples.
fonte
Eu tive o mesmo problema agora e achei a resposta mais fácil de entender (
commit-ref
é o valor SHA da alteração no log que você deseja voltar):Isso colocará a versão antiga em seu diretório de trabalho e, a partir daí, você poderá confirmar se quiser.
fonte
Se você souber quantas confirmações precisa voltar, poderá usar:
Isso pressupõe que você esteja no
master
ramo e a versão desejada seja 5 confirmada.fonte
Acho que encontrei .... em http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html
Às vezes, você só quer voltar e esquecer todas as alterações após um certo ponto, porque estão todas erradas.
Começar com:
$ git log
que mostra uma lista de confirmações recentes e seus hashes SHA1.
Em seguida, digite:
$ git reset --hard SHA1_HASH
para restaurar o estado para uma determinada confirmação e apagar todas as confirmações mais recentes do registro permanentemente.
fonte
git push --force
Isso funcionou para mim:
Em seguida, confirme a alteração:
fonte
Você precisa ter cuidado ao dizer "reversão". Se você costumava ter uma versão de um arquivo em commit $ A e, posteriormente, fez duas alterações em dois commits separados $ B e $ C (o que está vendo é a terceira iteração do arquivo) e, se você disser " Eu quero voltar ao primeiro ", você realmente quis dizer isso?
Se você deseja se livrar das alterações na segunda e na terceira iteração, é muito simples:
e então você confirma o resultado. O comando pergunta "Quero fazer check-out do arquivo do estado registrado pelo commit $ A".
Por outro lado, o que você quis dizer é livrar-se da alteração que a segunda iteração (ou seja, confirmar $ B) trouxe, mantendo o que o commit $ C fez no arquivo, você desejaria reverter $ B
Observe que quem criou a confirmação $ B pode não ter sido muito disciplinado e pode ter cometido alterações totalmente não relacionadas na mesma confirmação, e essa reversão pode tocar em outros arquivos que não sejam os que você vê alterações ofensivas, portanto, verifique o resultado cuidadosamente depois de fazer tão.
fonte
Divertidamente,
git checkout foo
não funcionará se a cópia de trabalho estiver em um diretório chamadofoo
; no entanto, ambosgit checkout HEAD foo
egit checkout ./foo
irão:fonte
git checkout -- foo
Veja como
rebase
funciona:Suponha que você tenha
Os dois primeiros comandos ... confirmar git checkout git rebase master
... confira o ramo de alterações que você deseja aplicar ao
master
ramo. Orebase
comando pega os commits de<my branch>
(que não são encontrados emmaster
) e os aplica novamente à cabeça demaster
. Em outras palavras, o pai do primeiro commit in<my branch>
não é mais um commit anterior nomaster
histórico, mas o chefe atual domaster
. Os dois comandos são os mesmos que:Pode ser mais fácil lembrar deste comando, pois os ramos "base" e "modificar" são explícitos.
. O resultado final da história é:
Os dois comandos finais ...
... faça uma mesclagem de avanço rápido para aplicar todas as
<my branch>
alteraçõesmaster
. Sem essa etapa, o commit da rebase não é adicionadomaster
. O resultado final é:master
e<my branch>
ambas as referênciasB'
. Além disso, a partir deste ponto, é seguro excluir a<my branch>
referência.fonte
A partir do git v2.23.0, existe um novo método de restauração do git , que deve assumir parte do que
git checkout
foi responsável (até a resposta aceita menciona quegit checkout
é bastante confuso). Veja os destaques das mudanças no blog do github .O comportamento padrão deste comando é restaurar o estado de uma árvore de trabalho com o conteúdo proveniente do
source
parâmetro (que no seu caso será um hash de confirmação).Portanto, com base na resposta de Greg Hewgill (assumindo que o hash de confirmação seja
c5f567
), o comando ficaria assim:Ou se você deseja restaurar o conteúdo de uma confirmação antes de c5f567:
fonte
Primeira cabeça de redefinição do arquivo de destino
Segundo check-out desse arquivo
fonte
onde
<N>
é o número de revisões do arquivo para reverter para o arquivo<filename>
.Por exemplo, para efetuar o checkout da revisão anterior imediata de um único arquivo
x/y/z.c
, executeComo a previsão do git funciona?
Adicione o seguinte ao seu
gitconfig
Basicamente, tudo o que alguém faria manualmente nessa situação,
envolvido em um lindo e eficiente git-alias - git-prevision
fonte
Eu tenho que conectar o EasyGit aqui, que é um invólucro para tornar o git mais acessível a iniciantes, sem confundir usuários experientes. Uma das coisas que faz é dar mais significados
git revert
. Nesse caso, você simplesmente diria:eg revert foo/bar foo/baz
fonte
eg revert --in REVISON -- FILENAME
. O--in
é importante. Para os usuários do Windows por aí: Abra o git bash. Executeecho %PATH
. O primeiro caminho deve estar no diretório do usuário, terminando combin
. Crie esse caminho. Armazene, por exemplo, lá. Dê um nomeeg
. Nãoeg.txt
.No caso em que você deseja reverter um arquivo para uma confirmação anterior (e o arquivo que você deseja reverter já confirmado), você pode usar
ou
Depois, prepare e submeta a versão "nova".
Armado com o conhecimento de que um commit pode ter dois pais no caso de uma mesclagem, você deve saber que HEAD ^ 1 é o primeiro pai e HEAD ~ 1 é o segundo pai.
Qualquer um funcionará se houver apenas um pai na árvore.
fonte
Muitas sugestões aqui, a maioria das linhas de
git checkout $revision -- $file
. Algumas alternativas obscuras:E também uso muito isso apenas para ver uma versão específica temporariamente:
ou
(OBS:
$file
precisa ser prefixado./
se for um caminho relativogit show $revision:$file
para o trabalho)E o ainda mais estranho:
fonte
Note, no entanto, que
git checkout ./foo
egit checkout HEAD ./foo
não são exatamente a mesma coisa; caso em questão:(O segundo
add
prepara o arquivo no índice, mas ele não é confirmado.)Git checkout ./foo
significa reverter o caminho./foo
do índice ; AdicionarHEAD
instrui o Git a reverter esse caminho no índice para suaHEAD
revisão antes de fazer isso.fonte
Para mim, nenhuma das respostas parecia muito clara e, portanto, gostaria de adicionar a minha, que parece super fácil.
Eu tenho um commit
abc1
e depois dele fiz várias (ou uma modificação) em um arquivofile.txt
.Agora diga que eu estraguei algo no arquivo
file.txt
e quero voltar para uma confirmação anteriorabc1
.1
git checkout file.txt
.: isso removerá as alterações locais, se você não precisar delas2
git checkout abc1 file.txt
.: isso trará seu arquivo para a versão desejada3
git commit -m "Restored file.txt to version abc1"
.: isso confirmará sua reversão.git push
: isso empurrará tudo no repositório remotoEntre as etapas 2 e 3, é claro que você pode fazer
git status
para entender o que está acontecendo. Normalmente você deve ver ofile.txt
já adicionado e é por isso que não há necessidade de agit add
.fonte
2.Git reverter arquivo para uma ramificação específica
fonte
Para acessar uma versão de confirmação anterior do arquivo, obtenha o número de confirmação, diga eb917a1 e
Se você só precisa voltar para a última versão confirmada
Isso simplesmente levará você ao último estado confirmado do arquivo
fonte
git checkout ref | commitHash - filePath
por exemplo
fonte
Muitas respostas aqui afirmam usar
git reset ... <file>
ou,git checkout ... <file>
ao fazer isso, você perderá todas as modificações no<file>
commit após o commit que deseja reverter.Se você quiser reverter as alterações de um commit apenas em um único arquivo, exatamente como
git revert
faria, mas apenas para um arquivo (ou digamos, um subconjunto dos arquivos de commit), sugiro usar ambosgit diff
egit apply
assim (com<sha>
= o hash do confirmar que você deseja reverter):Basicamente, ele primeiro gera um patch correspondente às alterações que você deseja reverter e, em seguida, aplica o patch novamente para eliminar essas alterações.
Obviamente, não funcionará se as linhas revertidas tiverem sido modificadas por qualquer confirmação entre
<sha1>
eHEAD
(conflito).fonte
git show -p <sha> path/to/file.ext|git apply -R
<sha>^!
vez de<sha>^ <sha>
Use
git log
para obter a chave de hash para uma versão específica e, em seguida, usegit checkout <hashkey>
Nota: Não esqueça de digitar o hash antes do último. O último hash aponta sua posição atual (HEAD) e não altera nada.
fonte
Obviamente, alguém precisa escrever um livro inteligível sobre o git ou precisa ser melhor explicado na documentação. Diante desse mesmo problema, imaginei que
iria desfazer o último commit que parece fazer.
Ian
fonte
Você pode fazer isso em 4 etapas:
O que você precisa digitar no seu terminal :
git revert <commit_hash>
git reset HEAD~1
git add <file_i_want_to_revert>
&&git commit -m 'reverting file'
git checkout .
boa sorte
fonte
git-revert
apenas opera em todo o repositório, portanto, para compensar, precisamos desfazer todo o resto.git revert --no-commit <commit_hash>
2.git reset HEAD
Isso economiza uma confirmação extra flutuando e faz todas as alterações apenas no seu diretório de trabalho.git revert _oldcommit_ --no-commit
git reset -- _unchanged1_ _unchanged2_ ...
git commit -m "branch without changes to specific files"
a nova dica de ramificação refletia todas as alterações, exceto os arquivos revertidos.Este é um passo muito simples. Arquivo de checkout para o ID de confirmação que queremos, aqui um ID de confirmação antes e, em seguida, apenas git commit commit e pronto.
Isso é muito útil. Se quisermos trazer qualquer arquivo para qualquer ID de confirmação anterior na parte superior da confirmação, podemos fazê-lo facilmente.
fonte
Irá reverter um determinado commit. Parece que você acha que
git revert
afeta apenas a confirmação mais recente.Isso não resolve o seu problema, se você deseja reverter uma alteração em um arquivo específico e essa confirmação mudou mais do que esse arquivo.
fonte
se você confirmar um arquivo errado em suas últimas confirmações, siga as instruções:
fonte