20. Movendo arquivos

Metas

  • Aprender como mover um arquivo dentro do repositório.

Estou satisfeito com nossas alterações no CSS, mas há apenas um aspecto que gostaria de abordar antes de mesclarmos nossas alterações no main. Vamos renomear o arquivo hello.html para index.html. Além disso, vamos mover nosso arquivo de estilos para um diretório css designado.

01 Ver o histórico de alterações em um determinado arquivo

O Git permite que você veja o histórico de alterações de um determinado arquivo. Vamos ver o registro de alterações do arquivo hello.html antes de renomeá-lo.

Execute

git log hello.html
git log style.css

Resultado

$ git log hello.html
903eb1d 2023-11-28 | Included stylesheet into hello.html (HEAD -> style) [Alexander Shvets]
9288a33 2023-11-28 | Added copyright statement with email (main) [Alexander Shvets]
b7614c1 2023-11-28 | Added HTML header (tag: v1) [Alexander Shvets]
46afaff 2023-11-28 | Added standard HTML page tags (tag: v1-beta) [Alexander Shvets]
78433de 2023-11-28 | Added h1 tag [Alexander Shvets]
5836970 2023-11-28 | Initial commit [Alexander Shvets]
$ git log style.css
555372e 2023-11-28 | Added css stylesheet [Alexander Shvets]

02 Ver um diff de um determinado arquivo

A capacidade de ver o registro de alterações de um determinado arquivo é útil. Ele permite que você veja o que foi alterado, quem fez as alterações e quando. Também é possível ver as alterações associadas a um commit específico. Eu o utilizo o tempo todo para descobrir como funciona a versão atual do código.

O comando show é usado para ver as alterações em um commit específico. Vejamos as alterações no arquivo hello.html no commit marcado com v1 (você pode usar qualquer referência de commit, como HEAD, hash do commit, nome da tag ou do branch, etc.).

Execute

git show v1

Resultado

$ git show v1
b7614c1 2023-11-28 | Added HTML header (tag: v1) [Alexander Shvets]

diff --git a/hello.html b/hello.html
index 6da0629..0d576c4 100644
--- a/hello.html
+++ b/hello.html
@@ -1,4 +1,6 @@
 <html>
+  <head>
+  </head>
   <body>
     <h1>Hello, World!</h1>
   </body>

03 Renomear hello.html

Como você vê, é muito conveniente poder ver o registro de alterações de um determinado arquivo. Mas quando você renomeia ou move algo, há o risco de perder o histórico desse arquivo se não o fizer corretamente.

Vamos renomear nosso arquivo hello.html para index.html com o comando padrão mv e ver o que acontece.

Execute

mv hello.html index.html
git status

Resultado

$ mv hello.html index.html
$ git status
On branch style
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	deleted:    hello.html

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	index.html

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

O Git entende nossa alteração como se o arquivo tivesse sido excluído e um novo arquivo tivesse sido criado. Esse é um sinal de alerta. Precisamos informar ao Git que renomeamos o arquivo em vez de excluí-lo e criar um novo. Em um caso simples, o Git descobrirá que o arquivo foi renomeado assim que adicionarmos o arquivo ao índice:

Execute

git add .
git status

Resultado

$ git add .
$ git status
On branch style
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	renamed:    hello.html -> index.html

Veja, o arquivo é listado como renomeado. Mas isso é o Git tentando ser inteligente. Nem sempre isso funciona. Por exemplo, se você renomeou e modificou vários arquivos, o Git pode não ser capaz de descobrir o que exatamente foi renomeado. Nesse caso, você pode perder a capacidade de ver o histórico do arquivo antes de renomeá-lo, pois o arquivo será tratado como um arquivo recém-adicionado.

04 Mover style.css com segurança

Na maioria dos sistemas operacionais, renomear e mover arquivos é a mesma coisa. Portanto, vamos mover nosso arquivo style.css para o diretório css, mas, desta vez, faremos isso de forma segura com o comando git mv. Esse comando garante que uma movimentação seja registrada no histórico do Git como uma movimentação.

Execute

mkdir css
git mv style.css css/style.css
git status

Resultado

$ mkdir css
$ git mv style.css css/style.css
$ git status
On branch style
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	renamed:    style.css -> css/style.css
	renamed:    hello.html -> index.html

Vamos confirmar nossas alterações e verificar o histórico de alterações no arquivo css/styles.css. Precisaremos adicionar a opção --follow para ver o histórico do arquivo antes de ele ser movido. Vamos executar as duas variantes do comando para saber a diferença.

Execute

git commit -m "Renamed hello.html; moved style.css"
git log css/style.css
git log --follow css/style.css

Resultado

$ git commit -m "Renamed hello.html; moved style.css"
[style 0ee0113] Renamed hello.html; moved style.css
 2 files changed, 0 insertions(+), 0 deletions(-)
 rename style.css => css/style.css (100%)
 rename hello.html => index.html (100%)
$ git log css/style.css
0ee0113 2023-11-28 | Renamed hello.html; moved style.css (HEAD -> style) [Alexander Shvets]
$ git log --follow css/style.css
0ee0113 2023-11-28 | Renamed hello.html; moved style.css (HEAD -> style) [Alexander Shvets]
555372e 2023-11-28 | Added css stylesheet [Alexander Shvets]