Quando apporto le modifiche a un file in Git, come posso impegnare solo alcune delle modifiche?
Ad esempio, come posso impegnare solo 15 righe su 30 righe che sono state modificate in un file?
Quando apporto le modifiche a un file in Git, come posso impegnare solo alcune delle modifiche?
Ad esempio, come posso impegnare solo 15 righe su 30 righe che sono state modificate in un file?
Puoi usare git add --patch <filename>
(o -p
in breve), e git inizierà a scomporre il file in ciò che pensa siano "hunk" sensati (parti del file). Ti verrà quindi richiesto con questa domanda:
Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?
Ecco una descrizione di ciascuna opzione:
Se il file non è ancora nel repository, puoi prima farlo git add -N <filename>
. In seguito puoi andare avanti git add -p <filename>
.
Successivamente, puoi usare:
git diff --staged
per verificare di aver messo in scena le modifiche corrette
git reset -p
per staccare gli hunk aggiunti per errore
git commit -v
per visualizzare il tuo commit mentre modifichi il messaggio di commit.
Nota questo è molto diverso dal git format-patch
comando, che ha lo scopo di analizzare i dati di commit in a .patch
File.
Riferimento per il futuro: https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging
Puoi usare git add --interactive
o git add -p <file>
, e poi git commit
(non git commit -a
); vedere Modalità interattiva in git-add manpage, o semplicemente seguire le istruzioni.
Git moderno ha anche git commit --interactive
(e git commit --patch
, che è il collegamento all'opzione di patch nel commit interattivo).
Se preferisci farlo dalla GUI, puoi usare git-gui. Puoi semplicemente contrassegnare i blocchi che desideri includere nel commit. Io personalmente lo trovo più facile dell'uso git add -i
. Anche altre GUI git, come QGit o GitX, potrebbero avere questa funzionalità.
git gui fornisce questa funzionalità sotto la visualizzazione diff. Basta fare clic con il tasto destro del mouse sulla / e linea / e a cui sei interessato e dovresti vedere una voce di menu "stage this line to commit".
credo che git add -e myfile
è il modo più semplice (almeno la mia preferenza) poiché apre semplicemente un editor di testo e ti consente di scegliere quale linea vuoi mettere in scena e quale linea non hai.
Per quanto riguarda i comandi di modifica:
contenuto aggiunto:
Il contenuto aggiunto è rappresentato da linee che iniziano con "+". È possibile impedire la messa in scena di eventuali linee di aggiunta eliminandole.
contenuto rimosso:
Il contenuto rimosso è rappresentato da linee che iniziano con "-". Puoi impedire la messa in scena della loro rimozione convertendo "-" in "" (spazio).
contenuto modificato:
Il contenuto modificato è rappresentato da linee "-" (rimozione del vecchio contenuto) seguito da linee "+" (aggiunta del contenuto sostitutivo). Puoi impedire la staging della modifica convertendo "-" linee in "" e rimuovendo "+" Linee. Attenzione che modificare solo la metà della coppia è probabile che introduca cambiamenti confusi all'indice.
Ogni dettaglio su git add
sono disponibili su git --help add
Se stai usando vim, potresti provare l'ottimo plugin chiamato fuggitivo.
È possibile vedere il diff di un file tra copia di lavoro e indice con :Gdiff
e quindi aggiungere linee o hunk all'indice usando i comandi classici di vim come dp
. Salva le modifiche nell'indice e esegui il commit con :Gcommit
, e hai finito.
Screencast introduttivi molto buoni Qui (vedi esp. parte 2).
Consiglio vivamente di usare SourceTree da Atlassian. (È gratuito). Rende questo banale. È possibile mettere in scena singoli pezzi di codice o singole righe di codice in modo rapido e semplice.
Vale la pena notare che da usare git add --patch
per un nuovo file è necessario prima aggiungere il file da indicizzare con git add --intent-to-add
:
git add -N file
git add -p file
Quando ho molte modifiche e finirò per creare alcuni commit dalle modifiche, quindi voglio salvare temporaneamente il mio punto di partenza prima di mettere in scena le cose.
Come questo:
$ git stash -u
Saved working directory and index state WIP on master: 47a1413 ...
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 1st commit"
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 2nd commit"
$ git stash pop
La risposta di Whymarrh è ciò che faccio di solito, tranne che a volte ci sono molti cambiamenti e posso dire che potrei commettere un errore mentre sto organizzando delle cose, e voglio uno stato impegnato su cui posso ricorrere per un secondo passaggio.
Se dovessi usare emacs, dai un'occhiata magit, che fornisce un'interfaccia git per emacs. Supporta staging hunk (parti di file) abbastanza bene.