Por que o Git está notando falsamente que meus arquivos estão atualizados?

Por que o Git está notando falsamente que meus arquivos estão atualizados?

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.htmlna pasta B. Em seguida, adiciono index.htmla 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.htmlarquivos diferentes. O que está acontecendo?

Responder1

git pullO trabalho de é fazer fetchnovos commits e mergecolocá-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 pullestá 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 statuspara 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 --allpara 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 pullimpressõ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.htmlfoi 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 gitconsidera 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) - gitna 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.

informação relacionada