'git add --patch' para incluir nuevos archivos?


104

Cuando ejecuto git add -p, ¿hay alguna forma de que git seleccione archivos recién creados como trozos para seleccionar?

Entonces, si hago un nuevo archivo llamado foo.java, luego ejecuto git add -p, git no me permitirá elegir el contenido de ese archivo para agregarlo al índice.

Respuestas:


77

Para hacer esto con cada archivo nuevo, puede ejecutar:

git add -N .
git add -p

Si desea usarlo con frecuencia, puede crear un alias en su ~/.bashrc:

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

NB : Si usa esto con un archivo nuevo vacío, git no podrá parchearlo y pasar al siguiente.


13
Para cualquiera que se pregunte qué git add -Nhace, simplemente agrega los archivos sin seguimiento especificados al índice, pero sin contenido.
Odin

112

Cuando probé git add -p someNewFile.txtun nuevo archivo (un archivo sin seguimiento), git simplemente mostraría la salida No changes.y se detendría. Tuve que decirle a git que tenía la intención de rastrear el nuevo archivo primero.

git add -N someNewFile.txt
git add -p

Sin embargo, dado que no se rastreó el archivo, se mostraría como un trozo gigante que no se podía dividir (¡porque es todo nuevo!). Entonces, necesitaba editar el trozo en trozos más pequeños. Si no está familiarizado con eso, consulte esta referencia para comenzar.

Actualización: información de edición de Hunk Quería actualizar esto en caso de que desaparezca la referencia anterior. Debido a que el nuevo archivo no tiene seguimiento, git add -pmostrará cada línea en el archivo como una nueva línea en un trozo. Luego te preguntará qué quieres hacer con ese trozo, dándote el siguiente mensaje:

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

Suponiendo que no desea confirmar todo el trozo (y, por lo tanto, todo el archivo; porque no estoy seguro de por qué querría usar git add -pen ese caso), querrá especificar la opción epara decirle a git que desea editar el trozo.

Una vez que le digas a git que quieres editar el trozo, debería colocarte en el editor de tu elección para que puedas hacer tus cambios. Todas las líneas deben tener el prefijo +ay git tiene algunos comentarios explicativos (con el prefijo a #) al final del archivo. Simplemente elimine las líneas que no desee en su confirmación inicial del archivo. Luego guarde y salga del editor.

Explicación de Git de las opciones de hunk 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

1
Por favor, alguien conteste esto en resumen.
Inanc Gumus

5
En resumen, git add -N someNewFile.txtseguido degit add -p
CatShoes

7

git add -p se trata realmente de agregar cambios a los archivos ya registrados.

El comando para seleccionar archivos de forma interactiva para agregar es git add -i. Por ejemplo:

$ 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

(El comando real tiene colores que no pude cortar y pegar aquí, así que es mejor de lo que parece)

En realidad, el comando p atch de git add -ihace lo mismo que git add -p, por lo que el segundo es un subconjunto del primero (¡aunque admito que me amo add -py add -ime odio !).


"Admito que me encanta add -p y odio añadir -i a mí mismo!" Esta es la razón por la que git add then patch es una solución que me encanta: aún te permite verificar el contenido de los archivos nuevos que estás agregando (ya que los comparas con sus versiones vacías) y los archivos de parche que has editado.
Ulysse BN

Corríjame si me equivoco, pero incluso aquí en modo interactivo, el parche seguirá apareciendo No changes.en un nuevo archivo. El OP estaba preguntando cómo agregar trozos de un nuevo archivo, no todo el archivo. Creo que --intent-to-addtodavía se requiere aquí.
Jeff Puckett

add -psolo no funcionará, pero esta respuesta sugiere add -i, que sí.
Matthieu Moy

Estoy votando a favor porque no sabía nada git add -i. Sin embargo, puede hacer lo mismo de forma no interactiva con git add -N.
Mad Physicist

4

También hay un enfoque muy similar al hacer uso de la --cachedbandera ...

1) Convierta sus cambios sin etapas en etapas, al igual que su archivo agregado.

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

2) Mire las diferencias (nota: puede incluir tanto ediciones como archivos nuevos).

git diff --cached

3) Cree el parche.

git diff --cached > my_patch_file.patch

Desafortunadamente, eso no logrará el mismo propósito. Lo que me gusta git add -pes que no agrega todo, pero permítame elegir lo que quiero agregar. Esta solución lo sumaría todo a ciegas.
Alexander Bird

¡Bueno, puedes elegir lo que agregas! Actualizaré la respuesta.
doublejosh

1
gracias: todas las cosas: esto funciona de
maravilla
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.