Ione Souza Junior

Comando Git Add Explorado: Um Tutorial Passo a Passo

26/01/2024 | 20 minutos de leitura | Tradu√ß√Ķes: en | #git

Para adicionar arquivos a um reposit√≥rio Git, √© necess√°rio inclu√≠-los em uma √°rea espec√≠fica para commit. Mas por que esse passo √© necess√°rio? Se eu fizer altera√ß√Ķes, n√£o quero adicion√°-las ao reposit√≥rio? Sim, de fato, mas vou mostrar a voc√™ alguns benef√≠cios dessa abordagem e explicar mais detalhes sobre o comando. Vamos come√ßar!

Compreendendo a área de preparação (staging)

Em um reposit√≥rio Git, a √°rea de prepara√ß√£o √© a etapa intermedi√°ria crucial entre modificar seus arquivos e salvar permanentemente essas altera√ß√Ķes em um commit. A prepara√ß√£o permite que voc√™ escolha cuidadosamente quais modifica√ß√Ķes deseja incluir em seu pr√≥ximo commit, oferecendo controle granular sobre o desenvolvimento do seu projeto e ajudando a articular seu processo de pensamento de maneira mais eficaz por meio dos commits.

Quando voc√™ faz altera√ß√Ķes nos arquivos do seu projeto, o Git reconhece essas modifica√ß√Ķes, mas elas n√£o s√£o inclu√≠das automaticamente no pr√≥ximo commit. √Č aqui que entra o conceito de prepara√ß√£o. A √°rea de prepara√ß√£o √© um espa√ßo de armazenamento tempor√°rio onde voc√™ escolhe seletivamente quais altera√ß√Ķes devem fazer parte do pr√≥ximo commit.

Ao preparar modifica√ß√Ķes espec√≠ficas intencionalmente, voc√™ pode agrupar altera√ß√Ķes relacionadas ou fazer commit separadamente. Isso promove um hist√≥rico de vers√£o limpo e organizado, facilitando uma compreens√£o mais clara da progress√£o do seu projeto ou funcionalidade ao longo do tempo.

Agora que você conhece a área de preparação, vamos falar sobre como adicionar seus arquivos à ela.

Adicionando arquivos à área de preparação

Como demonstrado no √ļltimo post, podemos adicionar arquivos √† √°rea de prepara√ß√£o usando v√°rios m√©todos. No entanto, todas essas op√ß√Ķes que vimos adicionam o arquivo inteiro √† √°rea de prepara√ß√£o. Abaixo, vou aprofundar mais, ajudando voc√™ a se tornar proficiente nisso.

Estou utilizando este reposit√≥rio para os exemplos, implementando altera√ß√Ķes para mostrar como os comandos funcionam.

Preparação parcial

Quando usamos o comando git add com o par√Ęmetro -p, podemos revisar todas as altera√ß√Ķes introduzidas e escolher quais adicionar √† √°rea de prepara√ß√£o.

Por que √© importante pensar sobre isso? Tecnicamente, agrupar todas as altera√ß√Ķes em um commit n√£o apresenta problemas. No entanto, se voc√™ aprecia um hist√≥rico de commit organizado e deseja articular seu processo de pensamento, invista tempo na estrutura√ß√£o de suas altera√ß√Ķes. Eu prefiro essa abordagem porque progredir em pequenos incrementos me permite reverter commits espec√≠ficos posteriormente sem impactar toda a implementa√ß√£o. Quando estamos desenvolvendo um software, √© comum mudarmos nosso pensamento e termos outra ideia baseada no que estamos descobrindo, e desta forma, voc√™ pode mudar sua implementa√ß√£o de forma estruturada e organizada.

Suponha que eu precise alterar o nome de uma fonte em um arquivo espec√≠fico do projeto. Enquanto fa√ßo isso, encontro alguns coment√°rios dentro do arquivo que decido remover. Agora, o que devo escrever no t√≠tulo do commit? ‚ÄúAlterar estilo da fonte e remover coment√°rios desnecess√°rios‚ÄĚ? Errado. Combinar todas essas altera√ß√Ķes em um commit pode levar √† confus√£o, pois pode obscurecer a distin√ß√£o entre as mudan√ßas prim√°rias e secund√°rias. Vamos explorar como podemos separar essas altera√ß√Ķes em dois commits distintos.

git add -p

Quando você faz isso, o Git mostrará cada alteração separadamente em trechos:

diff --git a/BookTracking/AppDelegate.swift b/BookTracking/AppDelegate.swift
index 920883f..f174577 100644
--- a/BookTracking/AppDelegate.swift
+++ b/BookTracking/AppDelegate.swift
@@ -18,7 +18,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
     }
     
     private func configAppearance() {
-        let fontName = "Georgia-Bold"
+        let fontName = "Georgia"
         
         UILabel.appearance().font = UIFont(name: fontName, size: 12)
         
(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]?

O Git est√° nos informando que encontrou dois trechos, e este √© o primeiro. Eu apenas mudei o nome da fonte ‚ÄúGeordia-Bold‚ÄĚ para ‚ÄúGeordia‚ÄĚ. Este √© o primeiro commit que quero fazer. Mas como fa√ßo isso? Observe que na √ļltima linha existem muitas op√ß√Ķes (y,n,q,a,d,j,J,g,/,e,?). Cada uma delas √© respons√°vel por realizar alguma a√ß√£o. Escolhi a √ļltima para ver a ajuda do Git com esses comandos. Basta digitar ?:

(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]? ?
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
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
g - select a hunk to go to
/ - search for a hunk matching the given regex
e - manually edit the current hunk
? - print help
@@ -18,7 +18,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
     }
     
     private func configAppearance() {
-        let fontName = "Georgia-Bold"
+        let fontName = "Georgia"
         
         UILabel.appearance().font = UIFont(name: fontName, size: 12)
         
(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]?

Agora podemos ver o que cada opção faz:

  • y: Adiciona este trecho √† √°rea de prepara√ß√£o. Semelhante a git add, mas apenas para este trecho de c√≥digo;
  • n: Descarta este trecho da √°rea de prepara√ß√£o. Este trecho de c√≥digo n√£o ser√° adicionado, mas voc√™ n√£o o perder√°;
  • q: Sai da sele√ß√£o de altera√ß√Ķes;
  • a: Adiciona este trecho √† √°rea de prepara√ß√£o e todos os trechos subsequentes no arquivo. Isso √© um pouco perigoso se voc√™ n√£o souber ou lembrar o que existe nos trechos seguintes;
  • d: Descarta este e os trechos seguintes neste arquivo;
  • j: Deixa este trecho indefinido se voc√™ tiver alguma d√ļvida e passa para o pr√≥ximo trecho indefinido;
  • J: Deixa este trecho indefinido se voc√™ tiver alguma d√ļvida e passa para o pr√≥ximo trecho;
  • g: Esta √© uma op√ß√£o interessante: voc√™ pode navegar entre os trechos deste arquivo. Isso pode ser bom para voc√™ verificar algumas partes do c√≥digo antes de adicionar ou descartar algo;
  • /: Op√ß√£o semelhante √† fun√ß√£o acima, mas voc√™ pode especificar alguma express√£o regular para encontrar um trecho espec√≠fico;
  • e: Isso √© incr√≠vel porque, se o seu trecho alterar muitas linhas, voc√™ pode selecionar quais linhas fazem sentido adicionar;
  • ?: Esta foi a op√ß√£o que usei para ver a ajuda.

H√° muitas op√ß√Ķes. O que preciso fazer? Neste caso, estou focando na altera√ß√£o do nome da fonte. Ent√£o vou aceitar este trecho apenas digitando y. Agora, o Git nos mostra o segundo trecho. Este √© o trecho de c√≥digo que removi dos coment√°rios. Vou deixar isso para outro commit. Vou descart√°-lo digitando n.

(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]? y
@@ -34,15 +34,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
     // MARK: UISceneSession Lifecycle
 
     func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
-        // Called when a new scene session is being created.
-        // Use this method to select a configuration to create the new scene with.
         return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
     }
 
     func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
-        // Called when the user discards a scene session.
-        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
-        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
     }
 
 
(2/2) Stage this hunk [y,n,q,a,d,K,g,/,s,e,?]? n

Agora terminamos! Vamos verificar o status do repositório para ver o que está acontecendo:

git status

On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   BookTracking/AppDelegate.swift

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   BookTracking/AppDelegate.swift

Observe que o arquivo AppDelegate.swift está localizado tanto na área de preparação quanto fora da área de preparação. Isso é possível porque selecionamos apenas um trecho do arquivo para realizar o commit.

Eu sei. Posso ouvir você agora me dizendo que é mais fácil fazer isso usando uma ferramenta de Git GUI. Ok, você está certo, mas é isso que a ferramenta de Git GUI fará nos bastidores. Mas se você preferir ou tiver apenas a linha de comando, saberá como adicionar arquivos à área de preparação. Isso foi uma pequena amostra de como usar esta opção. Existem mais possibilidades, e eu o encorajo a explorá-las.

Vamos explorar uma abordagem alternativa, utilizando um comando mais robusto.

Preparação usando o modo interativo

O modo interativo é mais poderoso porque fornece um controle mais granular sobre a preparação. Adicionei um novo arquivo ao projeto, e agora vou mostrar o git status.

git status

On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   BookTracking.xcodeproj/project.pbxproj
	modified:   BookTracking/AppDelegate.swift

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	BookTracking/Components/IconViewComponent.swift

no changes added to commit (use "git add" and/or "git commit -a")

Observe o arquivo n√£o rastreado no final da mensagem do Git. Se eu executar git add -p, este arquivo n√£o ser√° mostrado. Mas usando o modo interativo, teremos a possibilidade de trabalhar com ele. Isso ocorre porque git add -p s√≥ funciona analisando as altera√ß√Ķes nos arquivos do reposit√≥rio, n√£o em novos arquivos ainda n√£o adicionados. No entanto, usar o modo interativo n√£o √© um problema porque nos permite adicionar este arquivo ao reposit√≥rio.

git add -i

           staged     unstaged path
  1:    unchanged        +4/-0 BookTracking.xcodeproj/project.pbxproj
  2:    unchanged        +1/-6 BookTracking/AppDelegate.swift

*** Commands ***
  1: status	  2: update	  3: revert	  4: add untracked
  5: patch	  6: diff	  7: quit	  8: help
What now>

No in√≠cio da mensagem, o ‚Äústatus‚ÄĚ √© vis√≠vel. Abaixo, voc√™ encontrar√° comandos dispon√≠veis, cada um associado a um n√ļmero. Voc√™ pode ent√£o executar o comando desejado digitando seu n√ļmero no di√°logo ‚ÄúWhat now‚ÄĚ na parte inferior. Agora, vamos aprofundar nas op√ß√Ķes:

  • 1: Mostra os caminhos dos arquivos com altera√ß√Ķes;
  • 2: Adiciona as altera√ß√Ķes √† √°rea de prepara√ß√£o;
  • 3: Reverte as altera√ß√Ķes para voltar √† √°rea n√£o preparada;
  • 4: Adiciona os arquivos n√£o rastreados √† √°rea de prepara√ß√£o. Observe que n√£o podemos ver esses arquivos no status;
  • 5: Escolha trechos e adicione-os seletivamente. √Č o mesmo que git add -p;
  • 6: Mostra a diferen√ßa das altera√ß√Ķes na √°rea de prepara√ß√£o;
  • 7: Sai do modo interativo;
  • 8: Mostra o menu de ajuda.

O status (op√ß√£o 1) √© o que estamos vendo agora. Vamos explorar a op√ß√£o 2 para adicionar as altera√ß√Ķes √† √°rea de prepara√ß√£o. Em ‚ÄúWhat now‚ÄĚ eu digitei 2.

What now> 2
           staged     unstaged path
  1:    unchanged        +4/-0 BookTracking.xcodeproj/project.pbxproj
  2:    unchanged        +1/-6 BookTracking/AppDelegate.swift
Update>>

Agora o Git mostra dois arquivos que eu alterei e pergunta qual deles eu quero fazer a a√ß√£o. Observe que os arquivos s√£o enumerados, e precisamos usar isso para informar no di√°logo ‚ÄúUpdate‚ÄĚ. Vou escolher o arquivo AppDelegate.swift, enumerado como o n√ļmero 2.

Update>> 2   
           staged     unstaged path
  1:    unchanged        +4/-0 BookTracking.xcodeproj/project.pbxproj
* 2:    unchanged        +1/-6 BookTracking/AppDelegate.swift
Update>>

O Git exibe o mesmo conte√ļdo e repete a pergunta, mas observe que o arquivo selecionado tem um asterisco. Voc√™ pode adicionar mais arquivos, mas por enquanto, vou apenas pressionar ‚Äúenter‚ÄĚ para concluir o processo.

Update>> 
updated 1 path

*** Commands ***
  1: status	  2: update	  3: revert	  4: add untracked
  5: patch	  6: diff	  7: quit	  8: help
What now>

O Git nos informou que atualizou um caminho e forneceu os comandos mais uma vez. Verificar o status atual revelar√° altera√ß√Ķes na tabela.

What now> 1
           staged     unstaged path
  1:    unchanged        +4/-0 BookTracking.xcodeproj/project.pbxproj
  2:        +1/-6      nothing BookTracking/AppDelegate.swift

*** Commands ***
  1: status	  2: update	  3: revert	  4: add untracked
  5: patch	  6: diff	  7: quit	  8: help
What now>

Observe que na coluna ‚Äústaged‚ÄĚ, o arquivo AppDelegate.swift cont√©m a discrimina√ß√£o das altera√ß√Ķes: uma linha adicionada ou alterada e seis removidas. Voc√™ pode ver o que est√° na √°rea de prepara√ß√£o usando a op√ß√£o 6 (diff).

What now> 6
           staged     unstaged path
  1:        +1/-6      nothing BookTracking/AppDelegate.swift
Review diff>>

Novamente, o Git nos mostrar√° os arquivos preparados, e precisamos escolher um deles para ver a diferen√ßa. Vamos escolher o arquivo n√ļmero 1 no di√°logo ‚ÄúReview diff‚ÄĚ.

Review diff>> 1
diff --git a/BookTracking/AppDelegate.swift b/BookTracking/AppDelegate.swift
index 920883f..f174577 100644
--- a/BookTracking/AppDelegate.swift
+++ b/BookTracking/AppDelegate.swift
@@ -18,7 +18,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
     }
     
     private func configAppearance() {
-        let fontName = "Georgia-Bold"
+        let fontName = "Georgia"
         
         UILabel.appearance().font = UIFont(name: fontName, size: 12)
         
@@ -34,15 +34,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
     // MARK: UISceneSession Lifecycle
 
     func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
-        // Called when a new scene session is being created.
-        // Use this method to select a configuration to create the new scene with.
         return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
     }
 
     func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
-        // Called when the user discards a scene session.
-        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
-        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
     }
 
 

*** Commands ***
  1: status	  2: update	  3: revert	  4: add untracked
  5: patch	  6: diff	  7: quit	  8: help
What now>

O Git nos mostra todas as altera√ß√Ķes que est√£o na √°rea de prepara√ß√£o. Vamos explorar outra op√ß√£o. Se voc√™ quiser descartar essas altera√ß√Ķes para a √°rea de prepara√ß√£o, pode usar a a√ß√£o de reverter, que √© a op√ß√£o 3.

What now> 3
           staged     unstaged path
  1:        +1/-6      nothing BookTracking/AppDelegate.swift
Revert>>

Novamente, o Git nos perguntar√° quais arquivos queremos reverter. Vou selecionar o arquivo n√ļmero 1 para continuar.

Revert>> 1
           staged     unstaged path
* 1:        +1/-6      nothing BookTracking/AppDelegate.swift
Revert>>

Verifique se o arquivo que voc√™ escolheu cont√©m o asterisco, e se n√£o houver outro arquivo para reverter, basta pressionar ‚Äúenter‚ÄĚ.

Revert>> 
reverted 1 path

*** Commands ***
  1: status	  2: update	  3: revert	  4: add untracked
  5: patch	  6: diff	  7: quit	  8: help
What now>

O Git nos disse que reverteu um arquivo. Vamos verificar o status para ver o que est√° acontecendo.

What now> 1
           staged     unstaged path
  1:    unchanged        +4/-0 BookTracking.xcodeproj/project.pbxproj
  2:    unchanged        +1/-6 BookTracking/AppDelegate.swift

*** Commands ***
  1: status	  2: update	  3: revert	  4: add untracked
  5: patch	  6: diff	  7: quit	  8: help
What now>

Agora tudo est√° como era antes!

Eu falei sobre arquivos não rastreados, certo? Vamos explorar a opção 4 para vê-la em ação.

What now> 4
           staged     unstaged path
  1: BookTracking/Components/IconViewComponent.swift
Add untracked>>

O modo interativo exibe os arquivos não rastreados. Eu tenho apenas um novo arquivo neste projeto, mas seu projeto pode ter vários arquivos. Escolha os arquivos que você deseja adicionar à área de preparação. No meu caso, é o arquivo 1.

Add untracked>> 1   
           staged     unstaged path
* 1: BookTracking/Components/IconViewComponent.swift
Add untracked>>

Verifique se seus arquivos foram selecionados corretamente e pressione ‚Äúenter‚ÄĚ.

Add untracked>> 
added 1 path

*** Commands ***
  1: status	  2: update	  3: revert	  4: add untracked
  5: patch	  6: diff	  7: quit	  8: help
What now>

O Git nos disse que um arquivo foi adicionado. Vamos verificar o status para ver o que est√° acontecendo.

What now> 1
           staged     unstaged path
  1:    unchanged        +4/-0 BookTracking.xcodeproj/project.pbxproj
  2:    unchanged        +1/-6 BookTracking/AppDelegate.swift
  3:       +12/-0      nothing BookTracking/Components/IconViewComponent.swift

*** Commands ***
  1: status	  2: update	  3: revert	  4: add untracked
  5: patch	  6: diff	  7: quit	  8: help
What now>

Agora temos o novo arquivo na área de preparação. Funciona!

Vamos explorar mais uma opção: O patch. Esta é a opção 5 e é o mesmo que git add -p. Vamos ver:

What now> 5
           staged     unstaged path
  1:    unchanged        +4/-0 BookTracking.xcodeproj/project.pbxproj
  2:    unchanged        +1/-6 BookTracking/AppDelegate.swift
Patch update>>

Primeiro, selecione seus arquivos para aplicar o patch. Vou escolher o arquivo 2.

Patch update>> 2
           staged     unstaged path
  1:    unchanged        +4/-0 BookTracking.xcodeproj/project.pbxproj
* 2:    unchanged        +1/-6 BookTracking/AppDelegate.swift
Patch update>>

Verifique se o arquivo foi selecionado e pressione ‚Äúenter‚ÄĚ para confirmar.

Patch update>>     
diff --git a/BookTracking/AppDelegate.swift b/BookTracking/AppDelegate.swift
index 920883f..f174577 100644
--- a/BookTracking/AppDelegate.swift
+++ b/BookTracking/AppDelegate.swift
@@ -18,7 +18,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
     }
     
     private func configAppearance() {
-        let fontName = "Georgia-Bold"
+        let fontName = "Georgia"
         
         UILabel.appearance().font = UIFont(name: fontName, size: 12)
         
(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]?

Agora, observe o mesmo processo da seção anterior deste post. Nada muda. Aceite ou negue os trechos conforme necessidade. No final, você será redirecionado para os comandos do modo interativo.

Nesses comandos, com a op√ß√£o 7 voc√™ pode sair do modo interativo, e com a op√ß√£o 8 voc√™ pode ver algumas instru√ß√Ķes b√°sicas para cada comando. Acabamos aqui! Depois disso, voc√™ pode sair do modo interativo, commitar suas altera√ß√Ķes e ser feliz.

Usando o modo interativo, podemos reverter alguns arquivos da área de preparação. Mas podemos fazer isso de uma forma mais simples. Vamos aprender.

Removendo arquivos da área de preparação

Assim como posso adicionar arquivos à area de preparação, também posso removê-los. Se você digitar git status, poderá ver a dica do Git sobre como fazer isso. Vamos conferir.

git status      

On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   BookTracking/AppDelegate.swift
	new file:   BookTracking/Components/IconViewComponent.swift

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   BookTracking.xcodeproj/project.pbxproj
	modified:   BookTracking/AppDelegate.swift

Veja as dicas do Git acima dos nomes dos arquivos. Vamos remover da √°rea de prepara√ß√£o as altera√ß√Ķes no arquivo AppDelegate.swift.

git restore --staged BookTracking/AppDelegate.swift

O Git não mostra nada para nós. Vamos verificar o status para ver o que está acontecendo.

git status                                         
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   BookTracking/Components/IconViewComponent.swift

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   BookTracking.xcodeproj/project.pbxproj
	modified:   BookTracking/AppDelegate.swift

Agora podemos ver que o arquivo AppDelegate.swift voltou para os arquivos n√£o confirmados. √ďtimo! Mas o que acontece se usarmos o mesmo comando sem o par√Ęmetro --staged? Vamos ver.

git restore BookTracking/AppDelegate.swift

E ent√£o o status:

git status                                
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   BookTracking/Components/IconViewComponent.swift

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   BookTracking.xcodeproj/project.pbxproj

Oh n√£o! Perdi minhas altera√ß√Ķes! Sem o par√Ęmetro --staged, o Git descartar√° as altera√ß√Ķes na √°rea n√£o preparada e ser√° imposs√≠vel recuperar qualquer coisa. Tenha cuidado com esses comandos para n√£o perder seu trabalho √°rduo.

Usando a área de preparação no dia a dia

Ao mergulhar no mundo do Git, √© comum adicionar todas as altera√ß√Ķes √† area de prepara√ß√£o e fazer apenas um commit. No entanto, √† medida que sua experi√™ncia cresce, a import√Ęncia da etapa de prepara√ß√£o torna-se cada vez mais evidente.

O uso estratégico do comando git add permite que você faça a transição do hábito inicial de preparar tudo para uma abordagem mais refinada. Cuidar do que será inserido em cada commit leva a um histórico de versão que conta uma história clara e lógica da evolução do seu projeto. Commits pequenos e focados não são apenas uma prática, mas uma estratégia para manter um histórico organizado e compreensível.

Considere a natureza colaborativa de muitos projetos de desenvolvimento. Ao preparar as altera√ß√Ķes cuidadosamente, voc√™ contribui para um processo de desenvolvimento mais colaborativo e eficiente. Cada commit se torna uma contribui√ß√£o significativa, facilitando para os membros da equipe compreender, revisar, e integrar altera√ß√Ķes de forma transparente.

Dividir suas altera√ß√Ķes em commits menores e bem definidos facilita a depura√ß√£o mais eficiente. Se surgir um problema, voc√™ pode identificar exatamente o commit respons√°vel, tornando mais simples identificar e corrigir problemas sem vasculhar um commit monol√≠tico que abrange v√°rias altera√ß√Ķes.

Encontrar o equilíbrio certo entre commits coesos e mudanças granulares é uma arte que evolui com a experiência. Cada commit deve encapsular uma unidade lógica de trabalho, fornecendo uma visão do progresso sem sobrecarregar o histórico de commits.

Eu aprendi a apreciar isso e fazer in√ļmeras pequenas altera√ß√Ķes, cada uma encapsulando uma mudan√ßa espec√≠fica. Essa pr√°tica n√£o apenas est√° alinhada com as melhores pr√°ticas de controle de vers√£o, mas tamb√©m aprimora a agilidade geral do seu processo de desenvolvimento.

Ao embarcar em sua jornada com o Git, deixe a √°rea de prepara√ß√£o ser sua aliada na cria√ß√£o de um hist√≥rico de vers√£o que n√£o √© apenas um registro de altera√ß√Ķes, mas uma narrativa do crescimento e refinamento do seu projeto. D√™ uma chance a esta forma de pensar e observe como ela transforma seu fluxo de trabalho de controle de vers√£o em uma colabora√ß√£o eficiente e sem problemas.

√Č isso! Voc√™ usa este comando? J√° conhecia essas possibilidades ou como este comando pode ajud√°-lo? Compartilhe seus pensamentos sobre esta postagem nos coment√°rios.

Até breve!