Acabei de enfrentar uma situação que me parece ilógica com o Git. Eu tenho um repositório com muitos commits, então neste estágio ele tem apenas um branch (mestre).
Suponha que este branch tenha um arquivo chamadoMeuArquivo.txt. Agora preciso criar um branch diferente porque quero fazer algumas alterações em alguns arquivos e não quero fazer isso master branch diretamente, então executo:
git checkout iss53
Agora o esquema fica assim:
Tudo bem, mudei para branchiss53, eu corro ls -l
e oMeuArquivo.txt. Uma das mudanças inclui a exclusão doMeuArquivo.txtarquivo, então:
git rm MyFile.txt
Legal, correr ls -l
de novo mostra que não háMeuArquivo.txtnão mais. Então eu volto para omestrefilial:
git checkout master
Mas oMeuArquivo.txtarquivo também desapareceu. Minha lógica diz que se eu excluí o arquivo em uma ramificação, ele deve ser aplicadoapenaspara esse branch, então por que o arquivo foi excluído domestreramo também? Observe que ainda não fiz nenhum commit, apenas ramificando.
Observação: Ambas as imagens são tiradas deGit-scm.
Responder1
A resposta está na sua pergunta:
Observe que ainda não fiz nenhum commit, apenas ramificando.
Se você não confirmar, as alterações serão sempre mantidas em seu diretório de trabalho. Mudar de branch não afeta seu diretório de trabalho, e o diretório de trabalho também não afeta seu último commit. Você está vendo que o arquivo foi excluído, mas a realidade é que ele foi excluído apenas do seu diretório de trabalho. Se você quiser limpar as alterações e retornar ao último commit use este comando:
git reset --hard HEAD
Portanto, o arquivo será restaurado novamente.
Talvez não seja lógico para você, mas esse comportamento pode ser útil. Imagine que você tem 2 ramificações: master
e development
, e você deve sempre trabalhar development
antes de mover as alterações para master
. Digamos que você esqueceu de mudar para development
antes de começar a trabalhar, então - antes de se comprometer - você percebeu que está no master
. A solução é simples, basta mudar para development
e depois confirmar.
Responder2
Sempre que removi um arquivo de uma de minhas ramificações (que chamei de login), ele não foi removido da ramificação master.
- Mudei para o branch de login
git checkout login
- Arquivo test.html removido
git rm --cached test.html
- Adicionado tudo à área de teste
git add .
- Confirmou as mudanças com
git commit -m 'removed test.html file'
- Empurrou o repositório local para o repositório remoto do Github com
git push