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"
в таблице строк. Ссылки разные, но контент один и тот же.
git bisect - это то, что вы ищете. С помощью этой команды вы можете быстро найти, какой коммит ввел константу.
Вы начинаете процесс с git bisect start
, затем помечаете старую версию без const как хорошую с помощью git bisect good
], а текущий - bisect bad
. Затем система отправит вам версию посередине. Вы можете проверить, есть ли здесь злая константа, и отметить эту версию хорошей или плохой в зависимости от нее. Затем процесс повторяется, пока вы не найдете ошибочную фиксацию.
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).
Возможно, изменение не всегда было в строке 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
, чтобы узнать автора.
Если строка существовала без токена const
в каком-то известном коммите, вы можете начать с этого и использовать флаг - reverse
в git -blame найти последнюю ревизию, в которой в строке не было токена const
. Тогда просто посмотрите на следующую редакцию файла после этого.
Я использую QGit для этого, выбираю интересующие строки и фильтрую по ним, тогда вы видите только список изменений для этой строки. Для одной строки не нужно перепрыгивать через несколько ревизий.
через: