'git add --patch' per includere nuovi file?


104

Quando corro git add -p, c'è un modo per git di selezionare i file appena creati come pezzi da selezionare ??

Quindi, se creo un nuovo file chiamato foo.java, quindi eseguo git add -p, git non mi permetterà di scegliere il contenuto di quel file da aggiungere all'indice.

Risposte:


77

Per farlo con ogni nuovo file, puoi eseguire:

git add -N .
git add -p

Se vuoi usarlo frequentemente, puoi creare un alias nel tuo ~/.bashrc:

alias gapan='git add --intent-to-add . && git add --patch'

NB : Se lo usi con un nuovo file vuoto, git non sarà in grado di correggerlo e passare a quello successivo.


13
Per chiunque si chieda cosa git add -Nfa, aggiunge semplicemente i file non tracciati specificati all'indice, ma senza contenuto.
Odino

112

Quando provavo git add -p someNewFile.txtun nuovo file (un file non tracciato), git veniva semplicemente visualizzato No changes.e interrotto. Ho dovuto dire a git che intendevo prima tracciare il nuovo file.

git add -N someNewFile.txt
git add -p

Tuttavia, poiché il file non è stato tracciato, verrà visualizzato come un pezzo gigante che non può essere diviso (perché è tutto nuovo!). Quindi, ho dovuto modificare il pezzo in bit più piccoli. Se non lo conosci, controlla questo riferimento per iniziare.

Aggiornamento - Informazioni sulla modifica del pezzo che volevo aggiornare nel caso in cui il riferimento precedente scompaia. Poiché il nuovo file non è tracciato, git add -pmostrerà ogni riga del file come una nuova riga in un blocco. Ti chiederà quindi cosa vuoi fare con quel pezzo, dandoti il ​​seguente prompt:

Stage this hunk [y,n,q,a,d,/,e,?]?

Supponendo che tu non voglia impegnare l'intero pezzo (e quindi, l'intero file; perché non sono sicuro del motivo per cui vorresti usarlo git add -pin quel caso?), Vorrai specificare l'opzione eper dire a git che vuoi modificare il fusto.

Una volta che hai detto a git che vuoi modificare il pezzo, dovrebbe farti entrare nel tuo editor preferito in modo che tu possa apportare le modifiche. Tutte le righe dovrebbero essere precedute da a +e git ha alcuni commenti esplicativi (con prefisso a #) alla fine del file. Elimina semplicemente tutte le righe che non desideri nel commit iniziale del file. Quindi salva e chiudi l'editor.

Spiegazione di Git delle opzioni hunk di git:

y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

1
Per favore qualcuno risponda a questo in sintesi.
Inanc Gumus

5
In sintesi, git add -N someNewFile.txtseguito dagit add -p
CatShoes

7

git add -p riguarda davvero l'aggiunta di modifiche a file già tracciati.

Il comando per selezionare interattivamente i file da aggiungere è git add -i. Per esempio:

$ git add -i

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now> a
  1: another-new.java
  2: new.java
Add untracked>> 2
  1: another-new.java
* 2: new.java
Add untracked>> 
added one path

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now> q
Bye.
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   new.java

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        another-new.java

(Il vero comando ha colori che non ho potuto tagliare e incollare qui, quindi è più bello di quanto sembri)

In realtà, il comando p atch di git add -ifa lo stesso di git add -p, quindi il secondo è un sottoinsieme del primo (anche se ammetto di amare add -pe odiare add -ime stesso!).


"Ammetto di amare aggiungere -p e odiare aggiungere -i me stesso!" Questo è il motivo per cui git add then patch è una soluzione che amo: ti consente comunque di controllare il contenuto dei nuovi file che stai aggiungendo (dato che li confronti con le loro versioni vuote) e dei file di patch che hai modificato!
Ulysse BN

Per favore correggimi se sbaglio, ma anche qui in modalità interattiva, la patch verrà comunque prodotta No changes.su un nuovo file. L'OP stava chiedendo come aggiungere pezzi da un nuovo file, non l'intero file. Credo --intent-to-addsia ancora necessario qui.
Jeff Puckett

add -pda solo non funzionerà, ma questa risposta suggerisce add -i, il che funziona.
Matthieu Moy

Sto votando perché non ne sapevo niente git add -i. Tuttavia, potresti fare la stessa cosa in modo non interattivo con git add -N.
Mad Physicist

4

C'è anche un approccio molto simile che utilizza la --cachedbandiera ...

1) Trasforma le modifiche non organizzate in fasi, proprio come il tuo file aggiunto.

git add edited-file.txt
git add new-file.txt
git add directory-of-changes/

2) Guarda il diff (nota: puoi includere sia le modifiche che i nuovi file).

git diff --cached

3) Crea la patch.

git diff --cached > my_patch_file.patch

Sfortunatamente questo non servirà allo stesso scopo. Quello che mi piace git add -pè che non aggiunge tutto, ma lasciami scegliere e scegliere quello che voglio aggiungere. Questa soluzione aggiungerebbe tutto ciecamente.
Alexander Bird,

Bene, puoi scegliere cosa aggiungere! Aggiornerò la risposta.
doublejosh

1
grazie: allthethings: questo funziona incredibilmente per me
macool
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.