Коротка відповідь:
git log --full-history -- your_file
покаже всі комісії в історії вашого репо, включаючи об'єднання, які торкнулися your_file
. Останній (верхній) - той, який видалив файл.
Деякі пояснення:
--full-history
Прапор тут важливий. Без цього Git виконує "спрощення історії", коли ви запитуєте його для журналу файлу. Документи висвітлюють деталі про те, як саме це працює, і мені не вистачає зернистості та сміливості, необхідних для того, щоб спробувати це зрозуміти з вихідного коду, але в документах git-log є багато що:
Режим за замовчуванням
Спрощує історію до найпростішої історії, що пояснює остаточний стан дерева. Найпростіший, оскільки він обрізає деякі бічні гілки, якщо кінцевий результат однаковий (тобто злиття гілок з однаковим вмістом)
Це, очевидно, стосується того, коли файл, історію якого ми хочемо видалити , оскільки найпростіша історія, що пояснює остаточний стан видаленого файлу, не є історією . Чи існує ризик того, що git log
без --full-history
простого будете стверджувати, що файл ніколи не створювався? На жаль, так. Ось демонстрація:
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
Зверніть увагу, як git log -- bar
на термінальному дампі вгорі виникла буквально відсутність виводу; Git "спрощує" історію до вигадки, де її bar
ніколи не було. git log --full-history -- bar
з іншого боку, дає нам створений документ bar
і зобов'язання, яке його видалило.
Щоб було зрозуміло: це питання не просто теоретичне. Я лише заглянув у документи і виявив --full-history
прапор, оскільки git log -- some_file
не вдався до мене в реальному сховищі, де я намагався відстежувати видалений файл. Спрощення історії іноді може бути корисним, коли ви намагаєтесь зрозуміти, яким чином існуючий на даний момент файл перебуває у його поточному стані, але при спробі відстежити видалення файлів , швидше за все, вас перекрутить, приховавши зобов’язання, про яке ви дбаєте. . Завжди використовуйте --full-history
прапор для цього випадку використання.