Como visualizar git-pull sem fazer busca?

204

Isso é possível?

Basicamente, há um repositório remoto a partir do qual puxo usando apenas:

git pull

Agora, eu gostaria de visualizar o que essa atração mudaria (um diff) sem tocar em nada do meu lado. O motivo é que o que estou puxando pode não ser "bom" e quero que outra pessoa o conserte antes de deixar meu repositório "sujo".

Milan Babuškov
fonte
4
Sua edição é estranha. Fazer uma "busca do git" não altera sua árvore de trabalho de forma alguma, por isso não importa se você possui alterações locais não confirmadas. E não está claro por que parte da busca você deseja desfazer, pois não toca na sua árvore de trabalho.
Dkagedal 08/08/08
Obrigado dkagedal, escrevi isso antes de entender completamente como o Git funciona. Eu removi essa edição.
Milan Babuškov

Respostas:

234

Depois de fazer a git fetch, faça a git log HEAD..origin/masterpara mostrar as entradas de log entre o último commit comum e a ramificação principal da origem. Para mostrar as diferenças, use git log -p HEAD..origin/masterpara mostrar cada patch ou git diff HEAD...origin/master(três pontos e não dois) para mostrar uma única diferença.

Há, normalmente, não há qualquer necessidade de desfazer uma busca, porque fazer uma busca só atualiza as remotas ramos e nenhum de seus ramos. Se você não estiver preparado para fazer pull e mesclar todas as confirmações remotas, poderá usar git cherry-pickpara aceitar apenas as confirmações remotas específicas que deseja. Mais tarde, quando você estiver pronto para obter tudo, um git pullserá mesclado no restante dos commits.

Atualização: Não sei bem por que você deseja evitar o uso do git fetch. Tudo o que o git fetch faz é atualizar sua cópia local das ramificações remotas. Essa cópia local não tem nada a ver com nenhuma de suas ramificações e não tem nada a ver com alterações locais não confirmadas. Eu ouvi falar de pessoas que executam git fetch em um trabalho cron porque é muito seguro. (Normalmente, eu não recomendaria isso.)

Greg Hewgill
fonte
Acho que perdi essa parte do 'nada a ver com os meus ramos' enquanto lia os documentos. Obrigado.
Milan Babuškov 8/10/08
1
Por alguma razão que não funciona para mim. Eu tentei git diff HEAD ... origin / master e ele não listou nenhuma alteração ainda quando eu 'puxo o master de origem' busca e mescla as alterações. Isso é porque eu configurei o repositório remoto usando o git remote add?
screenm0nkey
@ screenm0nkey: Não sei (sem saber mais informações). Eu recomendo abrir uma nova pergunta para perguntar sobre isso, se você ainda não tiver certeza.
Greg Hewgill 30/09/11
1
O que funciona para mim (após o git fetch): git log origem / master
slaman
2
git diff ...@{u}é o mesmo que git diff HEAD...origin/masterse a origem / master é o ramo a montante
cambunctious
47

Eu acho que o git fetch é o que você está procurando.

Ele puxará as alterações e os objetos sem enviá-los ao índice do repo local.

Eles podem ser mesclados posteriormente com o git merge .

Página do Homem

Editar: Explicações adicionais

Direto do curso de colisão Git-SVN link

Agora, como você obtém novas alterações em um repositório remoto? Você os busca:

git fetch http://host.xz/path/to/repo.git/ 

Nesse ponto, eles estão no seu repositório e você pode examiná-los usando:

git log origin 

Você também pode diferenciar as alterações. Você também pode usar o git log HEAD..origin para ver apenas as alterações que você não possui em sua ramificação. Então, se você deseja mesclá-los, faça:

git merge origin

Observe que, se você não especificar uma ramificação para buscar, ela será padronizada convenientemente para o controle remoto.

A leitura da página de manual honestamente fornecerá o melhor entendimento das opções e como usá-las.

Estou apenas tentando fazer isso com exemplos e memória, atualmente não tenho uma caixa para testar. Você deve olhar para:

git log -p //log with diff

Uma busca pode ser desfeita com git reset --hard ( link ), no entanto, todas as alterações não confirmadas em sua árvore serão perdidas, bem como as alterações que você buscou.

Brian Gianforcaro
fonte
Se você explicar duas coisas, isso pode ser bom: 1. como faço para desfazer o git-fetch? 2. Como vejo o diff?
Milan Babuškov 7/10/08
1
1) desfazendo o git-fetch? 2) git diff HEAD .. original
Chris Vest
O diff é feito como Christian disse, uma busca pode ser desfeita com o git reset --hard, porém todas as alterações não confirmadas em sua árvore serão perdidas, assim como as alterações que você buscou.
Brian Gianforcaro 7/10/08
Você está procurando git reset --softou --mixed? Verifique a página de manual.
Aristóteles Pagaltzis 19/10/08
1
Se eu entendi direito, não há necessidade de desfazer uma "busca do git" porque ela não toca sua cópia de trabalho e também seu repositório. "git fetch" armazena objetos e referências em .git / FETCH_HEAD
Thorsten Niehues
21

Você pode buscar em um repositório remoto, ver as diferenças e depois puxar ou mesclar.

Este é um exemplo de um repositório remoto chamado origine de uma ramificação chamada masterrastreamento da ramificação remota origin/master:

git checkout master                                                  
git fetch                                        
git diff origin/master
git pull --rebase origin master
Antonio Bardazzi
fonte
8

Criei um alias git personalizado para fazer isso por mim:

alias.changes=!git log --name-status HEAD..

com isso você pode fazer isso:

$git fetch
$git changes origin

Isso fornecerá uma maneira fácil e agradável de visualizar as alterações antes de fazer um merge.

Matthias
fonte
você é Deus. isto deve vir dentro git si
Z. Khullah
3

Eu uso esses dois comandos e posso ver os arquivos para mudar.

  1. Primeira execução do git fetch , ele fornece uma saída como esta (parte da saída):

    ...
    72f8433..c8af041 develop -> origin / develop
    ...

Essa operação fornece dois IDs de confirmação, o primeiro é o antigo e o segundo será o novo.

  1. Em seguida, compare esses dois commits usando git diff

    git diff 72f8433..c8af041 | grep "diff --git"

Este comando listará os arquivos que serão atualizados:

diff --git a/app/controller/xxxx.php b/app/controller/xxxx.php
diff --git a/app/view/yyyy.php b/app/view/yyyy.php

Por exemplo, app / controller / xxxx.php e app / view / aaaa.php serão atualizados.

A comparação de duas confirmações usando o git diff imprime todos os arquivos atualizados com linhas alteradas, mas com o grep ele pesquisa e obtém apenas as linhas que contêm diff --git da saída.

cowboycb
fonte
3

Posso estar atrasado para a festa, mas isso é algo que me incomodou por muito tempo. Na minha experiência, eu gostaria de ver quais alterações estão pendentes do que atualizar minha cópia de trabalho e lidar com essas alterações.

Isso vai no ~/.gitconfigarquivo:

[alias]
        diffpull=!git fetch && git diff HEAD..@{u}

Ele busca a ramificação atual e faz uma diferença entre a cópia de trabalho e essa ramificação buscada. Portanto, você deve ver apenas as mudanças que viriam git pull.

Andy P
fonte
1
Você poderia trocar a string ref por HEAD..@{u}? É mais simples e não exige que o controle remoto seja nomeado "origem" ou que sua ramificação seja nomeada da mesma forma que no controle remoto.
Michael - Onde está Clay Shirky
Este é um alias bem feito, mas não sei por que você desejaria fazer isso em primeiro lugar. Você vai ter que lidar com as mudanças em algum momento, certo? Você poderá abortar a parte de mesclagem git pullse não gostar do que está fazendo ... portanto, não tenho certeza de qual é o caso de uso para isso.
Marnen Laibow-Koser
Eu sei que tenho que lidar com as mudanças em algum momento, mas, como escrevi, às vezes não quero. Eu só quero saber se algo vai quebrar e eu tenho que reservar um pouco mais de tempo para isso - ou se eu puder fazer isso git pulldepois. Também acho que é disso que se trata a questão do op.
Andy P
-1

Se você não quiser que o git-fetch atualize seu .git local, copie seu repositório local para um diretório temporário e faça um puxão para lá. Aqui está uma mão curta:

$ alias gtp="tar -c . | (cd /tmp && mkdir tp && cd tp && tar -x && git pull; rm -rf /tmp/tp)"

Ex.:

$ git status
# On branch master
nothing to commit (working directory clean)

$ gtp
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master
Updating 32d61dc..05287d6
Fast-forward
 subdir/some.file       |    2 +-
 .../somepath/by.tes    |    3 ++-
 .../somepath/data      |   11 +++++++++++
 3 files changed, 14 insertions(+), 2 deletions(-)

$ git status
# On branch master
nothing to commit (working directory clean)

$ git fetch
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master

$ git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
#
nothing to commit (working directory clean)
AX Labs
fonte
O 'gtp' precisa ser executado na raiz do repositório local, onde o .git está localizado.
AX Labs
-2

Que tal clonar o repositório em outro lugar e fazer git log no checkout real e no novo clone para ver se você conseguiu a mesma coisa.

Ed Greenberg
fonte
Uma cópia local reflete melhor o estado do que outro clone. Veja meu post principal para detalhes .
AX Labs