2011-01-07 23 views
78

Prendendo in considerazione che ci sono diversi comandi Git che non hanno senso in un repository nudo (perché repository nudi non utilizzare gli indici e non hanno una directory di lavoro),Come posso annullare l'ultimo commit in un repository git bare?

git reset --hard HEAD^ 

non è una soluzione per uncommit l'ultima modifica in tale repository.

Ricerca attraverso Internet, tutto quello che poteva trovare correlato al tema è this, in cui mi sono presentato tre modi per farlo:
1. "aggiornamento manualmente l'arbitro (che coinvolge 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.

+7

@ Lavinia-Garbriela Dobrovol Non utilizzare le cose complicate di seguito. Stai provando a spostare HEAD a un commit diverso e questo è il motivo per cui git reset è previsto, anche in un repository completo. Per la mia risposta seguente, utilizzare: git reset --soft Con --soft, non si prova a modificare un albero di lavoro e un indice inesistente, quindi git consente di eseguire il reset senza problemi. – Hazok

risposta

107

È possibile utilizzare il comando git update-ref. Per rimuovere l'ultimo commit, si può usare:

$ git update-ref HEAD HEAD^ 

Oppure, se non sei nel ramo da cui si smusso per rimuovere l'ultimo commit:

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

Si potrebbe anche passare uno SHA1 se si vuole:

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

Vedi la documentazione del comando git-update-ref.

+0

Qual è l'HEAD sul repository nudo non è sul ramo destro? – VonC

+0

@ Lavinia-Gabriela Dobrovolschi: giusto, non avevo familiarità con l'esatta sintassi. – VonC

+0

@VonC È possibile specificare in 'git update-ref ' per essere il ramo corretto, ad esempio "refs/heads/master" invece di HEAD, ad esempio. Spero di non aver frainteso la tua domanda. –

7

Il git push -f dovrebbe funzionare bene:
se si clona che nuda pronti contro termine, rimuovere l'ultimo commit (git reset --hard HEAD^ come si parla, ma in un repo non nuda locale) e spingere indietro (-f):

  • non si modifica alcun SHA1 per gli altri commit precedenti quello rimosso.
  • sei sicuro di respingere il contenuto esatto del repository nudo meno il commit extra (perché l'hai appena clonato).
+0

@ VonC Ciao Von, ho visto molte risposte su Git, quindi volevo chiederti ... ero curioso, perché non dovevo 'git resettare --soft ' come mostrato nella mia risposta qui sotto è la pratica raccomandata per spostare HEAD su un repository nudo? – Hazok

+0

Suppongo che un'altra ragione che chiedo è che l'utilizzo di soft reset per i reposli nudi non sia un'informazione immediatamente disponibile e che molti forum sembrino avere soluzioni inutilmente complesse quando sembra che il reimpostazione software sia la soluzione migliore a causa della minore quantità di digitazione e meno possibilità di errore. – Hazok

+1

@Zach: un 'reset --soft' dovrebbe funzionare quando fatto direttamente su un repository nudo. Ho il sospetto che questo sia raramente fatto perché un repository nudo è generalmente un ** repo upstream ** (cioè un repository a cui si stanno spingendo i dati), e il più delle volte, * non * ha un accesso locale diretto ad esso . Ma se lo fai, allora questo è sicuramente un altro buon esempio di utilizzo di "reset --soft'" (come in http://stackoverflow.com/questions/5203535/practical-uses-of-git-reset-soft) Quindi +1 alla tua risposta. – VonC

25

Se si utilizza il seguente in un repo nuda:

git reset --soft <commit> 

allora non incorrere in problemi che avete con --hard e --mixed opzioni in un repo a nudo dal momento che non si sta cercando di cambiare qualcosa il repository nudo non ha (cioè albero e indice di lavoro).Nel tuo caso specifico si desidera utilizzare (dalla repo nudo):

git reset --soft HEAD^ 

Per switch branches on the remote repo fare:

git symbolic-ref HEAD refs/heads/<branch_name> 
+2

Come si seleziona il ramo che si desidera spostare? Il tuo esempio funziona bene su master ma 'git checkout other_branch' non funziona in modo semplice. – Gauthier

+1

Hmmm ... Mi chiedo chi mi ha votato su questo. La domanda non ha chiesto come cambiare ramo su un repository remoto, ha chiesto come reimpostare su un repository nudo. Per cambiare il ramo predefinito in un repository remoto, utilizzare git symbol-ref HEAD ref/heads/. – Hazok

2

È inoltre possibile utilizzare git refspec notazione e fare qualcosa del genere:

git push -f origin +<commit you want to revert to>:<destination_head | branch_name>

Questo impone l'aggiornamento del ramo di destinazione (come indicato dal riferimento) al commit di origine come indicato dallo +<object ref> parte.

+2

tranne quando c'è un acl sul ramo - che di solito è il caso se si "ha bisogno di farlo sul repository nudo stesso" ... –

Problemi correlati