O git descarta todas as alterações e extrai do upstream

145

Como obtenho um repositório upstream e o substituo pelo master? Eu só tenho uma ramificação no meu repositório, que é mestre, e eu estraguei tudo, então basicamente preciso começar de novo a partir do montante. Eu acho que o init fará o trabalho, mas existe uma maneira mais fácil?

NinjaCowgirl
fonte

Respostas:

251

Há (pelo menos) duas coisas que você pode fazer aqui - você pode reclinar o repositório remoto ou pode reset --hard o ancestral comum e, em seguida, um pull, que avançará rapidamente para o commit mais recente no mestre remoto.

Para ser concreto, aqui está uma extensão simples da resposta original de Nevik Rehnel:

git reset --hard origin/master
git pull origin master

OBSERVAÇÃO : o uso git reset --harddescartará quaisquer alterações não confirmadas e pode ser fácil confundir-se com esse comando, se você é novo no git, portanto, tenha uma noção do que ele fará antes de prosseguir.

Eric Walker
fonte
1
Mais ajuda para os novatos por aí: git gclimpa e passa por algumas tarefas domésticas. Em outra nota, eu nunca corri git gc. É bom executar, mas não é necessário.
Joshua Dance
@ JoshuaDance - bom ponto. Não sei por que o incluí originalmente.
Eric Walker
23

enquanto estiver no mestre da filial: git reset --hard origin/master

então faça uma limpeza com git gc (mais sobre isso nas páginas do manual)

Atualização: Você provavelmente também precisará fazer um git fetch origin(ou git fetch origin masterse desejar apenas esse ramo); não importa se você fizer isso antes ou depois da redefinição. (Obrigado @ eric-walker)

Nevik Rehnel
fonte
1
Você pode precisar fazer um puxão após o reset --hard.
Eric Walker
A retirada do mestre não é necessária quando a origem da busca do git é executada antes da redefinição.
sciritai
@sciritai: meu comentário foi adicionado antes da menção de buscar na origem.
Eric Walker
19

Você pode fazer isso em um único comando:

git fetch --all && git reset --hard origin/master

Ou em um par de comandos:

git fetch --all
git reset --hard origin/master

Observe que você perderá TODAS as alterações locais

Luca C.
fonte
5
git reset <hash>  # you need to know the last good hash, so you can remove all your local commits

git fetch upstream
git checkout master
git merge upstream/master
git push origin master -f

Agora, seu garfo está de volta ao mesmo montante.

resultados
fonte
0

Finalmente percebi agora que, em vez de git fetch --all && git reset --hard origin/master, deveria ser git fetch --all && git reset --hard origin/<branch_name>(se alguém trabalha em um ramo diferente)

BitFreak
fonte