Levando em consideração que existem vários comandos git que não fazem sentido em um repositório vazio (porque repositórios simples não usam índices e não têm um diretório de trabalho),
git reset --hard HEAD^
não é uma solução para descomprimir a última alteração em tal repositório.
Pesquisando na Internet, tudo que pude encontrar relacionado ao tema é o seguinte , no qual me são apresentadas três maneiras de fazer isso:
1. "atualizar o ref manualmente (que envolve encanamento)";
2. " git push -f
de um repositório não vazio";
3. " git branch -f this $that
".
Qual solução você acha mais apropriada ou de que outras maneiras existem para fazer isso? Infelizmente, a documentação que encontrei sobre repositórios básicos do git é bastante pobre.
Respostas:
Você pode usar o
git update-ref
comando. Para remover o último commit, você usaria:Ou se você não estiver no branch do qual não pode remover o último commit:
Você também pode passar um sha1 se quiser:
Veja a documentação do comando git-update-ref .
fonte
git update-ref <ref> <newvalue>
para ser o branch certo, como "refs / heads / master" ao invés de HEAD, por exemplo. Espero não ter entendido mal sua pergunta.branch-name
argumento. Ao usarupdate-ref
com um “branch”, você absolutamente deve especificar o nome de referência completo do branch (ou seja, prefixarrefs/heads/
ao nome abreviado do branch normal). Se você usar apenas o nome abreviado, acabará criando / atualizando em$GIT_DIR/branch-name
vez de$GIT_DIR/refs/heads/branch-name
. A existência de ambosbranch-name
erefs/heads/branch-name
causará avisos “refname… é ambíguo”.Se você usar o seguinte em um repositório básico:
então, você não encontrará os problemas que tem ao usar
--hard
e--mixed
opções em um repositório básico, pois não está tentando alterar algo que o repositório básico não tem (ou seja, árvore e índice de trabalho). No seu caso, especificamente, você gostaria de usar (do repositório básico):Para alternar branches no repo remoto, faça:
Para ver o uso do ramo atualmente selecionado:
https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html
fonte
git checkout other_branch
não funciona totalmente.A
git push -f
deve funcionar bem:se você clonar que repo nua, remova cometer o passado (
git reset --hard HEAD^
como você menciona, mas em um repo não-nua local) e empurrar para trás (-f
):fonte
git reset --soft <sha1>
conforme mostrado na minha resposta abaixo, não seria a prática recomendada para mover o HEAD em um repositório simples?reset --soft
deve funcionar quando feito diretamente em um repositório vazio . Suspeito que isso raramente seja feito porque um repositório simples é geralmente um repo upstream (ou seja, um repo para o qual você está enviando dados) e, na maioria das vezes, você não tem acesso local direto a ele. Mas se você fizer isso, então este é certamente outro bom exemplo dereset --soft
uso " " (como em stackoverflow.com/questions/5203535/… ) Então, +1 para sua resposta.Você também pode usar a notação git refspec e fazer algo assim:
git push -f origin +<commit you want to revert to>:<destination_head | branch_name>
Isso força a atualização do branch de destino (como denotado pela ref) para o commit de origem conforme denotado pela
+<object ref>
parte.fonte