Git add –interactive, ou como fazer commits incríveis

No git você pode, para um commit, adicionar apenas partes de um arquivo. para isso, você precisará usar a opção –interactive:

git add --interactive

ou

git add -i

depois de digitar este comando, você obterá:

> git add -i
staged unstaged path

1: unchanged +2/-0 README
2: unchanged +4/-0 index.html

*** Commands ***
1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked
5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp
What now>

lá, você terá muitas opções, mas duas realmente importam para você: corrigir (adicionar partes dos arquivos para o commit) e sair (para sair do add interativo).

Então, vamos corrigir:

What now> p
staged unstaged path

1: unchanged +2/-0 [R]EADME
2: unchanged +4/-0 [i]ndex.html
Patch update>>

Agora temos que escolher os arquivos que precisamos adicionar:

Patch update>> 2
staged unstaged path

1: unchanged +2/-0 [R]EADME
* 2: unchanged +4/-0 [i]ndex.html
Patch update>>

Todos os arquivos com uma estrela (*) à esquerda do número serão processados.

Para selecionar os arquivos, você tem muitas possibilidades:

  • #: Selecione o número do arquivo # </li>
  • – #: desmarque o número do arquivo # </li>
  • *: Selecione todos os arquivos </li>
  • # – #: Selecione um intervalo de arquivos </li>
  • # -: Selecione os arquivos do # ao último </li>

Claro, todas essas notações podem ser misturadas, por exemplo, se você tiver 10 arquivos alterados, você pode selecionar isto:

Patch update>> 1 3-6 8-

Que irá selecionar o 1, 3, 4, 5, 6, 8, 9 e 10

Depois de selecionar os arquivos desejados, pressione Enter.

se você quiser escolher diffs em todos os arquivos, você pode fazer:
git add -p

que é o mesmo que fazer:

git add --interactive
p
(for patch)
* (choose all the files)

A partir de agora, você será questionado sobre cada diff de cada arquivo se quiser adicioná-lo, com muitas respostas possíveis:

diff --git a/index.html b/index.html
index e574d0d
..057bf2d 100644
--- a/index.html
+++ b/index.html
@@ -1,6 +1,10 @@
<html>
<head>
+ <script type="text/javascript">
+ alert('Hello world');
+ </script>
</head>
<body>
+ <h1>title</h1>
</body>
</html>
Stage this hunk [y,n,q,a,d,/,s,e,?]?

Os mais importantes são:

  • s: sim </li>
  • n: não </li>
  • s: split, se o diff atual pode ser dividido em alguns diffs menores </li>
  • e: editar, para editar você mesmo o diff </li>
  • q: para sair </li>

Quando terminar, em um status git, você verá seus arquivos, tanto em arquivos adicionados quanto em arquivos modificados:

> git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: README
# modified: index.html
#

E se estiver tudo bem para você, você pode enviar o que adicionou.