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?

Vai
fonte

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.

ismail
fonte
86

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

gor
fonte
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
Mike Kaganski
fonte
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
mipadi
fonte
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

Cesar A. Rivas
fonte
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.

user4948761
fonte
4

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

Clifford Harms
fonte
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.

F1Linux
fonte
-1

git checkout -f

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

a estrela
fonte