Может ли Git действительно отслеживать перемещение одной функции из одного файла в другой? Если да, то как?
несколько раз я сталкивался с утверждением, что если вы перемещаете одну функцию из одного файла в другой файл, Git может отслеживать ее. Например, запись
5 ответов:
эта функция предоставляется через git blame-C
опция-C заставляет git пытаться найти совпадения между добавлением или удалением фрагментов текста в рассматриваемом файле и файлами, измененными в тех же наборах изменений. Дополнительно-CC, или-CCC расширить поиск. Типа ГИТ помочь винить в справочнике.
попробуйте сами в тестовом РЕПО с git blame-C, и вы увидите, что блок кода, который вы только что переместили, создан в исходном файле где ему и место.
по состоянию на Git 2.15,
git diff
теперь поддерживает обнаружение перемещаемых линий с помощью . Он работает для перемещений по файлам.это работает, очевидно, для цветного вывода. Насколько я могу судить, нет возможности указать перемещения в формате простого текстового патча, но это имеет смысл.
для поведения по умолчанию, попробуйте
git diff --color-moved
команда также принимает параметры, которые в настоящее время являются
no
,default
,plain
,zebra
иdimmed_zebra
(использоватьgit help diff
чтобы получить последние варианты и их описания). Например:git diff --color-moved=zebra
как как это сделано, вы можете почерпнуть некоторое понимание из это обмен электронной почтой от автора функционала.
немного этой функциональности находится в
git gui blame
(+filename). Он показывает аннотацию строк файла, каждая из которых указывает, когда она была создана и когда в последний раз изменялась. Для перемещения кода по файлу он показывает фиксацию исходного файла как создание, а фиксацию, где он был добавлен в текущий файл, как последние изменения. Попробовать его.то, что я действительно хотел дать
git log
в качестве некоторого аргумента диапазон номеров строк дополнительно к пути к файлу, а затем он показал бы историю этого блока кода. Нет такого варианта, если документация верна. Да, из заявления Линуса я тоже думаю, что такая команда должна быть легко доступна.
git на самом деле не отслеживает переименования на всех. Переименование - это просто удаление и добавление, вот и все. Любые инструменты, которые показывают переименования, восстанавливают их из этой исторической информации.
таким образом, переименование функции отслеживания-это простой вопрос анализа различий всех файлов в каждой фиксации после факта. В этом нет ничего особенно невозможного; существующее отслеживание переименования уже обрабатывает "нечеткие" переименования, в которых некоторые изменения вносятся в файл, а также переименование его; это требует просмотра содержимого файлов. Это было бы простое расширение для поиска переименований функций.
Я не знаю, действительно ли базовые инструменты git делают это - они пытаются быть нейтральными к языку, а идентификация функций очень не нейтральна к языку.
здесь
git diff
Это покажет вам, что некоторые строки исчезли изfoo
и снова появился вbar
. Если в этих файлах нет других изменений в той же фиксации, изменение будет легко обнаружить.интеллектуал
git
клиент сможет показать вам, как строки перемещаются из одного файла в другой. Языковая среда IDE сможет соотнести это изменение с определенной функцией.очень похожая вещь происходит, когда файл будет переименован. Оно просто исчезает под одним именем и появляется под другим, но любой разумный инструмент способен заметить это и представить в виде переименования.