Krótka odpowiedź:
git log --full-history -- your_file
pokaże wszystkie zatwierdzenia w historii twojego repozytorium, w tym zatwierdzenia scalenia, które się dotknęły your_file. Ostatni (górny) to ten, który usunął plik.
Niektóre wyjaśnienia:
--full-historyFlaga tutaj jest bardzo ważne. Bez tego Git wykonuje „uproszczenie historii”, gdy poprosi go o dziennik pliku. Dokumenty zawierają szczegółowe informacje na temat tego, jak to dokładnie działa, i brakuje mi odwagi i odwagi, aby spróbować to rozgryźć na podstawie kodu źródłowego, ale dokumenty git-log mają tak wiele do powiedzenia:
Tryb domyślny
Upraszcza historię do najprostszej historii wyjaśniającej ostateczny stan drzewa. Najprostsze, ponieważ przycina niektóre gałęzie boczne, jeśli wynik końcowy jest taki sam (tj. Łączenie gałęzi z tą samą zawartością)
Jest to oczywiście niepokojące, gdy usuwany jest plik, którego historii chcemy , ponieważ najprostszą historią wyjaśniającą końcowy stan usuniętego pliku jest brak historii . Czy istnieje ryzyko, że git logbez --full-historybędzie po prostu twierdzić, że plik nigdy nie został utworzony? Niestety tak. Oto demonstracja:
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
Zauważ, jak git log -- barpowyższy zrzut terminala spowodował dosłownie brak danych wyjściowych; Git „upraszcza” historię w fikcję, w której barnigdy nie istniał. git log --full-history -- bar, z drugiej strony, daje nam zatwierdzenie, które utworzyło bari zatwierdzenie, które je usunęło.
Żeby było jasne: ten problem nie jest jedynie teoretyczny. Przejrzałem tylko dokumenty i odkryłem --full-historyflagę, ponieważ git log -- some_filezawiodło mnie w prawdziwym repozytorium, w którym próbowałem wyśledzić usunięty plik. Uproszczenie historii może czasem być pomocne, gdy próbujesz zrozumieć, w jaki sposób obecnie istniejący plik znalazł się w jego obecnym stanie, ale gdy próbujesz wyśledzić usunięcie pliku , bardziej prawdopodobne jest to, że Cię przekręcisz, ukrywając zatwierdzenie, na którym ci zależy. . Zawsze używaj --full-historyflagi dla tego przypadku użycia.