Использование git для поиска первого введения токена в определенной строке файла.

String a = new String("foo");
String b = new String("foo");
System.out.println(a == b); // prints false
System.out.println(a.equals(b)); // prints true

Убедитесь, что вы понимаете, почему. Это потому, что сравнение == сравнивает только ссылки; equals() метод сопоставляет содержимое по символу.

Когда вы вызываете new для a и b, каждый получает новую ссылку, указывающую на "foo" в таблице строк. Ссылки разные, но контент один и тот же.

13
задан Jon Seigel 22 February 2010 в 15:48
поделиться

5 ответов

git bisect - это то, что вы ищете. С помощью этой команды вы можете быстро найти, какой коммит ввел константу.

Вы начинаете процесс с git bisect start , затем помечаете старую версию без const как хорошую с помощью git bisect good ], а текущий - bisect bad . Затем система отправит вам версию посередине. Вы можете проверить, есть ли здесь злая константа, и отметить эту версию хорошей или плохой в зависимости от нее. Затем процесс повторяется, пока вы не найдете ошибочную фиксацию.

13
ответ дан 1 December 2019 в 17:51
поделиться

There are a few possible ways of doing it.

  • git blame, or better graphical blame tool (like git gui blame or the blame view in git instaweb / gitweb) to browse history of a line, going back in history until you find appropriate commit.

  • so called "pickaxe search", i.e. git log -S with appropriate token / regexp, to find (list) all commits where number of given tokens changed (which usually means where given token was added or deleted), e.g.:

    git log --reverse -p -S'const int foobar' -- A.cpp
    
  • git bisect where "bad" commit would mean the one with 'const' where there it shouldn't be (testing using e.g. grep).

27
ответ дан 1 December 2019 в 17:51
поделиться

Возможно, изменение не всегда было в строке 15 A.cpp , поэтому используйте окружающий контекст. Скажем, это определение const int foobar :

git grep 'const *int *foobar' \
  $(git log --reverse --pretty=format:%H -- A.cpp) -- \
  A.cpp | head -1

Это выполняет поиск вперед во времени по всем коммитам в текущей ветке, касающейся A.cpp , и находит первую, содержащую оскорбительный образец. Результатом будет SHA-1 фиксации и соответствующая строка в его ревизии A.cpp .

Как только вы узнаете фиксацию, используйте git show , чтобы узнать автора.

4
ответ дан 1 December 2019 в 17:51
поделиться

Если строка существовала без токена const в каком-то известном коммите, вы можете начать с этого и использовать флаг - reverse в git -blame найти последнюю ревизию, в которой в строке не было токена const . Тогда просто посмотрите на следующую редакцию файла после этого.

1
ответ дан 1 December 2019 в 17:51
поделиться

Я использую QGit для этого, выбираю интересующие строки и фильтрую по ним, тогда вы видите только список изменений для этой строки. Для одной строки не нужно перепрыгивать через несколько ревизий.

через:

  • открыть QGit в репозитории
  • открыть древовидное представление
  • найти файл
  • найти строку
  • выбрать интересующую строку
  • нажмите кнопку «отфильтровать ревизию выбранных строк», выглядит как воронка.
1
ответ дан 1 December 2019 в 17:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: