Por que o Git permite enviar para uma ramificação com check-out em uma árvore de trabalho adicionada? Como vou me recuperar?
O Git normalmente se recusa a enviar para o ramo (único) atualmente com check-out de um grupo normal, não--bare
repositório:
$ git push upstream master
Counting objects: 1, done.
Writing objects: 100% (1/1), 188 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because ...
Esse é o comportamento correto. VejoGit push error '[remoto rejeitado] master -> master (o ramo está atualmente com check-out)'.
No entanto, nesse mesmo upstream, tenho uma árvore de trabalho adicionada com uma ramificação diferente em check-out. Pouco antes da demonstração de erro acima, executei:
$ git push upstream pytest
econseguiu, quando claramente não deveria ter, pela mesma razãomaster
falha aqui. Em particular,receive.denyCurrentBranch
está realmente definido para negar ramificações atuais.
Nesse sistema a montante,git worktree list
diz:
$ git worktree list
<path1> 9febb4c [master]
<path2> 406bef8 [pytest]
o que mostra que pelo menosparte do Git sabe que está com check-out. Mas, então, permitiu o envio de qualquer maneira, o que leva a duas perguntas:
Isso é um inseto?
Agora que estou nessa bagunça, como posso me recuperar?
(Nota: eu acidentalmente tropecei sobre isso enquanto usava árvores de trabalho secundárias, então estou gravando para posteridade. Portanto, postarei minha própria resposta.)