Git: descartar todas as alterações em um branch local divergente

117

Tenho uma filial de tópico local que está rastreando uma filial remota. Para fins de argumentação, diga que os históricos de commits são assim:

A--B--C--O1--O2--O3 (origin/phobos)
       \
         L1--L2--L3 (phobos)

Tendo olhado os históricos de commit relativos, agora eu quero descartar todas as mudanças no phobosbranch local e voltar a ser uma cópia direta de origin/phobos, para que o histórico local se pareça com isto:

A--B--C--O1--O2--O3 (phobos origin/phobos)

Eu realmente não quero as mudanças locais para o phobosbranch, e eu realmente não quero que nenhuma fusão apareça no repositório de origem depois. (Então, apenas fundir não é o que tenho em mente.)

Parece que deveria ser muito fácil, mas meu google-fu me falhou. Como eu faço isso?

Electrons_Ahoy
fonte

Respostas:

79

Exclua o branch e recrie-o:

$ git branch -D phobos
$ git checkout --track -b phobos origin/phobos
mipadi
fonte
37
Um problema com essa abordagem, em comparação com a redefinição da cabeça do galho, é que excluir o galho sopra o reflog do galho. Reinicializar o branch, por outro lado, não apenas preserva o reflog, mas realmente registra o reset no reflog. Isso torna a operação facilmente reversível posteriormente, se necessário.
Dan Molding
9
@Electrons_Ahoy Sugiro que você altere a resposta aceita aqui para a de Dan (para que pessoas como eu, que pesquisaram no Google como fazer isso, provavelmente escolham o método mais seguro).
Steve Chambers
4
A resposta de @DanMoulding não envolve a exclusão de uma filial local quando é desnecessário. É muito mais seguro.
brma
@brma: Como assim? Ele ainda está apenas apontando um branch para um novo commit.
mipadi de
5
A resposta de Dan Moulding é mais segura. Acho que você deve selecionar esse.
Daniel Apt de
330
git checkout phobos
git reset --hard origin/phobos

Isso diz ao Git para redefinir o cabeçalho de phobospara o mesmo commit que origin/phobos, e para atualizar a árvore de trabalho para corresponder.

Dan Molding
fonte
35
IMO esta deve ser a resposta aceita; emite o comando "reset" para transplantar o ponteiro do ramo, em vez de realizar cirurgia com remoção / recriação.
vdboor
Na verdade, tentei este primeiro e gerou uma tonelada de erros, tornando a cópia local quase inutilizável. Excluir / recriar pode ter sido menos elegante, mas não precisei fazer nenhuma pergunta complementar.
Electrons_Ahoy
3
@Electrons_Ahoy: Hmm, isso definitivamente não é normal. Fazer essa reinicialização normalmente deve ser uma operação sem problemas se o seu repo estiver em boas condições de funcionamento.
Dan Molding
ou mesmo se for suspeito. Use git reflog para encontrar o caminho de casa se você "acidentalmente" emitiu este comando sem realmente ler o que ele faz. :)
dbn
Também funciona se você estiver no ramo e bagunçar localmente.
Slott