2013-04-21 25 views
23

Esistono più domande su Stack Overflow che risolvono il problema della gestione temporanea e delle sole parti dei file. Tuttavia, non posso farlo funzionare.Git: commit modifiche parziali

Diciamo che vogliamo implementare una classe di matematica manichino in php (la lingua non ha importanza), con alcuni metodi di base come: add, subtract, multiply e divide.

Iniziamo con la definizione della classe:

<?php 
    class Math { 
    } 
?> 

Ora:

$ git add math.php 
$ git commit -m "Create Math class." 

Nella fase successiva attuiamo sia add e subtract quattro metodi:

<?php 
    class Math { 
     public function add($a, $b) { 
      return $a + $b; 
     } 

     public function subtract($a, $b) { 
      return $a - $b; 
     } 
    } 
?> 

Ma ora vogliamo commettere l'attuazione del add e le subtract metodi commit separati.

È possibile?

Quello che ho cercato

$ git add -p

appare quanto segue:

enter image description here

mi piacerebbe dividere il pezzo in blocchi più piccoli, in modo da premere s, e la seguente appare:

enter image description here

Sembra che Git non l'abbia diviso in pezzi più piccoli.

Proviamo ora a modificare manualmente il blocco corrente. Quindi premo: e.

mio editor di testo predefinito (sublime del testo) si apre, e qui posso modificare il pezzo:

enter image description here

provo a cancellare semplicemente la linea 8,9,10,11 - perché voglio stage solo la funzione add. risparmio, chiudere l'editor, ma git dice:

Your edited hunk does not apply. Edit again (saying "no" discards!) [y/n]?

Sono veramente nuovo per git add -p e messa in scena interattiva, quindi forse è qualcosa che ho fatto di sbagliato, o semplicemente non è possibile quello che voglio, e spero davvero che alcuni utenti git più esperti abbiano alcune istruzioni forse anche una soluzione per me.

Grazie!

+1

Stai cercando di imparare il "modo giusto" di farlo? Personalmente, non mi preoccupo di questi dettagli. Vorrei solo rimuovere una funzione, commetterlo, aggiungerlo di nuovo e commetterlo. – TheBuzzSaw

+0

Sì, questo è esattamente quello che ho fatto nel mio ultimo progetto. Forse questo è il modo più semplice. Tuttavia, mi piacerebbe farlo in git, quindi decidere quale strada scegliere. –

+0

possibile duplicato di [Conferma solo parte di un file in Git] (http://stackoverflow.com/questions/1085162/commit-only-part-of-a-file-in-git) – 7ochem

risposta

15

Stai facendo esattamente quello che ho fatto in passato, e ho persino ricreato l'intero esperimento su una macchina UNIX e ha funzionato esattamente come previsto.

Sospetto che il tuo editor stia cambiando le terminazioni di riga nel hunk diff quando salva.

+1

Sono tornato. Ho impostato tutto il mio editor per utilizzare le terminazioni di riga unix e tutto funziona come previsto. –

12

Questo non si sente come la “via git” assoluto a farlo in questo dal git ama la riga di comando, ma ecco quello che faccio:

Git viene fornito in bundle con git gui - si può iniziare eseguendo solo quel comando. Qui puoi selezionare il tuo file non modificato, segnare le linee che vuoi impegnare e fare clic su "stage lines for commit". Se si desidera che si comporti più come uno strumento da riga di comando, è possibile eseguire git gui citool, che ha l'effetto che l'interfaccia si chiuderà quando si esegue il commit.

Partial staging with git gui

Si noti che questo strumento sia correttamente integrato con git. Non hai bisogno di fare il tuo commit in questo ui. Puoi semplicemente mettere in scena le linee pertinenti, chiuderla, magari fare ancora un altro git add e poi eseguire il commit tramite la riga di comando.

In generale mi piace l'interfaccia della git command line e anche se non sono necessariamente un fan della shell, l'ho amato dopo un po '. Ho provato più GUI e li ho buttati via perché non potevano competere con l'interfaccia della riga di comando git. Ma per git add -p direi che è un compito per una GUI. Effettuare commit parziali è semplicissimo con git gui. Lo stesso vale per la navigazione nella cronologia complessa. gitk (fornito anche con git) fa un lavoro molto migliore di quello git log --graph -p (a patto che tu abbia davvero bisogno di capire l'albero e non lo sappia ora sullo stato della storia).

Nota: Ma sembra che tu stia ancora facendo tutto bene - ho provato quello che hai fatto e devo essere d'accordo con Ben Jackson. Questo dovrebbe sicuramente funzionare. Il tuo editore deve incasinare qualcosa.

Nota finale: Sembra che si stia utilizzando la riga di comando git con il terminale standard di Windows cmd. Consiglio vivamente di passare a mintty. Scarica la versione di msys, inseriscila nella tua directory Program Files\Git\bin ed eseguila (crea una scorciatoia) con mintty -. Questo ti darà la stessa shell, ma con tutto meglio (in particolare un migliore ridimensionamento e copiatura & incolla).

+0

'git add -p' è un modo tradizionale git. L'ho sempre usato e non ho mai avuto problemi. Potrebbe essere solo l'editor che non sembra aggiungere le terminazioni di linea corrette che git si aspetta. A proposito di usare 'git gui' su Windows dovresti usare cygwin o msys. – Tuxdude

+0

So che 'git add -p' funziona e dovrebbe funzionare per quello che l'OP sta cercando di ottenere. Il mio punto è che è più facile mettere in scena parti di un file quando è possibile scorrerlo correttamente e mettere in scena le singole linee senza dover passare a un editor. E se usi git su Windows, è sempre con cygwin o msys - git non può essere eseguito in modo nativo su Windows a causa dei suoi script di shell. – Chronial

+0

Grazie per il tuo commento dettagliato. Ho anche provato git gui, ma è apparso lo stesso errore. Il finale della linea era la chiave della soluzione, come Ben Jackson e tu hai sottolineato. Ora anche git gui funziona come previsto. –