Wie kann ich ein Diff für eine einzelne Datei zwischen zwei Zweigen in Github generieren?

110

Ich muss ein Diff für eine einzelne Datei generieren, das die Unterschiede zwischen zwei Versionen zeigt, die tatsächlich Tags in Github sind. Ich möchte dieses Diff dann per E-Mail an jemanden senden, daher wäre eine Github-URL für das Diff ideal. Die Github-Vergleichsansicht ermöglicht es mir, dies für alle geänderten Dateien zu tun, aber das ist nicht gut, da sich in meinem Repo Tausende von Dateien befinden.

Ich kann dies in der Befehlszeile wie folgt tun, aber das hilft nicht, da ich den Diff per E-Mail an jemanden senden muss:

git diff tag1 tag2 -- path/to/file

Ich habe die hier beschriebene Befehlszeilenversion gefunden: Wie kann ich die Unterschiede in einer bestimmten Datei zwischen einem lokalen Zweig und einem Remote-Zweig erkennen?

Plainflavour
quelle

Antworten:

90

GitHub zeigt nur die Möglichkeit, Unterschiede zwischen zwei Commits anzuzeigen.

Vorausgesetzt, diese Tags verweisen tatsächlich auf Commits, wäre das URL-Format so etwas wie

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

Als Beispiel zeigt https://github.com/libgit2/libgit2sharp/compare/v0.9.0...v0.9.5 den Unterschied zwischen zwei Versionen des LibGit2Sharp-Projekts. Dieser Unterschied beinhaltet alle geänderten Dateien.

Wenn Sie eine URL abrufen möchten, die auf eine bestimmte Datei abzielt:

  • Wechseln Sie zur Registerkarte Geänderte Dateien

geänderter Tab

  • Klicken Sie auf die Schaltfläche Show Diff Stats (Dies zeigt die Liste der geänderten Dateien als Links an).

Show-Diff

  • Kopieren Sie den Link der gewünschten Datei in die Zwischenablage ... und Tada! Du bist fertig.

In Anbetracht des obigen Unterschieds verweist der Link https://github.com/libgit2/libgit2sharp/compare/v0.9.0...v0.9.5#diff-11 beispielsweise auf die LazyFixtures.csÄnderungen, die zwischen Version v0.9.0 und Version v0.9.0 aufgetreten sind v0.9.5.

Aktualisieren

Wie wäre es, wenn Sie nach Ihrem Kommentar, der besagt, dass Ihr Diff zu groß ist, um über die Weboberfläche gerendert zu werden, zu guten alten Befehlszeilen-Tools zurückkehren? Sie können die Ausgabe des Diff in eine Datei umleiten und die Datei dann als E-Mail-Anhang senden.

$ git diff v0.9.0 v0.9.5 -- LibGit2Sharp.Tests/LazyFixture.cs > /tmp/lazyfixture.diff
nulltoken
quelle
8
Hallo, es sieht so aus, als würde das bei mir nicht funktionieren, weil mein Diff zu groß ist. Ich erhalte die Meldung "Dieser Unterschied ist groß! Wir zeigen Statusinformationen nur für die ersten 2.500 Dateien an." Ich bekomme also nur die Diff-Statistiken und nicht die vollständigen Unterschiede, selbst mit den # Diff-Links.
Plainflavour
1
Ich denke jedoch, Sie haben Recht - so geht das. Danke
plainflavour
1
Sie können auch diese Chrome-Erweiterung github.com/danielribeiro/github-diff-highlight-extension verwenden , um beim Vergleichen von Zweigen eine Syntaxhervorhebung zu erhalten.
Daniel Ribeiro
3
@plainflavour Ein weiterer praktischer Tipp für den Fall, dass Sie erneut darauf stoßen: Wenn Sie eine Vergleichs-URL wie @nulltoken haben, können Sie auch einfach eine .diff am Ende der URL hinzufügen, um den vollständigen Unterschied anzuzeigen (wenn auch als Klartext) ). ZB https://github.com/{user}/{repository}/compare/{from-tag}...{until-tag}.diff Quelle
dmccabe
1
Ich sehe keine Schaltfläche " Diff-Statistiken anzeigen". Ist es weg? Oder sehe ich es einfach nicht?
dckc
6

Hier ist meine Problemumgehung, wenn das folgende Problem auftritt.

Dieser Vergleich ist groß! Wir zeigen nur die letzten 250 Commits

Kopieren Sie die Rohansicht der Datei, die Sie mit https://gist.github.com/ vergleichen möchten . Verwenden Sie die beiden spezifischen Festschreibungspunkte, die Sie vergleichen möchten. Beginnen Sie mit dem älteren Commit.

https://gist.github.com/ bietet eine schöne nebeneinander angeordnete Diff-Ansicht, wenn Sie auf "Revisionen" klicken.

f01
quelle
2
Vielen Dank, dies war genau der Vorschlag, den ich für gist.github.com/ncoghlan/1067805fe673b3735ac854e195747493/… brauchte ! :)
Ncoghlan
3

Die Antwort richtet sich an Personen, die nur den Verlauf / die Überarbeitung von Codeänderungen einer Datei auf der GITHUB WEB-Seite zum vorherigen Einchecken anzeigen (nicht herunterladen) möchten.

Gehen Sie zu dieser Datei im Github und wählen Sie HISTORY . Dies öffnet eine Seite mit einer Liste von Check-in-Kommentaren wie unten.

Geben Sie hier die Bildbeschreibung ein Wenn Sie darauf klicken, werden die Codeänderungen angezeigt. Nach dem Klicken auf den Verlauf; Sie können auf Pakete klicken, um alle Dateieinchecks auf Paketebene anzuzeigen.

In Eclipse können Sie den Verlauf mit dem EGit- Plugin und "Rechtsklick -> Vergleichen mit" in der Datei vergleichen. Wie kann ich zwei Revisionen in git in Eclipse vergleichen?

Kanagavelu Sugumar
quelle
1
Um genauer zu sein, klicken Sie auf den 7-stelligen "Namen" des Commits (es gibt keine Beschriftung oder QuickInfo, wenn Sie den Mauszeiger darüber halten, es befindet sich in der Nähe der rechten Seite direkt neben der "Kopie in die Zwischenablage"). Symbol), und das bringt Sie zu einer Seite, die einen Unterschied zwischen der Version dieses Commits und der vorherigen Version zeigt.
JonathanZ unterstützt MonicaC
@ Jonathan Ja; das ist wahr
Kanagavelu Sugumar
Hey, ich habe diese Bildschirmaufnahme beim letzten Mal nicht gesehen. Ich weiß nicht, ob es damals nicht für mich geladen wurde oder ob Sie es seitdem hinzugefügt haben, aber so oder so, danke für Ihre Antwort. Es ist toll.
JonathanZ unterstützt MonicaC
Bei einem Commit von 5000 Dateien komme ich nicht zum Einzeldateidiff. Aus dieser Geschichte , versuchen Sie das Delta zu dieser Datei von der Suche nach diesem großen begehen .
Carl Walsh
0

Ich habe die Antwort von nulltoken verwendet , um ein einfaches Convenience-Skript zum Aufrufen eines Unterschieds zwischen zwei Commits auf GitHub über die Befehlszeile zusammenzustellen.

Sie finden das vollständige Skript im Kern , aber hier sind die guten Seiten :

# Parse the following patterns for repo urls to get the github repo url
# https://github.com/owner/repo-name.git
# [email protected]: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

Es akzeptiert als Argumente Zweige, Commits und alles andere, was durch gelöst werden kann git rev-parse. Ich habe verwendet open, was unter MacOS nur zum Öffnen von Webseiten funktioniert. Wenn Sie sich also in einer anderen Umgebung befinden, sollten Sie dies optimieren.

Wie bei der Antwort von nulltoken müssen Sie auf den Titel der Datei klicken, um auf eine einzelne Datei im Diff zu verweisen, damit die Ankerzeichenfolge in der URL-Leiste angezeigt wird, die Sie dann kopieren können.

Chris
quelle
Gibt es eine Möglichkeit, die Ankerzeichenfolge für einen Vergleich zu erhalten, bei dem die gewünschte Datei nicht angezeigt wird, weil zu viele vorhanden sind?
Sgarg
@sgarg Der Anker ist "diff- <md5 des Dateinamens>" - nicht dokumentiert AFAIK - aber es hat mich geärgert und ich habe es erraten.
Ben Walding
0

Da dies immer noch nicht möglich ist, gibt es hier eine browserbasierte Diff-Tool-Methode. Die Automatisierung wird nicht genutzt, sondern es müssen nur Chrome-Erweiterungen installiert werden:

  1. Installieren Sie Diff Tools für Chrome-Browser: https://chrome.google.com/webstore/detail/diff-tools-text-pdf-doc-o/lkcdojpmjehlniamnglpjlldkoonlomb
  2. Öffnen Sie Diff Tools ( http://iblogbox.com/devtools/diff/ ).
  3. Gehen Sie von GitHub zum BEFORE-Commit, -Tag oder -Zweig, öffnen Sie die Datei, klicken Sie auf die RawSchaltfläche, um die Rohdateiansicht aufzurufen, wählen Sie alle aus und kopieren Sie sie. Fügen Sie sie dann in das Textfeld auf der linken Seite in Diff Tools ein
  4. Wiederholen Sie Schritt 3 bis auf die AFTER-Datei und fügen Sie sie in das rechte Feld in Diff Tools ein
  5. Klicken Sie auf Compare Nowund führen Sie Ihr Diff ad-hoc aus
kayleeFrye_onDeck
quelle