Como redefinir 'mestre' para 'origem / mestre'?

216

Posso fazer o seguinte de uma maneira mais simples?

git checkout origin/master
git branch -D master
git branch master
git checkout master
Xiè Jìléi
fonte
Às vezes, isso pode ser feito sem tocar na árvore de trabalho: stackoverflow.com/a/12343727/586086
Andrew Mao
6
Atualize sua resposta aceita: @ A resposta do KindDragon é mais correta e mais curta.
Robert Siemer

Respostas:

310

Como a resposta do KindDragon menciona, você pode recriar diretamente em :masterorigin/master

git checkout -B master origin/master

A git checkoutpágina do manual menciona:

Se -Bfor dado, <new_branch>é criado se não existir; caso contrário, é redefinido . Este é o equivalente transacional de

$ git branch -f <branch> [<start point>]
$ git checkout <branch>

Originalmente sugerido:

Algo como:

$ git checkout master

# remember where the master was referencing to
$ git branch previous_master

# Reset master back to origin/master
$ git reset --hard origin/master

com o passo 2 sendo opcional.

VonC
fonte
11
Você pode fazer isso com uma linha.
Robert Siemer
94

O Git suporta este comando:

git checkout -B master origin/master

Confira o origin/masterramo e redefina o masterramo lá.

KindDragon
fonte
4
A única resposta verdadeira.
Robert Siemer
3
salve quatro pressionamentos de tecla - você não precisa das aspas. Just: git checkout -B origem master / mestre
zumalifeguard
digamos que cometi 2 coisas, a primeira é uma mesclagem com branch e a segunda é regular. O que acontece com a mesclagem se eu voltar à origem / mestre?
Utdev 22/12
11
você não precisa git fetch origin masterantes para ter certeza de que origin/masterestá atualizado?
31817 pedrozath
Sim, claro com todas as soluções que você deve fazer git fetchprimeiro
KindDragon
29

Eu acho que até a resposta do VonC tem complexidade em comparação com esta opção:

git update-ref refs/heads/master origin/master
git reset --hard master

O git registra automaticamente todos os valores de uma ref (através do reflog). Portanto, depois de executar esse comando, master@{1}refere-se ao valor anterior de master.

A resposta do VonC está correta, mas desperdiça tempo de checkout do valor antigo de master no sistema de arquivos.

Se você se importa com objetos órfãos no repositório, pode executar git gc

Alexander Bird
fonte
11
Parece uma alternativa interessante. +1
VonC 19/03/2013
Eu ainda receboAlready on 'master'
yourfriendzak
@yourfriendzak, esqueci-me de levar em consideração que você já deve ter feito o check-out do mestre antes de atualizar o master. Atualizei a resposta para que ela funcione também nesse caso.
22613 Alexander Bird
Isso funciona mesmo se você não estiver no mestre (como um estado HEAD desanexado que está realmente apontando para a origem / mestre da dica). Em seguida, você pode fazer o checkout do mestre sem precisar percorrer os arquivos antigos no repositório. Ótimo!
Andrew Mao
20

Se você já masterestiver conectado, faça o seguinte:

git reset --hard origin/master

Ele apontará a masterramificação local para o controle remoto origin/mastere descartará quaisquer modificações no diretório de trabalho.

Fuad Saud
fonte
E irá excluir arquivos! Se você criou / editou arquivos e executou um "git add" neles, este comando os excluirá. Esteja avisado.
Cheeso
Essa abordagem é melhor do que git checkout -B master origin/master?
Jim Aho