Я бы рекомендовал посмотреть на три инструмента в наборе инструментов git. Первый - это виноват, что очень похоже на то, что есть в cvs. Он показывает, какие фиксации последнего касались каждой строки файла. Если вы хотите посмотреть, что было раньше, вы можете взять фиксацию, которая коснулась строки, и посмотреть предыдущую фиксацию.
git show <sha1_of_interesting_commit>^ -- file/path
Вы можете повторить вину, чтобы узнать, что произошло до этого.
git blame <sha1_of_interesting_commit>^ -- file/path
Второй инструмент используется --follow
для отслеживания файлов мимо переименовывает.
git log --follow -- file/path
Третий - и, возможно, самый полезный инструмент - это опция кирки для регистрации. Это ведет поиск по истории изменений удаленных, введенных или измененных строк, содержащих данный бит текста. Это особенно полезно для отслеживания таких функций, как имена функций. Он может быть новым в файле в конкретном коммите, но он исходил из другого исходного файла? Был ли призыв к нему добавлен одновременно или раньше?
git log -S"Interesting_Function"
Если вы используете патч или стат вариант (например, -p
или --stat
) выход будет ограничен для тех файлов, изменения фактически участвуют в строку поиска, если вы не используете --pickaxe-all
, где отображается вся смена.
В сочетании с git grep
, чтобы показать, где все текущие вхождения строки, pickaxe - чрезвычайно полезный инструмент для добычи полезных ископаемых.
git винить не подходит для обнаружения движения линии (особенно при рефакторинге кода). Я имею в виду, если один разработчик написал строку, то следующий разработчик по какой-то причине переместил строку вверх или вниз - git виноват будет показывать последнее. – Eimantas
Я не думаю, что этот ответ полезен, потому что 1) 'git blame' не говорит вам, откуда появился какой-то конкретный фрагмент кода, - вот что такое' git log'. 'git blame' просто говорит вам последнему, кто редактирует каждую существующую строку кода в файле. 2) 'git blame' не следует переименовать, если вы не добавите параметр' --follow', как указано принятым ответом (и даже тогда он распадается, если файлы были объединены, реструктурированы и т. Д.). –