Para mover o ponteiro de uma ramificação com check-out, pode-se usar o git reset --hard
comando Mas como mover o ponteiro de ramificação de uma ramificação não registrada para apontar para uma confirmação diferente (mantendo todas as outras coisas, como ramificação remota rastreada)?
git
git-branch
Mot
fonte
fonte
git branch <branch-name> <SHA-1-of-the-commit>
e despejar o ramo antigo?Respostas:
Você pode fazer isso por referências arbitrárias. Isto é como mover um ponteiro de ramificação:
A forma geral:
Você pode escolher lêndeas sobre a mensagem de reflog, se quiser - acredito que
branch -f
uma é diferente dareset --hard
outra, e essa não é exatamente uma delas.fonte
git branch -f
. Para ser mais específico, este método parece ser: (A) mais difícil de funcionamento (B) mais difíceis de lembrar, e (C) mais perigosofonte
git update-ref -m "reset: Reset <branch> to <new commit>" <branch> <commit>
,. (Você pode escolher lêndeas sobre a mensagem reflog se você gosta - Eu acredito que obranch -f
um é diferente doreset --hard
um, e isso não é exatamente qualquer um deles.)git help branch
diz "-f, --force Redefine <branchname> para <startpoint> se <branchname> já existe. Sem -f, o ramo git se recusa a alterar um ramo existente."git branch -f master <hash>
e está me dizendofatal: Cannot force update the current branch.
Ummmm eu tenho que fazer o que agora, confira algum outro ramo aleatório antes que eu possa usar este comando?HEAD
aponta para ele).Você também pode passar
git reset --hard
uma referência de confirmação.Por exemplo:
Descobri que faço algo parecido com isso com frequência:
Assumindo essa história
fonte
git update-ref
que foi discutido acima.git reset --hard ...
Não há necessidade de repeti-lo aqui! :-(Apenas para enriquecer a discussão, se você deseja mover o
myBranch
branch para o commit atual , omita o segundo argumento após-f
Exemplo:
git branch -f myBranch
Geralmente faço isso quando estou
rebase
no estado HEAD destacado :)fonte
Em
gitk --all
:Cuidado ao recriar, em vez de modificar a filial existente , perderá as informações da filial de rastreamento . (Isso geralmente não é um problema para casos de uso simples em que há apenas um controle remoto e sua filial local tem o mesmo nome que a filial correspondente no controle remoto. Veja os comentários para obter mais detalhes, obrigado @mbdevpl por apontar esta desvantagem.)
Seria legal se
gitk
houvesse um recurso em que a caixa de diálogo tivesse três opções: substituir, modificar existente ou cancelar.Mesmo se você normalmente é um viciado em linha de comando como eu
git gui
egitk
é muito bem projetado para o subconjunto de uso de git que eles permitem. Eu recomendo usá-los para o que eles são bons (por exemplo, preparar seletivamente pedaços para dentro / fora do índice no git gui e também apenas confirmar. (Ctrl-s para adicionar uma assinatura: line, ctrl-enter para confirmar .)gitk
é ótimo para acompanhar algumas ramificações enquanto você organiza suas alterações em uma boa série de patches para enviar a montante, ou qualquer outra coisa em que você precise acompanhar o que está no meio com várias ramificações.Eu nem tenho um navegador de arquivos gráfico aberto, mas eu amo o gitk / git gui.
fonte
git status
saída é afetada. Além disso, em alguns casos,git fetch
egit push
não vai funcionar sem especificar remoto explicitamente se você não definir o ramo de rastreamento. Não conheço todos os casos, mas para mim a regra geral é que, por conveniência e rapidez do trabalho, é melhor ter as filiais de rastreamento em ordem.A solução recomendada
git branch -f branch-pointer-to-move new-pointer
no TortoiseGit :fonte
Honestamente, estou surpreso como ninguém pensou sobre o
git push
comando:O ponto (.) Refere-se ao repositório local e você pode precisar da opção -f porque o destino pode estar "por trás de sua contraparte remota" .
Embora este comando seja usado para salvar suas alterações no servidor, o resultado é exatamente o mesmo que mover a ramificação remota (
<branch>
) para o mesmo commit que a ramificação local (<destination>
)fonte
-f
evitar atropelar nada local; por exemplo,git fetch origin && git push . origin/develop:develop
é uma versão rápida e sem falhas de check-out -git checkout develop && git pull --ff-only
Abra o arquivo
.git/refs/heads/<your_branch_name>
e altere o hash armazenado lá para o local em que deseja mover o cabeçalho do seu ramo. Basta editar e salvar o arquivo com qualquer editor de texto. Apenas certifique-se de que o ramo a modificar não seja o ativo atual.Isenção de responsabilidade: provavelmente não é uma maneira aconselhável de fazer isso, mas faz o trabalho.
fonte
No caso em que a confirmação que você deseja apontar estiver à frente da ramificação atual (que deve ser o caso, a menos que você queira desfazer as últimas confirmações da ramificação atual), você pode simplesmente:
fonte
git push . <commit>:<branch>
que já foi sugerido.