2011-09-14 8 views
6

Ho un changeset che è uncommitted. Ho notato che attualmente sono nella parte sbagliata, quindi prima di commetterlo, vorrei passare al ramo che intendevo fare, quindi eseguire il commit.Hg quasi commesso nel ramo errato

Quanto è difficile da ottenere in Hg?

+0

credo Mercurial è molto simile a Git. Quindi credo che tu abbia due opzioni. Salvare manualmente tutti i file aggiunti e modificati, cambiare rami e copiarli sopra il file system.O commetti i cambiamenti nel ramo corrente, passa al ramo che volevi davvero e fai un merging in esso dal ramo precedente. –

risposta

5

Se v'è un percorso lineare tra la revisione padre corrente e la revisione di destinazione, allora si può solo emettere

hg update right-branch 

e Mercurial unire le modifiche nella copia di lavoro nella revisione di destinazione.

Questa operazione viene eseguita utilizzando il macchinario completo di merge in modo che vengano presi in considerazione i nomi, e in caso di conflitti si otterrà un programma di unione a tre vie. Gli approcci shelve- e diff-based mancano di questo e si richiede di risolvere i conflitti a mano con .rej file. È anche possibile vedere lo stato di unione corrente con hg resolve --list e riunire nuovamente i file selezionati poiché Mercurial effettua i backup necessari per te.

Se non c'è un percorso lineare, si ottiene questo avvertimento:

abort: crosses branches (merge branches or use --clean to discard changes) 

È quindi possibile ottenere ciò che si vuole in primo luogo l'aggiornamento di nuovo ad un antenato comune, e quindi l'aggiornamento di nuovo in avanti. Non sono sicuro al 100% del motivo per cui emettiamo questo avviso, ma la ricerca negli archivi della mailing list dovrebbe darti la risposta se sei curioso.

2

Se stai usando TortoiseHg, è molto facile da raggiungere con la capacità ripiano di THG (http://tortoisehg.bitbucket.io/manual/2.9/shelve.html). Nella finestra di dialogo di commit, fai semplicemente clic sul pulsante Shelve (la cui icona è un file con una Z sovrapposta) e poi sulla doppia freccia destra per accantonare tutte le modifiche. Chiudi la finestra di dialogo degli shelve, aggiorna al changeset corretto, apri la finestra di dialogo shelve e fai clic sulla doppia freccia sinistra per eliminarli.

Se non si utilizza THG, è possibile installare l'estensione hgshelve (https://www.mercurial-scm.org/wiki/ShelveExtension), ma non ho familiarità con esso.

Sembra che si possa ottenere lo stesso risultato anche con Mercurial Queues (http://mercurial.808500.n3.nabble.com/Shelve-extension-td802439.html).

3

Se vuoi fare questo senza l'estensione accantonare, effettuare le seguenti operazioni:

hg diff --git > ../work_in_progress.patch 
hg up desired-branch 
hg import --no-commit ../work_in_progress.patch 

Dove ../work_in_progress.patch può essere qualsiasi percorso che si desidera (I solito memorizzare le mie patch appena sopra il mio repository) e desired-branch è il ramo in cui vuoi effettivamente applicare le modifiche.

Nota che qualsiasi soluzione che ho trovato comincia a cadere a pezzi se il ramo si è acceso e il ramo che si vuole sono abbastanza diverso che il cerotto non si applica senza intoppi. In tal caso, si inizia a dover risolvere manualmente i conflitti.

Problemi correlati