Eu tenho dois ramos:
- filial local (aquela com quem trabalho)
- filial remota (pública, apenas confirmações bem testadas vão para lá)
Recentemente, eu estraguei seriamente minha filial local.
Como eu substituiria totalmente a filial local pela remota, para poder continuar meu trabalho de onde a filial remota está agora?
Eu já procurei no SO e fazer check-out localmente na filial remota não tem nenhum efeito.
Respostas:
Supondo que o mestre seja o ramo local que você está substituindo e que "origem / mestre" seja o ramo remoto para o qual você deseja redefinir:
Isso atualiza sua ramificação HEAD local para ter a mesma revisão que origem / mestre e
--hard
sincronizará essa alteração também no índice e na área de trabalho.fonte
git reset
por padrão, irá apontar novamente sua ramificação atual e sincronizar o índice.--soft
pulará a atualização do índice,--hard
também sincronizará o espaço de trabalho. A minha própria experiência está usando--hard
a maior parte do tempo, exceto quando eu quiser desfazer cometer o último (que é apenasgit reset HEAD^
)git fetch origin remote_branch
master
, portanto, verifique o ramo que você está substituindo primeiro.Isso é tão fácil quanto três etapas:
git branch -d local_branch
git fetch origin remote_branch
git checkout -b local_branch origin/remote_branch
fonte
git branch -D local_branch
na primeira etapa se sua ramificação não for mesclada.fonte
git help branch
diz--track
.When creating a new branch, set up branch.<name>.remote and branch.<name>.merge configuration entries to mark the start-point branch as "upstream" from the new branch. This configuration will tell git to show the relationship between the two branches in git status and git branch -v. Furthermore, it directs git pull without arguments to pull from the upstream when the new branch is checked out.
Corrigi este comando na resposta. Obrigado por levantar o ponto.git status
, ele informará se o seu ramo local está à frente ou atrás do ramo remoto, se você os tiver associado. Além disso, você pode fazergit pull
(oupush
) em vez de completo,git pull <remote> <branch>
se você já configurou sua filial para rastrear<remote/branch>
.Substitua tudo pelo ramo remoto; mas apenas a partir do mesmo commit sua filial local está ativada:
OU , obtenha as últimas da filial remota e substitua tudo:
Como um aparte, se necessário, você pode eliminar arquivos e diretórios não rastreados que ainda não foram confirmados:
fonte
git clean
comando fez isso por mim.git reset hard origin/master
não limpe os arquivos não rastreados. Obrigado!A maneira mais segura e completa de substituir a filial local atual pelo controle remoto:
A
stash
linha salva as alterações que você não confirmou. Abranch
linha move sua ramificação para um nome diferente, liberando o nome original. Afetch
linha recupera a cópia mais recente do controle remoto. ocheckout
linha recria a ramificação original como uma ramificação de rastreamento.Ou como uma função bash:
que renomeia a ramificação atual para algo como replace_master_98d258f.
fonte
git stash pop
nesse fluxo de trabalho. Se você deseja reaplicar seus arquivos escondidos.Estou meio surpreso que ninguém tenha mencionado isso ainda; Eu uso quase todos os dias:
Basicamente,
@{u}
é apenas uma abreviação para o ramo upstream que seu ramo atual está rastreando. Por exemplo, isso normalmente equivale aorigin/[my-current-branch-name]
. É legal porque é independente de ramo.Certifique-se de
git fetch
primeiro obter a cópia mais recente da filial remota.fonte
Isso pode ser feito de várias maneiras, continuando a editar essa resposta para espalhar uma melhor perspectiva de conhecimento.
1) Redefinir com força
Se você estiver trabalhando a partir da ramificação de desenvolvimento remoto, poderá redefinir HEAD para a última confirmação na ramificação remota, conforme abaixo:
2) Exclua a ramificação atual e faça o checkout novamente no repositório remoto
Considerando que você está trabalhando no ramo de desenvolvimento no repositório local, que é sincronizado com o ramo remoto / de desenvolvimento, você pode fazer o seguinte:
3) Interromper mesclagem
Se você estiver no meio de uma mesclagem incorreta (feita erroneamente com ramificação incorreta) e quiser evitar a mesclagem, volte para a ramificação mais recente, como abaixo:
4) Abortar rebase
Se você estiver entre uma nova recuperação incorreta, poderá anular a solicitação de nova recuperação, conforme abaixo:
fonte
Você pode fazer o que o @Hugo da @Laurent disse, ou pode usar
git rebase
para excluir os commits que deseja se livrar, se souber quais. Eu costumo usargit rebase -i head~N
(onde N é um número, permitindo que você manipule os últimos N commit) para esse tipo de operações.fonte
A resposta selecionada está absolutamente correta , no entanto, não me deixou com as últimas commit / pushes ...
Então para mim:
Como sei que quero definir temporariamente minha ramificação upstream por algumas semanas para uma ramificação específica (a mesma que mudei / fiz check-out anteriormente e fiz uma redefinição definitiva)
Então, depois de redefinir
fonte
Se você deseja atualizar o ramo que não está atualmente com check-out, você pode:
fonte
Conforme fornecido na explicação escolhida, o git reset é bom. Hoje em dia, porém, geralmente usamos submódulos: repositórios dentro de repositórios. Por exemplo, se você usa o ZF3 e o jQuery em seu projeto, provavelmente deseja que eles sejam clonados em seus repositórios originais. Nesse caso, o git reset não é suficiente. Precisamos atualizar os submódulos para a versão exata definida em nosso repositório:
é o mesmo que você virá (cd) recursivamente para o diretório de trabalho de cada submódulo e será executado:
E é muito diferente de
porque os submódulos apontam não para ramificação, mas para a confirmação.
Nesse caso, quando você faz check-out manualmente de uma ramificação para 1 ou mais submódulos, pode executar
fonte
git reset --hard
. Isso agrega pouco valor.Isso funcionou para mim - o clean também mostrou todos os arquivos excluídos. Se ele indicar que você perderá alterações, precisará ocultar.
fonte
A maneira mais feia, porém mais simples: exclua sua pasta local e clone o repositório remoto novamente.
fonte