Kurze Antwort:
git log --full-history -- your_file
zeigt Ihnen alle Commits in der Geschichte Ihres Repos, einschließlich der berührten Merge-Commits your_file
. Der letzte (oberste) hat die Datei gelöscht.
Einige Erklärungen:
Die --full-history
Flagge hier ist wichtig. Ohne diese Funktion führt Git eine "Vereinfachung des Verlaufs" durch, wenn Sie nach dem Protokoll einer Datei fragen. Die Dokumente enthalten nur wenige Details darüber, wie dies genau funktioniert, und mir fehlt der Mut, um es aus dem Quellcode herauszufinden, aber die Git-Log-Dokumente haben so viel zu sagen:
Standardmodus
Vereinfacht den Verlauf auf den einfachsten Verlauf und erklärt den Endzustand des Baums. Am einfachsten, weil einige Seitenzweige beschnitten werden, wenn das Endergebnis dasselbe ist (dh Zweige mit demselben Inhalt zusammenführen)
Dies betrifft natürlich, wann die Datei, deren Verlauf wir möchten, gelöscht wird , da der einfachste Verlauf, der den Endzustand einer gelöschten Datei erklärt, kein Verlauf ist . Besteht das Risiko, dass git log
ohne --full-history
einfach behauptet wird, dass die Datei nie erstellt wurde? Leider ja. Hier ist eine Demonstration:
mark@lunchbox:~/example$ git init
Initialised empty Git repository in /home/mark/example/.git/
mark@lunchbox:~/example$ touch foo && git add foo && git commit -m "Added foo"
[master (root-commit) ddff7a7] Added foo
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 foo
mark@lunchbox:~/example$ git checkout -b newbranch
Switched to a new branch 'newbranch'
mark@lunchbox:~/example$ touch bar && git add bar && git commit -m "Added bar"
[newbranch 7f9299a] Added bar
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 bar
mark@lunchbox:~/example$ git checkout master
Switched to branch 'master'
mark@lunchbox:~/example$ git rm foo && git commit -m "Deleted foo"
rm 'foo'
[master 7740344] Deleted foo
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 foo
mark@lunchbox:~/example$ git checkout newbranch
Switched to branch 'newbranch'
mark@lunchbox:~/example$ git rm bar && git commit -m "Deleted bar"
rm 'bar'
[newbranch 873ed35] Deleted bar
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 bar
mark@lunchbox:~/example$ git checkout master
Switched to branch 'master'
mark@lunchbox:~/example$ git merge newbranch
Already up-to-date!
Merge made by the 'recursive' strategy.
mark@lunchbox:~/example$ git log -- foo
commit 77403443a13a93073289f95a782307b1ebc21162
Author: Mark Amery
Date: Tue Jan 12 22:50:50 2016 +0000
Deleted foo
commit ddff7a78068aefb7a4d19c82e718099cf57be694
Author: Mark Amery
Date: Tue Jan 12 22:50:19 2016 +0000
Added foo
mark@lunchbox:~/example$ git log -- bar
mark@lunchbox:~/example$ git log --full-history -- foo
commit 2463e56a21e8ee529a59b63f2c6fcc9914a2b37c
Merge: 7740344 873ed35
Author: Mark Amery
Date: Tue Jan 12 22:51:36 2016 +0000
Merge branch 'newbranch'
commit 77403443a13a93073289f95a782307b1ebc21162
Author: Mark Amery
Date: Tue Jan 12 22:50:50 2016 +0000
Deleted foo
commit ddff7a78068aefb7a4d19c82e718099cf57be694
Author: Mark Amery
Date: Tue Jan 12 22:50:19 2016 +0000
Added foo
mark@lunchbox:~/example$ git log --full-history -- bar
commit 873ed352c5e0f296b26d1582b3b0b2d99e40d37c
Author: Mark Amery
Date: Tue Jan 12 22:51:29 2016 +0000
Deleted bar
commit 7f9299a80cc9114bf9f415e1e9a849f5d02f94ec
Author: Mark Amery
Date: Tue Jan 12 22:50:38 2016 +0000
Added bar
Beachten Sie, dass git log -- bar
im obigen Terminal-Dump buchstäblich keine Ausgabe ausgegeben wurde. Git "vereinfacht" die Geschichte zu einer Fiktion, in der es sie bar
nie gab. git log --full-history -- bar
Auf der anderen Seite erhalten wir das Commit, das erstellt wurde, bar
und das Commit, das es gelöscht hat.
Um es klar auszudrücken: Dieses Thema ist nicht nur theoretisch. Ich habe nur in die Dokumente geschaut und das --full-history
Flag entdeckt, weil git log -- some_file
es für mich in einem echten Repository fehlgeschlagen ist, in dem ich versucht habe, eine gelöschte Datei aufzuspüren. Geschichte Vereinfachung könnte manchmal hilfreich sein , wenn Sie zu verstehen , sind versucht , wie eine derzeit bestehende Datei in seinem aktuellen Zustand sein kam, aber wenn Sie eine Datei auf die Spur zu versuchen Löschung es wahrscheinlicher ist , Sie versteckt schrauben über die verpflichten Sie kümmern sich um . Verwenden Sie --full-history
für diesen Anwendungsfall immer das Flag.