2013-01-31 18 views
9

Sono presenti modifiche nell'area di gestione temporanea e altre non ancora in fase di installazione (alcuni file hanno modifiche sia all'interno che all'esterno dell'area di gestione temporanea). Vorrei invertire il contenuto dell'area di staging e le modifiche che non sono in scena. Esiste una scorciatoia per fare ciò, senza fare azioni più complesse come il commit delle diramazioni locali, diff o stash [ecc.]? Grazie.Area di gestione temporanea di Git Inverti

+8

possibile duplicato di [? Qual è la strada più breve per scambiare messo in scena e cambiamenti unstaged a git] (http://stackoverflow.com/questions/3573410/what-is- the-shortest-way-to-swap-staged-and-nonstaged-changes-in-git) –

+0

Wow, grazie per il link. Non gli stessi termini di ricerca, ma lo stesso problema, in effetti. – moala

risposta

0

Questo è quello che uso per risolvere questo problema.

Primo git reset che rimuoverà tutti i file da 'gestione temporanea' a 'file non organizzati per il commit'. I file che si trovano in entrambi 'messa in scena' e 'file non messo in scena per commettere' manterrà le modifiche più recenti che sono attualmente nel vostro 'non i file messo in scena per commettere'

poi

git add /path/to/file i file specifici necessari da aggiungere alla messa in scena

non esattamente una scorciatoia, ma ottiene il lavoro fatto

Inversamente, Dopo aver git reset, si potrebbe git checkout /path/to/file per i file che sono attualmente 'non messo in scena per commettere' che si don' t voglio aggiungere alla messa in scena. Questo consente di eliminare i file specifici da 'non messo in scena a commettere'

quindi eseguire git add . che aggiungerà tutti i file in 'non messo in scena per impegnarsi' a 'messa in scena' - a seconda di quale è più facile per la vostra situazione

+0

In realtà, preferirei proprio non farlo a mano, perché il limite tra staging e nonstage è piuttosto complesso: anche all'interno di alcuni file, alcune linee sono in scena e altre non in scena. – moala

+0

Ti sembra la mia recente modifica riguardante i file sia in scena che non in scena? –

+0

Cosa intendi con "potresti dare un'occhiata ai file che non vuoi [...]"? è abbastanza oscuro per me ... – moala

3

C'è probabilmente più di un modo per fare questo, ma penso che vorrei prendere questo approccio - non c'è attualmente alcun collegamento pre-costruito per questo, ma si potrebbe abbastanza facilmente scrivere il proprio script per seguire questo processo:

  1. generare un patch per le cose che sono attualmente nel tuo wo voro directory ma non nell'indice ancora (cose che non hanno fatto git add per)

    git diff-files -p > /tmp/unstaged.patch 
    
  2. generare una patch per quello che hai già aggiunto l'indice contro il vostro attuale HEAD

    git diff-index --cached -p HEAD > /tmp/staged.patch 
    
  3. Cambia la tua indice e directory di lavoro al vostro HEAD

    git reset --hard HEAD 
    
  4. a pply il cerotto non è stato classificato sia la directory di lavoro e l'indice, con conseguente tali modifiche stata organizzata

    git apply --index /tmp/unstaged.patch 
    
  5. Applicare il cerotto messo in scena contro solo la vostra directory di lavoro

    git apply /tmp/staged.patch 
    

seconda della esatta La natura delle tue modifiche, i passaggi 4 e/o 5 possono causare alcuni conflitti di unione che devi risolvere manualmente, ma non sono sicuro che ci sia un modo pulito per evitare completamente questa possibilità.

Si potrebbe forse usare git stash per raggiungere i punti 1 e 4, invece dei comandi di cui sopra, ma non sono sicuro che sarebbe davvero si guadagna nulla ...

Inoltre, si consiglia di rivedere le pagine di manuale per la git diff-* e git apply per prima cosa per vedere se ci sono altre opzioni che potrebbero avere senso da usare.

4

Ecco come lo faccio:

  1. commettere l'indice a un temporaneo commettere
  2. commettere il resto ad una temporanea secondaria commettere
  3. Passa l'ordine delle impegna con rebase interattivo
  4. misto resettare
  5. soft reset

Può essere digitato manualmente piuttosto veloce, soprattutto se si utilizza Vim per commettere i messaggi:

git commit -m tmp1 
git add . # optionally with `git add -u` if there are deletions 
git commit -m tmp2 
git rebase -i HEAD~2 # swap the order of the commits; `ddp:wq` in vi 
git reset HEAD~1 
git reset HEAD~1 --soft 
+0

Mi piace, ad eccezione della modifica manuale per scambiare i commit. http://stackoverflow.com/questions/16203562/programmatically-swap-last-two-commits –

+0

Buon punto. Ma il problema per me personalmente è che non lo faccio abbastanza per scrivere uno script di scelta rapida e ricordare come si chiama e come funziona. Riorganizzazione interattiva Faccio quasi ogni giorno ed è estremamente intuitivo ed efficiente per me. – gtd

3

in base alla risposta del GTD e la capacità di scrittura invertendo i commette questo è quello che sto usando ora:

[alias]                                                    
    swaplast = !git tag _invert && git reset --hard HEAD~2 && git cherry-pick _invert _invert~1 && git tag -d _invert                        
    invertindex = !git commit -m tmp1 && git add -A && git commit -m tmp2 && git swaplast && git reset HEAD~1 && git reset HEAD~1 --soft 

pubblicato sul mio blog qui: http://blog.ericwoodruff.me/2013/12/inverting-git-index.html

+2

Ho fatto alcune indagini e test e questa è la mia documentazione non autorizzata: 'swaplast 'scambia l'ultimo e l'ultimo dell'ultimo commit. Attenzione: elimina le modifiche non inviate senza preavviso. 'invertindex' scambia le modifiche in fasi e non modificate, inclusi i file non tracciati. – Melebius

+0

Se per qualche ragione questo fallisce, potrebbe essere necessario eseguire 'git cherry-pick --abort' prima di poter eseguire nuovamente' git invertindex'. – u01jmg3

Problemi correlati