Mover ponteiro de ramificação para commit diferente sem checkout

Para mover o ponteiro de ramificação de uma ramificação retirada, pode-se usar o comando git reset --hard . Mas como mover o ponteiro de ramificação de uma ramificação sem check-out para apontar para uma confirmação diferente (mantendo todas as outras coisas como ramificação remota rastreada)?

NB Se você simplesmente quer mover um branch para outro commit, a maneira mais fácil é

git branch -f branch-name new-tip-commit

como detalhado pela resposta de Chris Johnsen .

Você pode fazer isso por referências arbitrárias. Isto é como mover um ponteiro de ramificação:

 git update-ref -m "reset: Reset  to " refs/heads/  

A forma geral:

 git update-ref -m "reset: Reset  to "   

Você pode escolher lêndeas sobre a mensagem reflog se quiser – eu acredito que a branch -f um é diferente da reset --hard um reset --hard , e isso não é exatamente nenhum deles.

 git branch -f branch-name new-tip-commit 

Você também pode passar git reset --hard uma referência de commit.

Por exemplo:

 git checkout branch-name git reset --hard new-tip-commit 

Eu acho que faço algo parecido com isso com freqüência:

Assumindo esta história

 $ git log --decorate --oneline --graph * 3daed46 (HEAD, master) New thing I shouldn't have committed to master * a0d9687 This is the commit that I actually want to be master # Backup my latest commit to a wip branch $ git branch wip_doing_stuff # Ditch that commit on this branch $ git reset --hard HEAD^ # Now my changes are in a new branch $ git log --decorate --oneline --graph * 3daed46 (wip_doing_stuff) New thing I shouldn't have committed to master * a0d9687 (HEAD, master) This is the commit that I actually want to be master 

Apenas para enriquecer a discussão, se você quiser mover a ramificação myBranch para o seu commit atual , apenas omita o segundo argumento depois de -f

Exemplo:

git branch -f myBranch


Eu geralmente faço isso quando eu rebase enquanto em um estado HEAD Detached 🙂

Em gitk --all :

  • clique com o botão direito no commit que você quer
  • -> criar novo ramo
  • insira o nome de um ramo existente
  • pressione retornar na checkbox de diálogo que confirma a substituição da antiga ramificação desse nome .

Esteja ciente de que recriar, em vez de modificar a ramificação existente , perderá informações de ramificações de rastreamento . (Geralmente, isso não é um problema para casos de uso simples em que há apenas um controle remoto e sua filial local tem o mesmo nome da ramificação correspondente no controle remoto. Consulte os comentários para obter mais detalhes, obrigado @mbdevpl por apontar essa desvantagem.)

Seria legal se o gitk tivesse um recurso onde a checkbox de diálogo tivesse 3 opções: replace, modificar existente ou cancelar.


Mesmo se você é normalmente um viciado em linha de comando como eu, git gui e gitk são muito bem projetados para o subconjunto de uso de git que eles permitem. Eu recomendo usá-los para o que eles são bons (ou seja, testar seletivamente hunks dentro / fora do índice em git gui, e também apenas cometer. (Ctrl-s para adicionar um assinado off: line, ctrl-enter para confirmar .)

gitk é ótimo para acompanhar algumas ramificações enquanto você classifica suas alterações em uma boa série de correções para enviar upstream, ou qualquer outra coisa em que precise acompanhar o que está no meio de várias ramificações.

Eu nem tenho um navegador de arquivos charts aberto, mas eu amo o gitk / git gui.

A solução recomendada git branch -f branch-pointer-to-move new-pointer no TortoiseGit :

  • “Git Show log”
  • Marque “Todos os ramos”
  • Na linha, você deseja que o ponteiro de ramificação seja movido para (novo ponteiro):
    • Clique com o botão direito, “Criar Filial nesta versão”
    • Ao lado de “Filial”, insira o nome da ramificação a ser movida (ponteiro da ramificação para mover)
    • Em “Base On”, verifique se o novo ponteiro está correto
    • Verifique “Força”
    • Está bem

insira a descrição da imagem aqui

insira a descrição da imagem aqui