2016-12-28 2 views
2

Angenommen, einige Repository hat irgendwann eine Datei test.txt erstellt und es mit einigen Daten in das Repository verpflichtet. Die Datei ist möglicherweise nicht im anfänglichen Commit des Repositorys vorhanden.Git - Zeige Datei Diff zwischen HEAD und erste (erste) Version

Als nächstes machen viele Commits Änderungen an dieser Datei. Nun möchte ich diff Ausgabe produzieren, die den Unterschied zwischen der ersten (ersten) Version der Datei test.txt und dem aktuellen (HEAD) zeigt. Wie mache ich das?

BEARBEITEN: Frage geändert, um zu beachten, dass die Datei beim ersten Commit möglicherweise nicht vorhanden ist.

+0

Fragen Sie, wie man den Zustand von 'test.txt' beim ersten Commit des Repos ermittelt? – soundslikeodd

Antwort

3

Zuerst erhalten Sie den Hash für das erste Festschreiben, das test.txt darin hat.

git log --oneline --diff-filter=A -- text.txt 

Als diff, dass Hash mit HEAD. (Stellen Sie sicher, dass Sie die aktuelle HEAD haben zog zuerst.)

git diff [hash from previous command] text.txt 

Diese beiden Befehle kombiniert zusammen

git diff `git log --oneline --diff-filter=A -- text.txt | awk '{print $1}'` HEAD text.txt 
+0

Danke für Ihre Antwort. Ich habe vergessen, die Frage hinzuzufügen, dass die zu überprüfende Datei nicht unbedingt beim initialen Commit erscheint. Mein Fehler. Ich habe die Frage bearbeitet. Ich muss das Commit finden, das zuerst die Datei einführt, die ich vermute. – vatsug

+0

@vatsug, hast du @ soundslikeodds Skript benutzt? Es tut genau ** was du fragst. Der 'diff-Filter' limitiert das Protokoll nur auf Hinzufügen und da die Datei nur einmal hinzugefügt wurde, erhalten Sie den Hash des ersten Commits dieser Datei (wann immer das ist). – PatrickSteele

+2

@PatrickSteele Entschuldigung. Die Bearbeitung mit dem handlichen Oneliner wurde nicht angezeigt. Vielen Dank! Ich akzeptiere diese Antwort. – vatsug

0
git diff 27fa75e test.txt 

Dabei ist 27fa75e der Hash der ursprünglichen Version. Sie können diesen Hash mit git log finden.

Wenn die Datei nicht in der ursprünglichen Festschreibung vorhanden war, wird git Sie wissen lassen, dass es eine neue Datei ist. Für die erste mit der Datei begehen Sie git log verwenden können:

git log test.txt 

Dies wird Ihnen ein Protokoll aller Commits mit dieser Datei, von denen die letzte sein wird, wenn die Datei wurde zum ersten Mal begangen. Beachten Sie, dass dies nicht hilft, wenn die Datei umbenannt wurde, und wenn dies der Fall war, wird es viel schwieriger sein, die ursprüngliche Version zu finden. This question erläutert, wie Sie in ein Repository eintauchen und Commits extrahieren: Sie müssen durch die relevanten Commits zurückgehen und Dateivergleiche durchführen, um die gesuchten Dateien zu finden.

+0

Danke für Ihre Antwort.Ich habe vergessen, die Frage hinzuzufügen, dass die zu überprüfende Datei nicht unbedingt beim initialen Commit erscheint. Mein Fehler. Ich habe die Frage bearbeitet. – vatsug

+0

Das ist etwas unklar: Wenn die Datei beim initialen Commit nicht existiert, dann besteht der Unterschied zwischen der Datei-wie-es-existiert-im-ersten-Commit und der Datei-wie-es-existiert-in- HEAD ist einfach die Gesamtheit der Datei in Ihrem aktuellen HEAD? Kannst du erklären, was du unter "existiert nicht" verstehst? –

+0

Ich meine, ich möchte den Unterschied zwischen der ersten Version dieser bestimmten Datei (das erste Commit, das die Datei berührt) und HEAD erhalten. – vatsug

0

Ich scheine werden kann, um eine Lösung gefunden zu haben. Ich benutze git log --reverse der Hash-Wert des ersten bekommen begehen, welche die Datei berührt und vergleichen zu HEAD:

git diff `git log --pretty=format:"%h" --reverse test.txt | head -1` HEAD test.txt 
+0

Ich möchte darauf hinweisen, dass beide vorherigen Antworten Variationen dazu enthalten. Wenn die Datei umbenannt oder verschoben wurde, erhalten Sie nur das erste Commit mit dem neuen Namen. –

+0

Wie kann man damit umgehen, umbenennen und entfernen? – vatsug

+0

"Removals" macht hier keinen Sinn, aber ich habe einen Link zu meiner Antwort hinzugefügt, der sich mit dem viel komplizierteren Thema des Zurückgehens durch Commits beschäftigt. –

-1

Basierend auf soundslikeodd Antwort. Nicht wirklich eine Antwort.

Dies ist das Skript, das ich für mich selbst geschrieben habe, um es zu benutzen und warum es nicht hier teilen ... Es dauert jede Datei unter Git Versionskontrolle und git diff s es tun die früheste Version der Datei. Ich denke, das wird nicht zuverlässig funktionieren, wenn die gleiche Datei mehrmals hinzugefügt (und dazwischen entfernt) wurde und ich dies nicht gründlich getestet habe. Die Sache, die ich getan habe, ist sicherzustellen, dass ich dieses Skript von überall verwenden kann (ich stelle es als Alias ​​ein).

Der Grund, warum ich dies als eine Antwort hinzufüge, ist nur, dass es nicht schön als Kommentar formatiert wäre. Bitte sagen Sie mir, ob diese Art von Antwort hier nicht geschätzt wird.

Verwandte Themen