Como posso gerar um diff para um único arquivo entre duas ramificações no github


111

Eu preciso gerar um diff para um único arquivo que mostrará as diferenças entre as duas versões, que na verdade são tags no github. Eu então quero enviar este diff para alguém por e-mail, então uma URL do github para o diff seria o ideal. A visualização de comparação do github me permite fazer isso para todos os arquivos alterados, mas isso não é bom, pois há milhares de arquivos em meu repo.

Posso fazer isso na linha de comando da seguinte maneira, mas isso não ajuda, pois preciso enviar o diff para alguém por e-mail:

git diff tag1 tag2 -- path/to/file

Encontrei a versão da linha de comando discutida aqui: como posso ver as diferenças em um arquivo designado entre uma filial local e uma filial remota?

Respostas:


90

O GitHub apenas expõe a maneira de mostrar diferenças entre dois commits.

Desde que essas tags realmente apontem para commits, o formato do Url seria algo como

https://github.com/{user}/{repository}/compare/{from-tag}...{until-tag}

Como exemplo, https://github.com/libgit2/libgit2sharp/compare/v0.9.0...v0.9.5 mostra a diferença entre duas versões do projeto LibGit2Sharp. Este diff inclui todos os arquivos modificados.

Se você deseja recuperar um url que visa um arquivo específico:

  • Mude para a guia Arquivos Alterados

guia alterada

  • Clique no botão Show Diff Stats (Isso exibirá a lista de arquivos modificados como links)

show-diff

  • Copie para a área de transferência o link do arquivo específico que você está procurando ... e Tada! Você Terminou.

Por exemplo, dada a diferença acima, o link https://github.com/libgit2/libgit2sharp/compare/v0.9.0...v0.9.5#diff-11 apontará para as LazyFixtures.csmudanças que ocorreram entre a versão v0.9.0 e v0.9.5.

Atualizar

Seguindo seu comentário que afirma que seu diff é muito grande para ser renderizado através da interface da Web, que tal reverter para as boas e velhas ferramentas de linha de comando? Você pode redirecionar a saída do diff para um arquivo e, em seguida, enviar o arquivo como um anexo de e-mail.

$ git diff v0.9.0 v0.9.5 -- LibGit2Sharp.Tests/LazyFixture.cs > /tmp/lazyfixture.diff

8
Olá, parece que isso não funcionará comigo porque meu diff é muito grande. Estou recebendo "Esta diferença é grande! Estamos exibindo informações de status apenas para os primeiros 2.500 arquivos." então eu só obtenho os Diff Stats e não os diffs completos, mesmo com os links #diff.
plainflavour

1
no entanto, acho que você está certo - é assim que se faz. Obrigado
plainflavour

1
Você também pode usar esta extensão do Chrome github.com/danielribeiro/github-diff-highlight-extension para obter destaque de sintaxe ao comparar ramos.
Daniel Ribeiro

3
@plainflavour Mais uma dica útil aqui, caso você encontre isso novamente - sempre que você tiver uma URL de comparação como @nulltoken apontada, você também pode adicionar um .diff ao final da URL para ver a diferença completa (embora como texto simples ) Ex: https://github.com/{user}/{repository}/compare/{from-tag}...{until-tag}.diff Fonte
dmccabe

1
Não vejo o botão Show Diff Stats . Ele se foi? Ou eu simplesmente não estou vendo?
dckc

7

Aqui está minha solução alternativa quando o seguinte problema se aplica.

Essa comparação é grande! Estamos mostrando apenas os 250 commits mais recentes

Copie a visualização bruta do arquivo que deseja comparar com https://gist.github.com/ . Use os dois pontos de confirmação específicos que você deseja comparar. Comece com o commit mais antigo.

https://gist.github.com/ tem uma bela visualização de comparação lado a lado quando você clica em 'Revisões'.


3
Obrigado, esta era exatamente a sugestão de que eu precisava para gist.github.com/ncoghlan/1067805fe673b3735ac854e195747493/… ! :)
ncoghlan

3

A resposta é para pessoas que desejam apenas ver (não fazer download) o histórico / revisão das alterações de código de um arquivo na página da WEB do GITHUB para o check-in anterior.

Acesse esse arquivo no github e selecione HISTÓRICO . Isso abrirá a página com a lista de links de comentários de check-in como abaixo.

insira a descrição da imagem aqui Ao clicar nele, serão mostradas as alterações do código. Depois de clicar no histórico; você pode clicar nos pacotes para ver os check-ins de todos os arquivos no nível do pacote.

No eclipse, você pode comparar o histórico usando o plugin EGit e "Clique com o botão direito -> Comparar com" no arquivo. Como posso comparar duas revisões no git no Eclipse?


1
Só para ser mais explícito, você clica no "nome" de 7 dígitos hexadecimais do commit (não há rótulo ou dica de ferramenta quando você passa o mouse sobre ele, está próximo ao lado direito, ao lado de "copiar para a área de transferência" ícone), e isso o levará a uma página que mostra uma diferença entre a versão do commit e o que eu suponho ser a versão anterior.
JonathanZ apoia MonicaC de

@Jonathan Sim; isso é verdade
Kanagavelu Sugumar

Ei, eu não vi aquela captura de tela da última vez que olhei. Não sei se simplesmente não estava carregando para mim na época ou se você adicionou desde então, mas de qualquer forma, obrigado pela sua resposta; é ótimo.
JonathanZ apoia MonicaC de

Para um commit de 5000 arquivos, isso não me leva à diferença de arquivo único. A partir desse histórico , tente encontrar o delta para esse arquivo a partir deste enorme commit .
Carl Walsh

0

Eu usei a resposta do nulltoken para montar um script de conveniência simples para puxar uma diferença entre dois commits no GitHub a partir da linha de comando.

Você pode encontrar o script completo no gist , mas aqui estão as partes boas:

# Parse the following patterns for repo urls to get the github repo url
# https://github.com/owner/repo-name.git
# git@github.com:owner/repo-name.git
BASE_URL="https://github.com/""$(git config --get remote.origin.url | sed 's/.*github\.com[/:]\(.*\).git/\1/')""/compare"

if [[ "$#" -eq 1 ]]; then
  if [[ "$1" =~ .*\.\..* ]]; then
    # Handle "git hubdiff fromcommit..tocommit"
    open "${BASE_URL}/$(git rev-parse "${1/\.\.*/}")...$(git rev-parse ${1/*\.\./})"
  else
    # Handle "git hubdiff fromcommit"
    open "${BASE_URL}/$(git rev-parse "$1")...$(git rev-parse HEAD)"
  fi
elif [[ "$#" -eq 2 ]]; then
  # Handle "git hubdiff fromcommit tocommit"
  open "${BASE_URL}/$(git rev-parse "$1")...$(git rev-parse "$2")"
fi

Ele aceita como argumentos branches, commits e qualquer outra coisa que possa ser resolvida por git rev-parse. Eu usei open, que só funciona no macOS para abrir páginas da web, então se você estiver em um ambiente diferente, você vai querer ajustar isso.

Tal como acontece com a resposta do nulltoken, para apontar para um único arquivo no diff, você terá que clicar no título do arquivo para fazer a string âncora aparecer na barra de url, que você pode copiar.


alguma forma de obter a string âncora para uma comparação que não mostra o arquivo desejado porque há muitos deles?
sgarg de

@sgarg A âncora é "diff- <md5 of the filename>" - AFAIK não documentado - mas me irritou e adivinhei.
Ben Walding

0

Como isso ainda não é possível, aqui está um método de ferramenta de comparação baseado em navegador. Não aproveita a automação, mas requer apenas a capacidade de instalar extensões do Chrome:

  1. Instale o Diff Tools para navegadores Chrome: https://chrome.google.com/webstore/detail/diff-tools-text-pdf-doc-o/lkcdojpmjehlniamnglpjlldkoonlomb
  2. Open Diff Tools ( http://iblogbox.com/devtools/diff/ )
  3. No GitHub, vá para ANTES do commit, tag ou branch, abra o arquivo, clique no Rawbotão para obter a visualização do arquivo bruto, selecione tudo e copie e coloque na caixa de texto do lado esquerdo em Ferramentas de Comparação
  4. Repita a etapa 3, mas para o arquivo AFTER e cole na caixa do lado direito em Ferramentas de Comparação
  5. Clique Compare Nowe execute sua comparação ad-hoc
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.