Come eliminare i commit locali in Git?


277

Stavo lavorando a qualcosa e ho deciso che era completamente rovinato ... dopo averne commesso un po '. Quindi ho provato la seguente sequenza:

git reset --hard
git rebase origin
git fetch
git pull
git checkout

A quel punto ho ricevuto il messaggio

Your branch is ahead of 'origin/master' by 2 commits.

Voglio eliminare i miei commit locali , senza dover cancellare la mia directory locale e scaricare di nuovo tutto. Come posso farlo?


6
Non è necessario eseguire entrambe le operazioni git fetche git pull- pull è una combinazione di fetch e merge.
Ether

12
Nota per gli utenti: il problema principale di questa domanda non ha nulla a che fare con il messaggio "Il tuo ramo è davanti a 'origine / master' di N commit." . Per favore, smetti di chiudere altre domande come duplicati di questa a causa di quel messaggio.

Risposte:


617
git reset --hard origin/master

rimuoverà tutti i commit non in origin/masterdove originè il nome del repo ed masterè il nome del ramo.


1
Ho pensato che la sintassi "origine / master", con una barra, si riferisse a un repository locale?
Daniel C. Sobral

9
mipadi: messo più correttamente, reimposterà il ramo corrente in modo che punti allo stesso commit di origin / master.
Christoffer Hammarström

Si riferisce a un ramo. origin/masterè un ramo che tiene traccia del masterramo del originrepository remoto.
mipadi

@ DanielC.Sobral No, origin/masterè un riferimento al masterramo del telecomando chiamato origin.
Matteo

1
@littletiger git non tiene traccia delle cartelle, solo dei file e dei relativi percorsi. Pertanto, ignorerà completamente le cartelle vuote (cartelle senza file o solo file ignorati). Non si presentano da nessuna parte perché non c'è nulla da inserire in loro.
Mumbleskates

34

Per inciso, a parte la risposta di mipadi (che dovrebbe funzionare tra l'altro), dovresti sapere che facendo:

git branch -D master
git checkout master

fa anche esattamente quello che vuoi senza having to redownload everything(la tua citazione è parafrasata). Questo perché il tuo repository locale contiene una copia del repository remoto (e quella copia non è la stessa della tua directory locale, non è nemmeno la stessa del tuo ramo estratto).

Cancellare un ramo è perfettamente sicuro e ricostruire quel ramo è molto veloce e non comporta traffico di rete. Ricorda, git è principalmente un repo locale in base alla progettazione. Anche le filiali remote hanno una copia sul locale. C'è solo un po 'di metadati che dicono a git che una specifica copia locale è in realtà un ramo remoto. In git, tutti i file sono sempre sul disco rigido.

Se non hai rami diversi dal master, dovresti:

git checkout -b 'temp'
git branch -D master
git checkout master
git branch -D temp

4
Ma in che modo questo distingue i commit fatti localmente dai commit fatti all'origine? In effetti, mi dice cheCannot delete the branch 'master' which you are currently on.
Daniel C. Sobral

1. Fondamentalmente tutti i commit sono gli stessi, indipendentemente dal fatto che siano effettuati localmente o all'origine. L'importante è che le cronologie siano sincronizzate correttamente. Il tuo commit locale esisterà solo all'origine dopo che li hai spinti e per impostazione predefinita git rifiuterà il push se la cronologia all'origine potrebbe finire in uno stato che non ha senso.
Slebetman

3
2. Ovviamente non è possibile eliminare il ramo attualmente estratto. Per eliminare il master, controlla prima un altro ramo. Se non c'è nessun altro ramo creane uno temporaneo:git checkout -b temp;git branch -D master;git checkout master;git branch -D temp
slebetman

Nota anche quello che ho detto sulla tua copia locale del repository remoto che è diversa: git non ti permetterà di modificare o anche visualizzare i file nella tua copia del ramo remoto. Ti consentirà solo di creare un altro ramo dal ramo remoto che puoi quindi visualizzare e modificare. Per convenzione, questo ramo locale ha lo stesso nome del ramo remoto. Hai parzialmente ragione in quanto origin/masterè sulla tua macchina locale. Questa è la tua copia locale (completa) del ramo remoto. Il vero ramo remoto è origin master.
Slebetman

Questo ha funzionato per me. Forse il git branch -D masternon era necessario però, poiché come sottolineato genera un errore.
Alexis Wilke

17

Quello che faccio è provare a resettare con forza su HEAD. Questo cancellerà tutti i commit locali:

git reset --hard HEAD^

Questa è la risposta migliore, che ha funzionato davvero. Eliminati tutti i commit locali e reimpostato su HEAD. Qual è l'uso di ^ char?
karim

@karim il '^' è probabilmente roba regex, che probabilmente è qualcosa di abbastanza profondo che non so o ho letto molto tempo fa nel file manuale .. scusatemi :)
giang nguyen

1
In ritardo, ma ^rappresenta il commit genitore, quindi la reimpostazione per HEAD^ignorare le modifiche non salvate e sposta il ramo al commit precedente, "cancellando" effettivamente il commit più recente (sebbene il commit esista ancora, il ramo semplicemente non punta ad esso). La risposta avrà solo un commit locale e il resto sono modifiche non confermate. @karim @giang
QuantumQuaver

3

Hai bisogno di correre

git fetch

Per ottenere tutte le modifiche e quindi non riceverai il messaggio con "il tuo ramo è avanti".


5
Il recupero non ha nulla a che fare con il problema principale del richiedente, ovvero l'eliminazione dei commit locali.

1
cosa succede se ho già eseguito il commit dei file in locale e poi provo a lanciare il comando menzionato. Mostrerà lo stesso messaggio di errore. Ho provato anche git fetch e git fetch -p. ma mostra lo stesso errore
Morez

1

Ho visto casi in cui il telecomando non era più sincronizzato e doveva essere aggiornato. Se un reset --hardo un branch -Dnon funziona, prova

git pull origin
git reset --hard 

questo non risponde alla domanda, reset --hardfunziona in questa situazione
CharlesB

1
Ciao Charles, hai ragione che reset --harddovrebbe funzionare qui. Tuttavia, sto semplicemente sottolineando che occasionalmente non riesce a ripristinare correttamente il ramo e git pull originrisincronizzerà il telecomando e consentirà il reset --hardcorretto funzionamento.
Jim Clouse

0

Ho dovuto fare un:

git checkout -b master

come ha detto git che non esiste, perché è stato cancellato con il

git -D master
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.