Como descartar todas as alterações feitas em um ramo?


116

Estou trabalhando em um branch (ou seja design) e fiz uma série de alterações, mas preciso descartar todas e redefini-lo para corresponder à versão do repositório. Pensei git checkout designem fazer isso, mas só me diz que já estou no branch designe que tenho 3 arquivos modificados.

Como descartaria essas alterações e obteria a ramificação como está agora no servidor remoto?

Respostas:


207

Nota: Você NÃO PODE DESFAZER isso.

Tente git checkout -fisto irá descartar quaisquer alterações locais que não foram confirmadas em TODOS os branches e master.


86

git reset --hard pode ajudá-lo se você quiser jogar fora tudo desde seu último commit


6
ougit reset --hard HEAD^
deadfish

27
git reset --hard HEAD^realmente deveria ser a resposta aceita. OP não estava perguntando sobre outros ramos ...
vphilipnyc

2
Eu tentei isso e acho que excluiu tudo desde meu último push, não apenas meu último commit.
Chase Roberts

3
Eu tentei git reset --hard HEAD ^ e ainda deixou um monte de arquivos não rastreados. Agora, no Google, como removê-los em um comando simples.
John Deighan,

20
git diff master > branch.diff
git apply --reverse branch.diff

Essas etapas podem ser muito úteis, se seu objetivo for definir o estado de um branch específico para ser igual ao do branch master. Para fazer isso, execute-o de dentro do branch específico e, em seguida, exclua o arquivo .diff [nome do branch] quando terminar de usargit rm [branch name].diff
karolus

18

Se você não deseja nenhuma alteração designe definitivamente deseja que corresponda apenas a um branch remoto, você também pode simplesmente excluir o branch e recriá-lo:

# Switch to some branch other than design
$ git br -D design
$ git co -b design origin/design            # Will set up design to track origin's design branch

7
também: git checkout design; git reset --hard origin / design
Dan de

Eu também comprometeria antes de excluir o branch
Asarluhi

Se você tem commits no branch local que não estão no remoto, esta é uma receita para entrar em situações realmente confusas na minha opinião. Eu definitivamente não usaria essa solução.
erewok

1
@erewok: Bem, a pergunta diz especificamente que quem fez a pergunta deseja descartar todas as alterações.
mipadi

E eu não acho que essa resposta alcance isso.
erewok

7

@Will, git immersion é um tutorial git muito bom e simples. ele mostrará como desfazer alterações para os seguintes casos: unstaged, staged e commited. laboratórios 14-18


2
Eu só gostaria de dizer que agora fiz imersão em git .. mais de um ano depois. OI! Eu deveria ter feito isso muito antes ...
Será

1
Isso precisa Rubyser instalado ... o que nem sempre parece uma escolha
Vishnu

5

Quando você quiser descartar mudanças em seu branch local, você pode esconder essas mudanças usando o comando git stash.

git stash save "some_name"

Suas alterações serão salvas e você pode recuperá-las mais tarde, se quiser, ou pode excluí-las. Depois de fazer isso, seu branch não terá nenhum código não confirmado e você pode puxar o código mais recente de seu branch principal usando git pull.


4

Na raiz de origem: git reset ./ HEAD <--un-stage any staged changes git checkout ./ <--discard any unstaged changes


0

Método REVERSÍVEL para descartar todas as alterações:

Eu encontrei essa questão depois de fazer uma fusão e esquecer de desenvolver o checkout imediatamente depois. Você adivinhou: comecei a modificar alguns arquivos diretamente no master . D'Oh! Como minha situação dificilmente é única (todos nós já fizemos isso, não fizemos; ->), vou oferecer uma maneira reversível que usei para descartar todas as alterações para obter o master parecendo se desenvolver novamente.

Depois de fazer um git diffpara ver quais arquivos foram modificados e avaliar o escopo do meu erro, executei:

git stash
git stash clear

Depois de armazenar todas as alterações, elas foram limpas em seguida. Todas as alterações feitas nos arquivos com erro no mestre foram eliminadas e a paridade foi restaurada.

Digamos que agora eu queira restaurar essas alterações. Eu posso fazer isso. O primeiro passo é encontrar o hash do stash que acabei de limpar / largar:

git fsck --no-reflog | awk '/dangling commit/ {print $3}'

Depois de aprender o hash, restaurei com sucesso as alterações não confirmadas com:

git stash apply hash-of-cleared-stash

Eu realmente não queria restaurar essas alterações, só queria validar se poderia recuperá-las, então as apaguei novamente.

Outra opção é aplicar o stash a um branch diferente , em vez de limpar as alterações. Portanto, em termos de limpar as alterações feitas ao trabalhar no branch errado, stashvocê tem bastante flexibilidade para se recuperar de seu problema.

De qualquer forma, se você deseja um meio reversível de limpar as alterações em um branch, o anterior é um modo menos perigoso neste caso de uso.


-1

git checkout -f

Isso é suficiente para sua pergunta. A única coisa que é, uma vez feito, está feito. Não há como desfazer.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.