
Tenho duas pastas – A e B – em meu diretório de arquivos que estão vinculadas ao mesmo repositório Git.
Criei um arquivo na pasta A chamado index.html
. Em seguida, crio um arquivo diferente, também chamado index.html
na pasta B. Em seguida, adiciono index.html
a pasta B, confirmo e envio o conteúdo de B.
Quando retiro da pasta A, o Git afirma que meus arquivos "Já estão atualizados". No entanto, ambas as pastas possuem claramente index.html
arquivos diferentes. O que está acontecendo?
Responder1
git pull
O trabalho de é fazer fetch
novos commits e merge
colocá-los no branch atual. Se o branch atual não estiver desatualizado em comparação com aquele de onde você extraiu, pull diráAlready up-to-date.
mesmo se você tiver alterações locais em seu diretório de trabalho. git pull
está preocupado com ramificações, não com a árvore de trabalho — ele comentará sobre a árvore de trabalho somente se houver alterações que interfiram na fusão.
Sua descrição é insuficiente para explicar por que não está se opondo ao existente index.html
, mas você não deve interpretar isso Already up-to-date.
como se o git pensasse que você não tem alterações. Em vez disso, use git status
para obter um resumo.
Para entender o estado de suas ramificações, git branch -v
é útil (mostra o ID do commit e a relação com a ramificação upstream de cada ramificação), ou gitk --all
para uma visualização gráfica de todos os commits.
Responder2
Se bem entendi, o script a seguir deve reproduzir seu problema:
teste mkdir teste de cd git init --bare test.git git clone teste.git a git clone teste.git b echo a > a/index.html eco b > b/index.html cd-b git adicionar index.html git commit -m adicionar git push mestre de origem CD ../a puxa
As últimas git pull
impressões:
remoto: Contando objetos: 3, pronto. remoto: Total 3 (delta 0), reutilizado 0 (delta 0) Desempacotando objetos: 100% (3/3), pronto. De /home/cyrus/tmp/test/test * [nova filial] mestre -> origem/mestre
E o conteúdo de index.html
foi substituído silenciosamente:
cyrus:~/tmp/test/a$ cat index.html b
Responder3
Lembre-se de uma coisa sobre git
-ele rastreia conteúdo, não arquivos.
Internamente, todo o conteúdo que o repositório mantém é umbolhaem algum lugar. O que você considera um arquivo git
é considerado um nome apontando para um blob. O que você considera dois arquivos com o mesmo conteúdo git
considera dois nomes vinculados ao mesmo blob. Portanto, como nenhum dos blobs mudou, o repositório não mudou.
Você espera que o git funcione como o seu sistema de arquivos (ou talvez como a maioria dos outros sistemas de controle de versão) - git
na verdade, é mais eficiente em termos de espaço nesse aspecto.O livroexplica muito bem esse conceito - especificamente, oModelo de objeto Git.
Responder4
Parece que você está acostumado com o SVN, onde diferentes pastas (ou mesmo arquivos, não sei) podem ser checkouts de diferentes revisões.
Isso não é possível com o git. Independentemente da pasta em que você está, em um commit ou checkout (que também é a etapa final de um pull bem-sucedido), atue em todos os arquivos de trabalho, independentemente da pasta em que você está atualmente.