Для меня это выглядит следующим образом:
Скажем, речь идет о файле foo.txt
, который был добавлен в репозиторий git (скажем, пустой) в какой-то момент:
touch foo.txt
git add foo.txt
git commit -m "added foo.txt"
// commit '123'
Затем он был изменен пару раз:
// add "hello" to foo.txt
git add foo.txt
git commit -m "Added 'hello'"
// commit '456'
// add "world" to foo.txt
git add foo.txt
git commit -m "Added 'world'"
// commit '789'
В этот момент файл (содержащий «hello world») копируется в сторону (cp foo.txt /tmp/foo.txt
) и является его эталонной копией.
Впоследствии были другие коммиты, которые изменили содержимое foo.txt
, скажем, коммиты abc
, def
), так что файл теперь действительно выглядит в git как:
Hello world
How are you doing?
I'm fine, and you?
I'm Ok too
Таким образом, вопрос, который фактически задают, состоит в том, как найти коммит, после которого файл foo.txt
выглядит точно как эталонная копия, поскольку он хранится в /tmp/foo.txt
: он содержит только «Hello world» (коммит 789
в моем пример)
В этом случае я считаю, что вы должны использовать команду git bisect
, задать ей границы последнего коммита и первого (начального коммита) и, если в проекте было много коммитов, запустить двоичный файл поиск будет намного быстрее, чем перебор все коммиты в истории файла.
Читать об этом здесь
Вы должны знать, как принять решение, является ли фиксация «хорошей» или «плохой» 'в терминах git bisest
(например, содержит ли он слова "привет" и "мир", например)