'git add --patch' para incluir novos arquivos?

104

Quando eu executo git add -p, há uma maneira do git selecionar arquivos recém-criados como pedaços para selecionar?

Portanto, se eu fizer um novo arquivo chamado foo.javae executar git add -p, o git não me deixará escolher o conteúdo desse arquivo a ser adicionado ao índice.

Alexander Bird
fonte

Respostas:

77

Para fazer isso com todos os novos arquivos, você pode executar:

git add -N .
git add -p

Se quiser usá-lo com frequência, você pode criar um alias em ~/.bashrc:

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

NB : Se você usar isso com um novo arquivo vazio, o git não será capaz de corrigi-lo e pular para o próximo.

Ulysse BN
fonte
13
Para quem está se perguntando o que git add -Nfaz, ele apenas adiciona os arquivos não rastreados especificados ao índice, mas sem conteúdo.
Odin
112

Quando eu tentava git add -p someNewFile.txtem um novo arquivo (um arquivo não rastreado), git simplesmente exibia No changes.e parava. Eu tive que dizer ao git que pretendia rastrear o novo arquivo primeiro.

git add -N someNewFile.txt
git add -p

No entanto, como o arquivo não foi rastreado, ele apareceria como um pedaço gigante que não poderia ser dividido (porque é tudo novo!). Então, eu precisei editar o pedaço em pedaços menores. Se você não estiver familiarizado com isso, verifique esta referência para começar.

Atualizar - Informações de edição do Hunk Eu queria atualizar isso caso a referência acima desapareça. Como o novo arquivo não está rastreado, git add -po mostrará cada linha do arquivo como uma nova linha em um trecho. Em seguida, ele perguntará o que você deseja fazer com esse pedaço, apresentando o seguinte prompt:

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

Assumindo que você não deseja comprometer todo o pedaço (e, portanto, todo o arquivo; porque não tenho certeza por que você gostaria de usar git add -pnesse caso?), Você desejará especificar a opção epara informar ao git que deseja editar o pedaço.

Uma vez que você diga ao git que deseja editar o pedaço, ele deve levá-lo ao editor de sua escolha para que você possa fazer suas alterações. Todas as linhas devem ser prefixadas com a +e git tem alguns comentários explicativos (prefixados com a #) no final do arquivo. Simplesmente exclua todas as linhas que você não deseja em seu commit inicial do arquivo. Em seguida, salve e feche o editor.

Explicação do Git sobre as opções do 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
fonte
1
Por favor, alguém responda resumidamente.
Inanc Gumus
5
Em resumo, git add -N someNewFile.txtseguido porgit add -p
CatShoes
7

git add -p trata-se realmente de adicionar alterações a arquivos já rastreados.

O comando para selecionar interativamente os arquivos a serem adicionados é git add -i. Por exemplo:

$ 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

(O comando real tem cores que eu não poderia cortar e colar aqui, então é melhor do que parece)

Na verdade, o comando p atch de git add -ifaz o mesmo que git add -p, então o segundo é um subconjunto do primeiro (embora eu admita que me amo add -pe add -ime odeio !).

Matthieu Moy
fonte
"Admito que adoro add -p e odeio add -i!" É por isso que git add then patch é uma solução que adoro: ele ainda permite que você verifique o conteúdo dos novos arquivos que está adicionando (desde que você os compare com suas versões vazias) e os arquivos de patch que você editou!
Ulysse BN
Por favor, corrija-me se eu estiver errado, mas mesmo aqui no modo interativo, o patch continuará No changes.em um novo arquivo. O OP estava perguntando como adicionar pedaços de um novo arquivo, não do arquivo inteiro. Eu acredito que --intent-to-addainda é necessário aqui.
Jeff Puckett
add -ppor si só não funcionará, mas esta resposta sugere add -i, o que funciona.
Matthieu Moy
Estou votando positivamente porque não sabia git add -i. No entanto, você pode fazer a mesma coisa de forma não interativa com git add -N.
Mad Physicist
4

Há também uma abordagem muito semelhante, usando o --cachedsinalizador ...

1) Transforme suas mudanças não planejadas em preparadas, assim como o arquivo adicionado.

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

2) Observe o diff (nota: você pode incluir edições e novos arquivos).

git diff --cached

3) Crie o patch.

git diff --cached > my_patch_file.patch
doublejosh
fonte
Infelizmente, isso não terá o mesmo propósito. O que eu gosto git add -pé que ele não adiciona tudo, mas deixe-me escolher o que desejo adicionar. Esta solução adicionaria tudo cegamente.
Alexander Bird
Bem, você pode escolher o que adicionar! Vou atualizar a resposta.
doublejosh
1
obrigado: todas as coisas: funciona maravilhosamente bem para mim
macool