Esiste un modo per eliminare gli commit locali in Mercurial?


209

Quindi continuo a fare uno sciocco errore in Mercurial. Spesso, inizierò a lavorare senza fare "hg pull" e un "hg update". Quando provo a inviare le mie modifiche, viene visualizzato un errore.

Esiste un modo per eliminare i miei commit locali in modo da evitare di creare più teste, filiali, ecc.? Voglio solo eliminare i miei commit locali, unire le mie modifiche con il suggerimento e quindi ripetere il commit. Sembra semplice, vero? Non riesco a trovare un modo per eliminare facilmente i commit locali in modo da poter fondermi in modo pulito con la punta.

Ancora una volta, sto solo cercando di eliminare i commit locali effettuati con "hg ci". Non voglio modificare file, ripristinare, ecc.



12
Non è un errore sciocco, è normale flusso di lavoro quando più persone lavorano contemporaneamente con lo stesso repository.
Juozas Kontvainis,

Risposte:


247

Abilitare l' estensione " strip " e digitare quanto segue:

hg strip #changeset# --keep

Dov'è #changeset#l'hash per il changeset che vuoi rimuovere. Questo rimuoverà il detto changeset compresi i changeset che discendono da esso e lascerà intatta la tua directory di lavoro . Se si desidera ripristinare anche le modifiche al codice impegnato, rimuovere il--keep opzione.

Per ulteriori informazioni, controllare l' estensione della striscia .

Se ricevi "comando sconosciuto" strip "potrebbe essere necessario abilitarlo. Per fare ciò, trova il file .hgrco Mercurial.inie aggiungi quanto segue:

[extensions]
strip =

Nota che (come menzionato da Juozas nel suo commento) avere più teste è un normale flusso di lavoro in Mercurial. Non dovresti usare il comando strip per combatterlo. Invece, dovresti unire la testa con la testa in arrivo, risolvere eventuali conflitti, testare e quindi spingere.

Il stripcomando è utile quando vuoi davvero sbarazzarti dei changeset che inquinano il ramo. In effetti, se ti trovi nella situazione di questa domanda e desideri rimuovere definitivamente tutti i set di modifiche "bozza" , controlla la risposta migliore , che in sostanza suggerisce di fare:

hg strip 'roots(outgoing())'

8
@Bharath: devi abilitare l'estensione
Samaursa,

1
Da mercurial 2.8, strip è un'estensione standalone, quindi strip = va bene. WhatsNew per Mercurial 2.8
Chih-Hsuan Yen,

104

Se stai usando Hg Tortoise basta attivare l'estensione " strip " in:

  1. File / Impostazioni / Extensions /
  2. Seleziona la striscia

Quindi selezionare la revisione in basso da dove si desidera iniziare lo striping, facendo right clicksu di essa e selezionando:

  1. Modifica la cronologia
  2. Striscia

Proprio come questo:

inserisci qui la descrizione dell'immagine

In questo esempio cancellerà dalla diciannovesima revisione all'ultima commessa (22).


2
File/Settings/Extensions/Vorrei poter aggiungere più voti. Grazie mille!
dyatchenko,

Argh! Ho provato questo, ma sembrava aver scaricato tutte le mie modifiche nonostante non fosse spuntato "nessun backup" o "scarta modifiche locali". Volevo mantenere quei cambiamenti, ma non impegnarli! C'è un modo per recuperarli ora ??
Tim Tisdall,

2
Non riesco a trovare un modo per farlo correttamente, ma sembra mantenere il contenuto che devi passare --keepe TortoiseHg non offre questa opzione. Quindi ... devi farlo dalla riga di comando con hg strip -r . --keep.
Tim Tisdall,

3
from strip help: "Tutti i changeset rimossi vengono archiviati in" .hg / strip-backup "come bundle (consultare" hg help bundle "e" hg help unbundle "). Possono essere ripristinati eseguendo "hg unbundle .hg / strip-backup / BUNDLE", dove BUNDLE è il file bundle creato dalla striscia. "
Tim Tisdall,

Anche nel SourceTree è stato utile. Grazie!
Ponomarenko Oleh,

22

Risposta moderna (rilevante solo dopo Mercurial 2.1):

Utilizzare le fasi e contrassegnare le revisioni che non si desidera condividere come segrete (private). In questo modo quando spingi non verranno inviati.

In TortoiseHG puoi fare clic con il tasto destro su un commit per cambiarne la fase.

Inoltre: è anche possibile utilizzare l'estensione "rebase" per spostare i commit locali in testa al repository condiviso dopo averlo estratto.


Privato == segreto ora
Dmitry Osinovskiy

15

Come tutti gli altri sottolineano, probabilmente dovresti semplicemente tirare e unire le teste, ma se vuoi davvero sbarazzarti dei tuoi commit senza nessuno degli strumenti di EditingHistory , puoi solo il hg clone -rtuo repository per ottenere tutti tranne quei cambiamenti.

Questo non li elimina dal repository originale, ma crea un nuovo clone che non li ha. Quindi è possibile eliminare il repository modificato (se lo si desidera).


"Hg clone -r" elimina le modifiche locali? Voglio solo eliminare gli commit locali per semplificare le cose.
user191535,

4
Non li elimina dal repository clonato, ma crea un nuovo clone che non li ha. Quindi puoi eliminare il repository che hai modificato, se lo desideri.
Ry4an Brase,

9

Mi sono imbattuto anche in questo problema. Ho fatto 2 commite volevo ripristinare ed eliminare entrambi i commit.

$ hg rollback

Ma hg rollbackesegue il rollback dell'ultimo commit, non dei 2 commit. A quel tempo non me ne sono reso conto e ho cambiato il codice.

Quando ho scoperto di hg rollbackaver appena eseguito il rollback di un commit, ho scoperto di poterlo utilizzare hg strip #changeset#. Quindi, trovavo hg log -l 10gli ultimi 10 commit e ottenevo i cambiamenti giusti che volevo strip.

$ hg log -l 10
changeset:   2499:81a7a8f7a5cd
branch:      component_engine
tag:         tip
user:        myname<myname@email.com>
date:        Fri Aug 14 12:22:02 2015 +0800
summary:     get runs from sandbox

changeset:   2498:9e3e1de76127
branch:      component_engine
user:        other_user_name<name@email.com>
date:        Mon Aug 03 09:50:18 2015 +0800
summary:     Set current destination to a copy incoming exchange

......

$ hg strip 2499
abort: local changes found

Cosa abort: local changes foundsignifica? Significa che sono state hgtrovate modifiche al codice che non sono state ancora impegnate. Quindi, per risolvere questo problema, dovresti hg diffsalvare il codice che hai modificato e hg reverte hg strip #changeset#. Proprio come questo:

$ hg diff > /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff
$ hg revert file_you_have_changed
$ hg strip #changeset#

Dopo aver fatto quanto sopra, è possibile patchil file diff e il codice può essere aggiunto al progetto.

$ patch -p1 < /PATH/TO/SAVE/YOUR/DIFF/FILE/my.diff

9

Puoi aggirare questo problema ancora più facilmente con l' estensione Rebase , basta usare hg pull --rebasee i tuoi commit vengono automaticamente riconnessi alla revisione pull, evitando il problema delle ramificazioni.


1
A scapito di avere una storia imprecisa e una possibile corruzione se si fanno cose sbagliate.
Ry4an Brase,

5

Se hai familiarità con Git, sarai felice di usare Histedit che funziona come git rebase -i.


4

hg stripè quello che stai cercando. È analogo git resetse hai familiarità con Git.

Usa console:

  1. Devi conoscere il numero di revisione. hg log -l 10. Questo comando mostra gli ultimi 10 commit. Trova il commit che stai cercando. È necessario un numero di 4 cifre dalla riga del changesetchangeset: 5888:ba6205914681

  2. Poi hg strip -r 5888 --keep. Ciò rimuove il record del commit ma mantiene tutti i file modificati e quindi è possibile raccomandarli. (se si desidera eliminare i file per rimuovere solo --keephg strip -r 5888


1

[Hg Tortoise 4.6.1] Se si tratta di un'azione recente, è possibile utilizzare l'azione "Ripristina / Annulla" (Ctrl + U).

Immagine di tartaruga HG


Ricontrolla l'inclusione di un'immagine.
Bill Keller,

0

Oltre alla risposta eccellente di Samaursa, puoi utilizzare l' evolveestensione prunecome una versione sicura e recuperabile stripche ti permetterà di tornare indietro nel caso in cui tu faccia qualcosa di sbagliato.

Ho questi alias sul mio .hgrc:

 # Prunes all draft changesets on the current repository
 reset-tree = prune -r "outgoing() and not obsolete()"
 # *STRIPS* all draft changesets on current repository. This deletes history.
 force-reset-tree = strip 'roots(outgoing())'

Si noti che prunedeve anche --keep, allo stesso modo strip, mantenere intatta la directory di lavoro che consente di consigliare nuovamente i file.

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.