2010-02-25 4 views
23

Ho un file sorgente in cui sono state aggiunte 2 funzionalità. Per consentire il cherry-picking, mi piacerebbe confermarlo in 2 fasi: una per ciascuna caratteristica. Fino ad ora, in situazioni simili, l'utilizzo di git add -p mi ha servito bene, per il commit di una funzione lasciando i file locali nella fase finale.Come modificare Git "aggiungi patch" hunks/diffs/lines durante la stadiazione selettiva?

Tuttavia, ora ho il problema che git add -p vuole mettere in scena un pezzo che include le modifiche per entrambe le funzioni. Anche se le modifiche sono su righe separate, s (per "split") non vuole più suddividere il blocco in parti più piccole ...

In breve: non riesco a separare le modifiche per le 2 funzioni in questo modo . C'è un modo per modificare manualmente la patch, ad esempio utilizzando vi, senza effettivamente modificare il file originale?

+1

Parte del mio problema è che probabilmente non viene in mente i termini giusti, per cercare in Google. – bart

+0

Puoi trovare istruzioni dettagliate su come modificare manualmente le patch in [git add ufficiale gs: EDITING PATCHES] (https://www.kernel.org/pub/software/scm/git/docs/git-add.html#_editing_patches) . –

risposta

24

Come dice Alan, modificare la patch premendo e (anziché s) durante git add -p. Questo lancerà il tuo editor con quel pezzo della patch in modo che tu possa modificarlo manualmente. Ci sono commenti all'interno del testo che spiegano come scartare correttamente le modifiche ed è in realtà piuttosto semplice.

Quando hai finito, si noti che è possibile testare con solo le modifiche che hai appena aggiunto facendo git stash --keep-index. Le modifiche non hanno aggiunto all'indice sarà messo da parte e si sono ora liberi di testare solo i cambiamenti che si stanno per commettere. Al termine, semplicemente git stash pop o git stash apply per ripristinare le altre modifiche.

+0

Grazie per le utili informazioni extra ... – bart

+0

Se ti ritrovi a fare 'git stash --keep-index' spesso,' git stash -k' farà lo stesso, e ti farà risparmiare tempo. – Ryan

5

È possibile modificare la patch premendo e durante una git add -p. Non influenzerà il file originale.

+0

git risponde con 'Huh (e)?'. Forse la mia versione è un po 'vecchia? (Anche se l'ho avuto solo per 2 settimane ed è la porta ufficiale per CentOS ...) Correzione – bart

+0

, fase errata di 'git add -i'. Al prompt di cosa fare con il pezzo, git semplicemente ignora la mia "e". – bart

+0

"e" non fa nulla. git --version dice 1.5.5.6. È troppo vecchio? – bart

6

Come altre persone hanno detto, è possibile utilizzare e per modificare il pezzo che si desidera dividere.

Per aggiungere solo una parte del pezzo, è possibile eliminare le linee dal cambiamento che vuoi dividere fuori.

+Line 1 
+Line 2 
+Line 3 

Diciamo che si desidera mantenere la Linea 1 e la Linea 3 in un commit e la Linea 2 in un altro. Tutto quello che dovete fare è eliminare Linea 2:

+Line 1 
+Line 3 

Questo metterà Linea 1 e Linea 3 nella vostra area di sosta. La linea 2 sarà ancora indicizzata ma non in scena.

0

Di solito ottengo conflitti di unione dal numero git stash pop descritto nella risposta di @ Dan. Vedere git stash and edited hunks per una soluzione che eviti i conflitti.

1

Ci sono Git GUI che ti permetteranno di selezionare le singole linee che vuoi mettere in scena, permettendoti di dividere le linee che normalmente non saresti in grado di usare il normale git add --patch dalla riga di comando.

Due di tali interfacce grafiche sono:

  1. SourceTree.
  2. Git Cola.