'git add --patch' um neue Dateien aufzunehmen?

104

Gibt es beim Ausführen git add -peine Möglichkeit für Git, neu erstellte Dateien als Hunks auszuwählen?

Wenn ich also eine neue Datei mit dem Namen mache foo.javaund dann git add -p ausführe, kann ich mit git nicht den Inhalt dieser Datei auswählen, der dem Index hinzugefügt werden soll.

Alexander Bird
quelle

Antworten:

77

Um dies mit jeder neuen Datei zu tun, können Sie Folgendes ausführen:

git add -N .
git add -p

Wenn Sie es häufig verwenden möchten, können Sie einen Alias ​​in Ihrem ~/.bashrc:

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

NB : Wenn Sie dies mit einer leeren neuen Datei verwenden, kann git diese nicht patchen und zur nächsten springen.

Ulysse BN
quelle
13
Für alle, die sich fragen, was sie git add -Ntun sollen, werden nur die angegebenen nicht verfolgten Dateien zum Index hinzugefügt, jedoch ohne Inhalt.
Odin
112

Wenn ich git add -p someNewFile.txteine neue Datei (eine nicht verfolgte Datei) anprobierte, gab git einfach aus No changes.und stoppte. Ich musste git sagen, dass ich zuerst die neue Datei verfolgen wollte.

git add -N someNewFile.txt
git add -p

Da die Datei jedoch nicht verfolgt wurde, wurde sie als ein riesiges Stück angezeigt, das nicht geteilt werden konnte (weil alles neu ist!). Also musste ich das Stück in kleinere Teile zerlegen. Wenn Sie damit nicht vertraut sind, lesen Sie diese Referenz, um loszulegen.

Update - Hunk-Bearbeitungsinformationen Ich wollte dies aktualisieren, falls die obige Referenz nicht mehr angezeigt wird. Da die neue Datei nicht verfolgt wird, git add -pwird jede Zeile in der Datei als neue Zeile in einem Stück angezeigt. Sie werden dann gefragt, was Sie mit diesem Stück tun möchten, und erhalten die folgende Eingabeaufforderung:

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

Angenommen, Sie möchten nicht den gesamten Hunk (und damit die gesamte Datei; da ich nicht sicher bin, warum Sie ihn git add -pin diesem Fall verwenden möchten?) eFestschreiben, möchten Sie die Option angeben , um git mitzuteilen, dass Sie ihn bearbeiten möchten das Stück.

Sobald Sie git mitteilen, dass Sie das Stück bearbeiten möchten, sollte es Sie in den Editor Ihrer Wahl einfügen, damit Sie Ihre Änderungen vornehmen können. Allen Zeilen sollte ein Präfix vorangestellt werden, +und git hat #am Ende der Datei einige erläuternde Kommentare (vorangestellt mit a ). Löschen Sie einfach alle Zeilen, die Sie beim ersten Festschreiben der Datei nicht möchten. Speichern Sie dann den Editor und beenden Sie ihn.

Gits Erklärung der Hunk-Optionen von 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
CatShoes
quelle
1
Bitte jemand beantwortet dies zusammenfassend.
Inanc Gumus
5
Zusammenfassend, git add -N someNewFile.txtgefolgt vongit add -p
CatShoes
7

git add -p Es geht wirklich darum, Änderungen an bereits verfolgten Dateien hinzuzufügen.

Der Befehl zum interaktiven Auswählen der hinzuzufügenden Dateien lautet git add -i. Beispielsweise:

$ 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

(Der eigentliche Befehl enthält Farben, die ich hier nicht ausschneiden und einfügen konnte. Es ist also schöner, als es scheint.)

Tatsächlich macht der Befehl p atch git add -idasselbe wie git add -p, also ist der zweite eine Teilmenge des ersten (obwohl ich zugebe , dass ich mich selbst liebe add -pund hasse add -i!).

Matthieu Moy
quelle
"Ich gebe zu, ich liebe add -p und hasse add -i selbst!" Aus diesem Grund ist git add then patch eine Lösung, die ich liebe: Sie können trotzdem den Inhalt neuer Dateien überprüfen, die Sie hinzufügen (da Sie sie mit ihren leeren Versionen vergleichen), und Patch-Dateien, die Sie bearbeitet haben!
Ulysse BN
Bitte korrigieren Sie mich, wenn ich falsch liege, aber auch hier im interaktiven Modus wird der Patch immer noch No changes.in einer neuen Datei ausgegeben . Das OP fragte, wie Hunks aus einer neuen Datei hinzugefügt werden sollen, nicht aus der gesamten Datei. Ich glaube, hier --intent-to-addist noch etwas erforderlich.
Jeff Puckett
add -pallein wird nicht funktionieren, aber diese Antwort legt nahe add -i, was tut.
Matthieu Moy
Ich stimme zu, weil ich nichts davon wusste git add -i. Sie können jedoch das Gleiche nicht interaktiv tun git add -N.
Mad Physicist
4

Es gibt auch einen sehr ähnlichen Ansatz, bei dem die --cachedFlagge verwendet wird ...

1) Verwandeln Sie Ihre nicht bereitgestellten Änderungen in bereitgestellte Änderungen, genau wie Ihre hinzugefügte Datei.

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

2) Sehen Sie sich das Diff an (Hinweis: Sie können sowohl Änderungen als auch neue Dateien einfügen).

git diff --cached

3) Erstellen Sie den Patch.

git diff --cached > my_patch_file.patch
Doublejosh
quelle
Leider wird das nicht den gleichen Zweck erfüllen. Was mir gefällt, git add -pist, dass es nicht alles hinzufügt, aber lassen Sie mich auswählen, was ich hinzufügen möchte. Diese Lösung würde blind alles hinzufügen.
Alexander Bird
Nun können Sie auswählen, was Sie hinzufügen! Ich werde die Antwort aktualisieren.
DoubleJosh
1
danke: alles: das funktioniert erstaunlich für mich
macool