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".


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.)


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.


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

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.


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.


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.


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)

O 'gtp' precisa ser executado na raiz do repositório local, onde o .git está localizado.
AX Labs

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.