Domanda Impegna solo una parte di un file in Git


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?


2237
2017-07-06 02:25


origine


risposte:


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:

  • y mettere in scena questo pezzo per il prossimo impegno
  • n non mettere in scena questo pezzo per il prossimo commit
  • q smettere; non mettere in scena questo pezzo o uno qualsiasi dei pezzi restanti
  • un metti in scena questo pezzo e tutti i pezzi più tardi nel file
  • d non mettere in scena questo hunk o uno dei pezzi successivi nel file
  • g seleziona un membro per andare a
  • / cerca un hunk che corrisponda alla regex fornita
  • j lascia questo pezzo indeciso, guarda il prossimo pezzo indeciso
  • J lascia questo pezzo indeciso, guarda il prossimo pezzo
  • K lascia questo pezzo indeciso, vedi il precedente pezzo indeciso
  • K lascia questo pezzo indeciso, guarda il pezzo precedente
  • S dividi il pezzo attuale in hunk più piccoli
  • e modificare manualmente il pezzo corrente
  • ? stampare aiuto per i fusti

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


2929
2017-07-06 11:49



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à.


215
2017-07-06 02:41



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".


115
2017-09-25 20:45



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 


55
2018-02-23 10:37



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 :Gdiffe 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).


41
2017-08-12 13:32



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.

enter image description here


26
2017-12-05 17:29



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

20
2018-06-06 22:14



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.


17
2017-07-08 07:00



Se dovessi usare emacs, dai un'occhiata magit, che fornisce un'interfaccia git per emacs. Supporta staging hunk (parti di file) abbastanza bene.


12
2017-08-07 13:25