Git: Como verificar se um repo local está atualizado?

85

Gostaria de saber se meu repositório local está atualizado (e se não, de preferência, gostaria de ver as alterações).

Como posso verificar isso sem fazer git fetchou git pull?

Misha Moroshko
fonte

Respostas:

96

Experimente git fetch --dry-run O manual ( git help fetch) diz:

--dry-run
Show what would be done, without making any changes.
Philip Oakley
fonte
3
Obrigado! Porém, é difícil entender pela saída quais arquivos foram adicionados / modificados / removidos.
Misha Moroshko,
1
Você pode ver quais tags são atualizadas e o intervalo de confirmação start..end para os vários branches. Se isso não for suficiente, faça-o como uma busca apropriada (não puxada) que lhe dará uma cópia local separada e apropriada do remoto, sem afetar seu próprio trabalho de branch. Um pull tentaria mesclar os dois, o que não é o que você deseja. A transferência de dados é a mesma se você executar --secar ou não.
Philip Oakley
4
porque é que quando eu corro git fetch --dry-runnada aparece?
Paramvir Singh Karwal de
3
@ParamvirSinghKarwal Git é esparso no que relata. Se não há nada a dizer, nada diz, como se nada tivesse acontecido. Talvez você esteja atualizado quanto ao refspec de sua busca regular. Talvez adicionar --all?
Philip Oakley
2
@AaronBeall Se for esse o caso, então provavelmente significa que você já obteve essas alterações localmente (portanto, nada para buscar), mas ainda não as fundiu em seu branch. git pullé aproximadamente equivalente a a git fetch && git merge. Se, em qualquer ponto, você executou a busca sem o --dry-run, então você já obteve as coisas localmente.
DuckPuppy
36
git remote show origin

Resultado:

HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (local out of date) <-------
Jim Smith
fonte
Isso lista os ramos de todos os tempos. Se você tem um repositório com um longo histórico, a saída é um tanto confusa.
Paulo Carvalho
28

Primeiro uso git remote update, para atualizar seus refs remotos. Em seguida, você pode fazer uma de várias coisas, como:

  1. git status -unodirá se o ramo que você está rastreando está à frente, atrás ou se divergiu. Se não disser nada, o local e o remoto são iguais. Resultado da amostra:

Na filial DEV

Seu branch está atrás de 'origin / DEV' por 7 commits, e pode ser acelerado.

(use "git pull" para atualizar seu branch local)

  1. git show-branch *master irá mostrar os commits em todos os branches cujos nomes terminam em 'master' (por exemplo, master e origin / master).

Se você usar -vcom git remote update ( git remote -v update), poderá ver quais branches foram atualizados, então você realmente não precisa de mais comandos.

Piyush Agarwal
fonte
2
Por que isso está tão baixo? git remote update ; git status -unoResolvi-o. git fetch --dry-runnão deu saída, mesmo nos casos em que o local estava atrás do remoto.
Aaron Beall
17

você pode usar git status -unopara verificar se sua filial local está em dia com a de origem.

Flowdee
fonte
19
Fornece apenas o status local, sem verificar com a ramificação remota.
Ishan Liyanage
4
Só dá local, mas deu git remote update ; git status -unocerto! Não git fetch --dry-rundeu saída quando eu esperava (e git pullpuxaria as coisas).
Aaron Beall
1
Esta resposta está errada e deve ser excluída. Do jeito que está, perpetua um mito muito comum, mas errado, sobre como o Git funciona, que só é dissipado quando / se alguém decide ler os comentários sobre ele.
Prometheus
8

Não realmente - mas não vejo como git fetchfaria mal, pois não mudará nenhuma das suas filiais locais.

Niclas Kirschmeier
fonte
Concordo plenamente com isso. Git pull pode ser prejudicial, sobrescrever arquivos. Mas git fetch puxa apenas os metadados, permitindo que comandos como git status lhe digam se seu repositório local está atualizado ou não, sem sobrescrever nenhum arquivo. Pode não responder à letra da pergunta, mas responde ao espírito da pergunta, fornecendo a ferramenta que você deseja. Git fetch, então git status irá dizer onde seu repositório local está em relação ao remoto sem sobrescrever arquivos.
merlit64 de
5

Outra alternativa é ver o status do branch remoto usando git show-branch remote/branchpara usá-lo como uma comparação que você pode ver git show-branch *branchpara ver o branch em todos os remotos, bem como no seu repositório! verifique esta resposta para mais https://stackoverflow.com/a/3278427/2711378

Amanuel Nega
fonte
5

Você precisará emitir dois comandos:

  1. git fetch origin
  2. git status
user3695833
fonte
1
Isso funciona, mas a pergunta diz claramente sem 'buscar'. Há muitos casos em que você deseja saber como o repo local é diferente do repo remoto sem realmente buscar ou mesclar as alterações.
pedram bashiri
1
@pedrambashiri Estou genuinamente curioso, tipo o quê? Que eu saiba, um fetch sozinho nunca pode prejudicar nada.
Prometheus
@Prometheus a primeira coisa, eu só queria apontar que quando uma pergunta afirma claramente 'sem buscar' você simplesmente não pode usar buscar em sua resposta, se não houver outra maneira de fazer isso, ou nenhum caso real para fazê-lo sem, isso precisa a ser explicado na resposta. Mas, para responder à sua pergunta, uma busca atualiza sua cópia local do repositório remoto. Veja o diagrama nesta postagem blog.osteele.com/2008/05/my-git-workflow
pedram bashiri
4

Você deve executar git fetchantes de comparar seu repositório local com os arquivos em seu servidor remoto.

Este comando apenas atualiza seus ramos de rastreamento remoto e não afetará sua árvore de trabalho até que você chame git mergeou git pull.

Para ver a diferença entre seu branch local e seu branch de rastreamento remoto, uma vez que você tenha obtido, você pode usar git diff ou git cherry como explicado aqui.

Braitsch
fonte
2

Se você usar

git fetch --dry-run -v <link/to/remote/git/repo>

você receberá feedback sobre se ele está atualizado. Então, basicamente, você só precisa adicionar a opção "detalhada" à resposta dada antes.

Don Davis
fonte
1

Isso é impossível sem usar git fetchou git pull. Como você pode saber se o repositório está ou não "atualizado" sem ir ao repositório remoto para ver o que "atualizado" significa?

Jörg W Mittag
fonte
5
Por favor, confirme isso! Você acabou de responder o que pensa! Você deve ter mais cuidado, pois os novatos vão cair com ele!
Amanuel Nega
4
@AmanuelNega: Isso é apenas uma lógica básica. Se você deseja saber se seu repo local está no mesmo estado que o repo remoto, você precisa saber o estado do repo remoto. Período. Se você não souber o estado do repo remoto, não será possível saber se o repo local está no mesmo estado. Observe que a resposta mais votada e aceita usa git pull, o que o OP proíbe explicitamente em sua pergunta.
Jörg W Mittag
2
Ser informado! git status -unoisso funciona e também se pode usar git show-branch *masterpara ver o status de todos os ramos principais! Você ainda está dizendo que é impossível? Você pode ver o status de qualquer branch, desde que tenha acesso ao controle remoto!
Amanuel Nega
2
@AmanuelNega: git statusapenas informa o status de seus árbitros locais, não informa se seus árbitros locais estão atualizados com os árbitros remotos. Novamente: é simplesmente logicamente impossível saber qual é o estado do repo remoto sem obter o estado do repo remoto. Período. Estas são apenas as leis básicas do espaço-tempo.
Jörg W Mittag
6
Não é "logicamente" impossível, já que evidentemente alguém poderia ligar para alguém na sala do servidor e dizer: "qual é o hash do seu HEAD no branch master", eles poderiam lhe dizer e então você poderia verificar o local e ver se você não não tem esse hash. Agora você sabe que eles estão fora de sincronia.
James Robinson
1

tentei formatar minha resposta, mas não consegui. Por favor, equipe stackoverflow, por que postar uma resposta é tão difícil.

no entanto,

resposta:
git fetch origin
git status (você verá resultados como "Seu branch está atrás de 'origin / master' por 9 commits")
para atualizar para alterações remotas: git pull

adarsh
fonte