'git add --patch' pour inclure de nouveaux fichiers?

104

Quand je cours git add -p, y a-t-il un moyen pour git de sélectionner les fichiers nouvellement créés comme morceaux à sélectionner?

Donc, si je crée un nouveau fichier appelé foo.java, puis lancez git add -p, git ne me laissera pas choisir le contenu de ce fichier à ajouter à l'index.

Alexander Bird
la source

Réponses:

77

Pour ce faire avec tous les nouveaux fichiers, vous pouvez exécuter:

git add -N .
git add -p

Si vous souhaitez l'utiliser fréquemment, vous pouvez créer un alias dans votre ~/.bashrc:

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

NB : Si vous l'utilisez avec un nouveau fichier vide, git ne pourra pas le patcher et passer au suivant.

Ulysse BN
la source
13
Pour tous ceux qui se demandent ce que git add -Nfait, il ajoute simplement les fichiers non suivis spécifiés à l'index, mais sans contenu.
Odin
112

Quand j'essayais git add -p someNewFile.txtun nouveau fichier (un fichier non suivi), git sortait simplement No changes.et s'arrêtait. J'ai dû dire à git que j'avais l'intention de suivre le nouveau fichier en premier.

git add -N someNewFile.txt
git add -p

Cependant, comme le fichier n'a pas été suivi, il apparaîtrait comme un morceau géant qui ne pouvait pas être divisé (car tout est nouveau!). Alors, j'ai eu besoin de modifier le morceau en petits morceaux. Si vous n'êtes pas familier avec cela, consultez cette référence pour commencer.

Mise à jour - Informations d'édition Hunk Je voulais mettre à jour cela au cas où la référence ci-dessus disparaîtrait. Parce que le nouveau fichier n'est pas suivi, git add -paffichera chaque ligne du fichier comme une nouvelle ligne dans un morceau. Il vous demandera ensuite ce que vous voulez faire de ce morceau, vous donnant l'invite suivante:

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

En supposant que vous ne voulez pas valider tout le morceau (et donc, le fichier entier; parce que je ne sais pas pourquoi vous voudriez utiliser git add -pdans ce cas?), Vous voudrez spécifier une option epour dire à git que vous voulez éditer le morceau.

Une fois que vous avez dit à git que vous voulez éditer le morceau, il devrait vous déposer dans l'éditeur de votre choix afin que vous puissiez apporter vos modifications. Toutes les lignes doivent être préfixées par a +et git a quelques commentaires explicatifs (préfixés par a #) à la fin du fichier. Supprimez simplement toutes les lignes que vous ne voulez pas dans votre validation initiale du fichier. Puis enregistrez et quittez l'éditeur.

Explication de Git sur les options de morceau de 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
ChatChaussures
la source
1
Veuillez répondre à cette question en résumé.
Inanc Gumus
5
En résumé, git add -N someNewFile.txtsuivi degit add -p
CatShoes
7

git add -p consiste en fait à ajouter des modifications à des fichiers déjà suivis.

La commande permettant de sélectionner interactivement les fichiers à ajouter est git add -i. Par exemple:

$ 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

(La vraie commande a des couleurs que je ne pouvais pas couper-coller ici, donc c'est plus joli qu'il n'y paraît)

En fait, la commande p atch de git add -ifait la même chose que git add -p, donc le second est un sous-ensemble du premier (même si j'avoue que je m'aime add -pet que add -ije me déteste !).

Matthieu Moy
la source
"J'admets que j'aime ajouter -p et que je déteste moi-même!" C'est pourquoi git add then patch est une solution que j'adore: il vous permet toujours de vérifier le contenu des nouveaux fichiers que vous ajoutez (puisque vous les comparez avec leurs versions vides), et les fichiers de patch que vous avez édités!
Ulysse BN
Veuillez me corriger si je me trompe, mais même ici en mode interactif, le patch sera toujours affiché No changes.sur un nouveau fichier. L'OP demandait comment ajouter des morceaux à partir d'un nouveau fichier, pas du fichier entier. Je crois que --intent-to-addc'est toujours nécessaire ici.
Jeff Puckett
add -pseul ne fonctionnera pas, mais cette réponse suggère add -i, ce qui fonctionne.
Matthieu Moy
Je vote parce que je n'en savais rien git add -i. Cependant, vous pouvez faire la même chose de manière non interactive avec git add -N.
Mad Physicist
5

Il existe également une approche très similaire utilisant le --cached drapeau ...

1) Transformez vos modifications non organisées en étapes, tout comme votre fichier ajouté.

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

2) Regardez le diff (note: vous pouvez inclure à la fois des modifications et de nouveaux fichiers).

git diff --cached

3) Créez le patch.

git diff --cached > my_patch_file.patch
doublejosh
la source
Malheureusement, cela n'atteindra pas le même objectif. Ce que j'aime, git add -pc'est qu'il n'ajoute pas tout, mais laissez-moi choisir ce que je veux ajouter. Cette solution ajouterait tout aveuglément.
Alexander Bird
Eh bien, vous pouvez choisir ce que vous ajoutez! Je mettrai à jour la réponse.
doublejosh
1
merci: tout: cela fonctionne à merveille pour moi
macool