Como posso gerar um git diff do que mudou desde a última vez que puxei?
Pergunta
Gostaria de criar um script, de preferência em rake, das seguintes ações em um único comando:
- Obtenha a versão do meu repositório git local.
- Git extraia o código mais recente.
- Git difere da versão que extraí na etapa 1 para o que está agora em meu repositório local.
Em outras palavras, quero obter o código mais recente do repositório central e gerar imediatamente uma comparação do que mudou desde a última vez que extraí.
Solução
Você poderia fazer isso simplesmente com refspecs.
git pull origin
git diff @{1}..
Isso lhe dará uma comparação do branch atual como ele existia antes e depois do pull.Observe que se o pull não atualizar realmente o branch atual, o diff fornecerá resultados errados.Outra opção é registrar explicitamente a versão atual:
current=`git rev-parse HEAD`
git pull origin
git diff $current..
Eu pessoalmente uso um alias que simplesmente me mostra um log, na ordem inversa (ou seja,do mais antigo para o mais novo), sem mesclagens, de todos os commits desde meu último pull.Eu executo isso toda vez que meu pull atualiza o branch:
git config --global alias.lcrev 'log --reverse --no-merges --stat @{1}..
Outras dicas
de Greg maneira deve funcionar (não eu, outro Greg: P).Em relação ao seu comentário, origin é uma variável de configuração definida pelo Git quando você clona o repositório central para sua máquina local.Essencialmente, um repositório Git lembra de onde veio.Você pode, no entanto, definir essas variáveis manualmente se precisar usando git-config.
git config remote.origin.url <url>
onde url é o caminho remoto para seu repositório central.
Aqui está um exemplo de arquivo em lote que deve funcionar (não testei).
@ECHO off
:: Retrieve the changes, but don't merge them.
git fetch
:: Look at the new changes
git diff ...origin
:: Ask if you want to merge the new changes into HEAD
set /p PULL=Do you wish to pull the changes? (Y/N)
IF /I %PULL%==Y git pull
Isso é muito semelhante a uma pergunta que fiz sobre como obter alterações em um branch no git.Observe que o comportamento de git diff vs.git log é inconsistentemente diferente ao usar dois pontos vs.três pontos.Mas, para sua aplicação você pode usar:
git fetch
git diff ...origin
Depois disso, um git pull
irá mesclar as alterações em seu HEAD.
Se você colocar isso em seu perfil bash, poderá executar o grin (git remote incoming) e o grout (git remote outgoing) para ver diferenças de commits que são recebidos e enviados para o origin master.
function parse_git_branch {
git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}
function gd2 {
echo branch \($1\) has these commits and \($2\) does not
git log $2..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}
function grin {
git fetch origin master
gd2 FETCH_HEAD $(parse_git_branch)
}
function grout {
git fetch origin master
gd2 $(parse_git_branch) FETCH_HEAD
}