git: отменить изменения в функции - PullRequest
0 голосов
/ 09 января 2019

Когда мы делаем git diff, он очень хорошо показывает нам разницу с номерами строк и функцией, в которую попадают строки:

@@ -614,10 +636,10 @@ def write_my_name(name):
                         .
                         .
-                        len(name),
+                        len(getattr(resume, name)),

Когда я делаю git add, это также сохраняет эти ссылки на функции?

Также, чтобы рассмотреть, у нас есть git log -L<func_name>:file_name, не уверен, как это работает. Я думаю, что ссылка на функцию хранится?

Если ответ на поставленные выше вопросы положительный. Можно ли отменить изменения в определенной функции? Я не могу найти переключатель в reset.

Хотелось бы рассмотреть оба сценария, изменения не были подготовлены и изменения были сделаны для фиксации.

Спасибо, что нашли время прочитать это.

1 Ответ

0 голосов
/ 09 января 2019

Когда мы делаем 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...