Come posso annullare l’ultimo commit in un repository git bare?

Considerando che ci sono diversi comandi git che non hanno senso in un repository spoglio (perché i repository nudi non usano gli indici e non hanno una directory di lavoro),

git reset --hard HEAD^ 

non è una soluzione per non accettare l’ultima modifica in tale repository.

Cercando su Internet, tutto ciò che ho trovato correlato all’argomento è questo , in cui mi vengono presentati tre modi per farlo:
1. “aggiorna il ref manualmente (che coinvolge l’impianto idraulico)”;
2. ” git push -f da un repository non nudo”;
3. ” git branch -f this $that “.

Quale soluzione pensi sia più appropriata o quali altri modi ci sono per farlo? Sfortunatamente, la documentazione che ho trovato su git repository è piuttosto scarsa.

Puoi usare il comando git update-ref . Per rimuovere l’ultimo commit, dovresti usare:

 $ git update-ref HEAD HEAD^ 

O se non sei nel ramo da cui non puoi rimuovere l’ultimo commit:

 $ git update-ref refs/heads/branch-name branch-name^ 

Puoi anche passare uno sha1 se vuoi:

 $ git update-ref refs/heads/branch-name a12d48e2 

Vedi la documentazione del comando git-update-ref .

Se si utilizza quanto segue in un repository nudo:

 git reset --soft  

quindi non ti imbatterai nei problemi che stai usando --hard e --mixed options in un repository nudo poiché non stai cercando di cambiare qualcosa che il repository non ha (cioè albero e indice di lavoro). Nel tuo caso in particolare vorresti usare (dal repository nudo):

 git reset --soft HEAD^ 

Per cambiare ramo sul repository remoto fai:

 git symbolic-ref HEAD refs/heads/ 

Il git push -f dovrebbe funzionare bene:
se cloni il repository nudo, rimuovi l’ultimo commit ( git reset --hard HEAD^ come dici, ma in un repository locale non nudo) e push back ( -f ):

  • non cambi SHA1 per gli altri commit precedenti a quello che rimuovi.
  • sei sicuro di respingere il contenuto esatto del repository nudo meno il commit extra (perché l’hai appena clonato per primo).

Puoi anche usare la notazione git refspec e fare qualcosa del genere:

git push -f origin +:

Questo forza l’aggiornamento del ramo di destinazione (come indicato dal ref) al commit di origine come indicato dalla parte + .