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

6

Eu tenho 2 pastas A e B no meu diretório de arquivos que se conectam ao mesmo repositório Git.

Eu criei um arquivo na pasta A chamado "index.html". Eu então crio um arquivo diferente também chamado de "index.html" na pasta B. Eu então adiciono "index.html" na pasta B, commit, e envio o conteúdo de B.

Quando eu pego da pasta A, o Git afirma que meus arquivos já estão "atualizados". No entanto, ambas as pastas têm claramente arquivos "index.html" diferentes. O que está acontecendo?

    
por David Faux 25.04.2012 / 22:04

4 respostas

7
A tarefa de

git pull é fetch new commits e merge na ramificação atual. Se a ramificação atual não estiver desatualizada em comparação com a que 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 as ramificações, não com a árvore de trabalho - ele comentará sobre a árvore de trabalho somente se houver alterações que interfiram na mesclagem.

Sua descrição é insuficiente para explicar por que ela não está se opondo ao index.html existente, mas você não deve aceitar Already up-to-date. como significando que o git pensa 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 de commit e a relação com a ramificação upstream de cada ramificação) ou gitk --all para uma visualização gráfica de todas as confirmações.

    
por 26.04.2012 / 03:48
2

Se eu entendi corretamente, o script a seguir deve reproduzir seu problema:

mkdir test
cd test
git init --bare test.git
git clone test.git a
git clone test.git b
echo a > a/index.html
echo b > b/index.html
cd b
git add index.html
git commit -m add
git push origin master
cd ../a
git pull

O último git pull imprime:

remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/cyrus/tmp/test/test
 * [new branch]      master     -> origin/master

E o conteúdo de index.html foi sobrescrito silenciosamente:

cyrus:~/tmp/test/a$ cat index.html
b
    
por 25.04.2012 / 23:05
0

Lembre-se de uma coisa sobre git - rastreia conteúdo, não arquivos .

Internamente, todo o conteúdo mantido pelo repositório é um blob em algum lugar. O que você considera ser um arquivo, git considera um nome apontando para um blob. O que você considera ser dois arquivos com o mesmo conteúdo, git considera dois nomes vinculados ao mesmo blob. Então, como nenhum dos blobs foi alterado, o repositório não mudou.

Você espera que o git funcione como seu sistema de arquivos (ou talvez como a maioria dos outros sistemas de controle de versão) - git é realmente mais eficiente em termos de espaço nesse quesito. O livro explica muito bem esse conceito - especificamente, o Git Object Model .

    
por 25.04.2012 / 22:27
0

Parece que você está acostumado com o SVN, no qual pastas diferentes (ou até mesmo arquivos, não sabem) podem ser verificações 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.

    
por 26.04.2012 / 01:17

Tags