Когда мы делаем git diff
, он очень хорошо показывает нам diff вместе с номерами строк и функцией, в которую попадают строки ...
Да, но все это основано на уловке. : -)
Сначала git diff
находит последовательность редактирования (см. Ссылки в моем ответе на Как git генерирует diff в файлах? ). Затем он использует последовательность редактирования, чтобы утверждать, что это то, что вы сделали, даже если это на самом деле не то, что вы сделали - это просто изменение, которое выполнит то же самое , если применить к тому же вводу.
Затем, учитывая, что Git представляет изменение как затрагивающее строки M-through-N, Git выполняет поиск по регулярному выражению по строкам, число которых меньше или равно M (по сути, проверяет каждую строку, начиная с M, перемещая к линии 1). Эти регулярные выражения встроены в исходный код Git. Вы можете установить свои собственные, как документировано (несколько) в документации по gitattributes (поиск по "определению пользовательского заголовка hunk") , Если выражение соответствует строке, текст включается после @@
.
Когда я делаю git add
, это также сохраняет эти ссылки на функции?
Нет: git add
просто копирует версию файла рабочего дерева в индекс, заменяя любую версию, которая была в индексе ранее. Однако обратите внимание, что git add -p
запускает скрипт Perl . Этот сценарий делает что-то совсем другое; Прочитайте его, чтобы точно узнать, что он делает и как он это делает.
Также, чтобы рассмотреть, у нас есть git log -L<func_name>:file_name
, не уверен, как это работает.
Это также использует трюк совпадения с регулярным выражением для поиска функций в файлах.
Можно ли отменить изменения в определенной функции? Я не могу найти переключатель в reset
.
В настоящее время это не так. Для этого вы можете изменить скрипт Perl, потому что git reset -p
также вызывает тот же самый скрипт perl. К сожалению, встроенные регулярные выражения не экспортируются, поэтому вы можете прочитать пользовательскую конфигурацию, чтобы проверить регулярные выражения custom , но в противном случае вам придется перекодировать встроенные регулярные выражения в сценарий Perl. .
Возможно, было бы разумно попросить, чтобы ребята из Git улучшили код userdiff, чтобы он мог, в качестве команды слежения или через git config --get
, представить встроенные регулярные выражения. Конечно, вы также должны знать, что эти регулярные выражения являются приблизительными для того, что в действительности делают реальные парсеры. (С-подобные языки особенно проблематичны из-за подстановки макросов - вам нужно пропустить весь ввод через соответствующий препроцессор, прежде чем вы действительно сможете найти токены.)
Обратите внимание, что установленная версия сценария Perl называется git-add--interactive
и находится в каталоге "git-core", распечатанном git --exec-path
. Поскольку является сценарием, его довольно легко изменить. Однако, возможно, было бы разумнее скопировать этот скрипт под новым именем в вашем собственном каталоге скриптов, например, с именем git-my-fancier-script
, а затем вызвать его как git my-fancier-script
.