Come posso generare un diff per un singolo file tra due rami in GitHub


111

Ho bisogno di generare un diff per un singolo file che mostrerà le differenze tra due versioni, che in realtà sono tag in GitHub. Quindi voglio inviare questo diff a qualcuno via e-mail, quindi un URL GitHub per il diff sarebbe l'ideale. La visualizzazione di confronto di GitHub mi consentirà di farlo per tutti i file modificati, ma non va bene in quanto ci sono migliaia di file nel mio repository.

Posso farlo dalla riga di comando come segue, ma questo non aiuta in quanto devo inviare il diff a qualcuno tramite e-mail:

git diff tag1 tag2 -- path/to/file

Ho trovato la versione della riga di comando discussa qui: come posso vedere le differenze in un file designato tra un ramo locale e un ramo remoto?

Risposte:


90

GitHub espone solo il modo per mostrare le differenze tra due commit.

A condizione che questi tag puntino effettivamente ai commit, il formato Url sarebbe qualcosa di simile

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

Ad esempio, https://github.com/libgit2/libgit2sharp/compare/v0.9.0...v0.9.5 mostra la differenza tra due versioni del progetto LibGit2Sharp. Questa differenza include tutti i file modificati.

Se desideri recuperare un URL che ha come target un file specifico:

  • Passa alla scheda File modificati

cambiato linguetta

  • Fare clic sul pulsante Mostra statistiche differenze (questo visualizzerà l'elenco dei file modificati come collegamenti)

show-diff

  • Copia negli appunti il ​​link del file specifico che stai cercando ... e Tada! Hai finito.

Ad esempio, data la differenza di cui sopra, il collegamento https://github.com/libgit2/libgit2sharp/compare/v0.9.0...v0.9.5#diff-11 punterà alle LazyFixtures.csmodifiche avvenute tra la versione v0.9.0 e v0.9.5.

Aggiornare

Dopo il tuo commento in cui si afferma che il tuo diff è troppo grande per essere visualizzato tramite l'interfaccia Web, che ne dici di tornare al buon vecchio strumento da riga di comando? È possibile reindirizzare l'output del diff a un file e quindi inviare il file come allegato di posta elettronica.

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

8
Ciao, sembra che questo non funzionerà per me perché il mio diff è troppo grande. Ricevo "Questa differenza è grande! Stiamo mostrando le informazioni sullo stato solo per i primi 2.500 file." quindi ottengo solo le statistiche sulle differenze e non le differenze complete, anche con i collegamenti #diff.
plainflavour

1
comunque penso che tu abbia ragione - questo è il modo per farlo. Grazie
plainflavour

1
Puoi anche utilizzare questa estensione di Chrome github.com/danielribeiro/github-diff-highlight-extension per ottenere l'evidenziazione della sintassi durante il confronto dei rami.
Daniel Ribeiro

3
@plainflavour Un altro consiglio utile qui nel caso in cui ti imbatti di nuovo: ogni volta che hai un URL di confronto come @nulltoken indicato, puoi anche aggiungere un .diff alla fine dell'URL per vedere il diff completo (anche se come testo in chiaro ). Ad esempio, https://github.com/{user}/{repository}/compare/{from-tag}...{until-tag}.diff fonte
dmccabe

1
Non vedo il pulsante Mostra statistiche differenze . È andato? O semplicemente non lo vedo?
dckc

7

Ecco la mia soluzione quando si verifica il seguente problema.

Questo confronto è grande! Stiamo mostrando solo i 250 commit più recenti

Copia la visualizzazione non elaborata del file che desideri confrontare con https://gist.github.com/ . Usa i due punti di commit specifici che desideri confrontare. Inizia con il commit più vecchio.

https://gist.github.com/ ha una bella visualizzazione delle differenze side-by-side quando fai clic su "Revisioni".


3
Grazie, questo era esattamente il suggerimento di cui avevo bisogno per gist.github.com/ncoghlan/1067805fe673b3735ac854e195747493/… ! :)
ncoghlan

3

La risposta è per le persone che vogliono solo vedere (Non scaricare) la cronologia / revisione delle modifiche al codice di un file nella pagina WEB GITHUB per l'archiviazione precedente.

Vai a quel file in GitHub, quindi seleziona STORIA . Si aprirà la pagina con l'elenco dei link ai commenti di check-in come di seguito.

inserisci qui la descrizione dell'immagine Facendo clic su di esso verranno visualizzate le modifiche al codice. Dopo aver fatto clic sulla cronologia; puoi fare clic sui pacchetti per vedere a livello di pacchetto tutti i checkin dei file.

In eclipse puoi confrontare la cronologia utilizzando il plug-in EGit e "Fare clic con il pulsante destro del mouse -> Confronta con" sul file. Come posso confrontare due revisioni in git in Eclipse?


1
Solo per essere più espliciti, fai clic sul "nome" di 7 cifre esadecimali del commit (non ci sono etichette o suggerimenti quando ci passi sopra, è vicino al lato destro, proprio accanto alla "copia negli appunti" icona), e questo ti porterà a una pagina che mostra una differenza tra la versione di quel commit e quella che presumo sia la versione precedente.
JonathanZ supporta MonicaC

@Jonathan Yeah; questo è vero
Kanagavelu Sugumar

Ehi, l'ultima volta che ho guardato non ho visto quella schermata. Non so se non si stava caricando per me allora o se l'hai aggiunto da allora, ma in ogni caso grazie per la tua risposta; è ottimo.
JonathanZ supporta MonicaC

Per un commit di 5000 file, questo non mi porta al diff a file singolo. Da questa cronologia , prova a trovare il delta a quel file da questo enorme commit .
Carl Walsh

0

Ho usato la risposta di nulltoken per mettere insieme un semplice script di convenienza per tirare su un diff tra due commit su GitHub dalla riga di comando.

Puoi trovare lo script completo in sintesi , ma qui ci sono le parti positive:

# 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

Accetta come argomenti rami, commit e qualsiasi altra cosa che possa essere risolta git rev-parse. Ho usato open, che funziona solo su macOS per l'apertura di pagine Web, quindi se ti trovi in ​​un ambiente diverso ti consigliamo di modificarlo.

Come per la risposta di nulltoken, per puntare a un singolo file nel diff, dovrai fare clic sul titolo del file per far apparire la stringa di ancoraggio nella barra degli URL, che puoi quindi copiare.


qualche modo per ottenere la stringa di ancoraggio per un confronto che non mostra il file desiderato perché ce ne sono troppi?
sgarg

@sgarg L'ancora è "diff- <md5 of the filename>" - non documentato AFAIK - ma mi ha infastidito e l'ho indovinato.
Ben Walding,

0

Dal momento che questo non è ancora possibile, ecco un metodo di strumenti diff basato su browser. Non sfrutta l'automazione ma richiede solo la possibilità di installare estensioni di Chrome:

  1. Installa Diff Tools per i browser Chrome: https://chrome.google.com/webstore/detail/diff-tools-text-pdf-doc-o/lkcdojpmjehlniamnglpjlldkoonlomb
  2. Apri Strumenti Diff ( http://iblogbox.com/devtools/diff/ )
  3. Da GitHub vai a PRIMA commit, tag o branch, apri il file, quindi fai clic sul Rawpulsante per ottenere la visualizzazione del file raw, seleziona tutto e copia, quindi inserisci la casella di testo a sinistra in Strumenti Diff
  4. Ripetere il passaggio 3 ma per il file DOPO e incollare nella casella a destra in Strumenti di confronto
  5. Fare clic Compare Nowed eseguire il diff ad-hoc
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.