Substituindo minha filial local por filial remota

153

Fubilei completamente minha filial local e gostaria de começar de novo. A versão no servidor está correta.

Não quero recomeçar, gostaria de usar minha história local para consertar minha enorme confusão. (Eu posso, se for preciso.)

git fetch branchnamee git pull branchnamenão funciona. A mensagem que recebo está " atualizada ", no entanto, minha versão local não corresponde à do servidor.

git pull origin/branchnamedá-me um erro " não encontrado ".

Sara Chipps
fonte

Respostas:

248

primeiro, crie uma nova ramificação na posição atual (caso você precise do seu histórico antigo 'estragado'):

git branch fubar-pin

atualize sua lista de ramificações remotas e sincronize novas confirmações:

git fetch --all

redefina sua ramificação para o ponto em que a origem / ramificação aponta para:

git reset --hard origin/branch

tenha cuidado , isso removerá quaisquer alterações da sua árvore de trabalho !

knittl
fonte
2
+1 mas você pode querer adicionar um lembrete para fazer git fetch originantes da reinicialização
Mark Longair
Eu fiz isso com uma pequena alteração e não funcionou: git fetch --all, git reset --hard SHA1OFANOLDCOMMIT, (algumas outras coisas), git reset --hard origin / branch. O resultado final foi que eu ainda estava no antigo commit. Portanto, essa abordagem pode funcionar em alguns casos, mas acho que não funciona em todos.
greggles
@greggles: Algum erro? Após o último comando, HEAD deve apontar para a origem / ramificação.
knittl
1
@ Gavin: não, isso nunca irá afetar outros ramos que não origin/branch. Nunca.
knittl
1
@greggles Eu sei que isso é muito tarde, mas para outras pessoas se perguntando por que isso pode acontecer, essa abordagem só funcionará se você tiver uma ramificação verificada. Não funcionou para você porque você estava no estado HEAD desanexado (HEAD aponta para uma consolidação, não para uma ramificação) e esses comandos só funcionam se HEAD estiver apontando para uma ramificação. Quando você faz git resetenquanto o HEAD está apontando para um ramo, esse ramo será seguido.
Michael Dorst
60

O que faço quando atrapalha minha ramificação local é apenas renomear minha ramificação quebrada e verificar / ramificar novamente a ramificação upstream:

git branch -m branch branch-old
git fetch remote
git checkout -b branch remote/branch

Então, se tiver certeza de que não deseja nada do seu ramo antigo, remova-o:

git branch -D branch-old

Mas geralmente deixo o ramo antigo localmente, para o caso de haver algo lá.

Casey Marshall
fonte
4
Esta parece ser a melhor resposta. Isso ajuda a criar uma cópia de backup por precaução e parece muito provável que a ramificação local seja uma cópia exata da remota.
greggles
Ótima resposta, útil para mim. Um P: A documentação oficial do git-checkout parece dizer que seu terceiro comando deve ser: git checkout -b <branch> --track <remote>/<branch>o seu funciona igualmente bem, sem o --track?
12137 Starman
1
Eu acho que a configuração var branch.autoSetupMerge(que eu acho padrão) torna o --trackimplícito. E, sim, em todas as minhas configurações de git eu não preciso explicitamente --trackao fazer um checkout -b, mas YMMV.
Casey Marshall
5

Sua filial local provavelmente tem modificações que você deseja descartar. Para fazer isso, você precisará git resetredefinir a cabeça da ramificação para o último ponto em que você divergiu da ramificação do repositório upstream. Use git branch -vpara encontrar o ID sha1 da ramificação upstream e redefina sua ramificação usando-a git reset SHA1ID. Em seguida, você poderá fazer um git checkoutpara descartar as alterações deixadas em seu diretório.

Nota: sempre faça isso em um repositório de backup. Dessa forma, você pode garantir que você mesmo funcionou corretamente. Ou, se não, você tem um backup para reverter.

Wes Hardaker
fonte
Parece que provavelmente funcionaria, mas, dada a simplicidade e a confiabilidade da abordagem de "faça uma cópia do seu trabalho em outro lugar, faça uma nova cópia da ramificação remota", não vejo como isso é melhor.
greggles
2
git reset --hard

Isso é para reverter todas as alterações locais no cabeçalho de origem

Karthikeyan Varadarajan
fonte