Как мне "винить вину" удаленную строку? - PullRequest
443 голосов
/ 10 декабря 2010

git blame отлично подходит для измененных и добавленных строк, но как мне найти, когда строка, которая существовала в конкретном предыдущем коммите, была в конечном итоге удалена.Я думаю bisect, но я надеялся на что-то более удобное.

[прежде чем вы спросите: в этом случае я просто набрал git log -p и искал строку кода и (а) какой-то идиот просто удалил жизненно важную строку в предыдущем коммите и (б) я был этим идиотом]

Ответы [ 4 ]

563 голосов
/ 10 декабря 2010

Если вам известно содержимое строки, это идеальный вариант использования для:

git log -S <string> path/to/file

, который показывает вам коммиты, которые вводят или удаляют экземпляр этой строки.Также есть -G<regex>, который делает то же самое с регулярными выражениями!См. man git-log и найдите параметры -G и -S или кирку (понятное название для этих функций) для получения дополнительной информации.

Параметр -S фактически упоминается в заголовкеСправочная страница git-blame также в разделе описания, где приводится пример использования git log -S....

125 голосов
/ 28 июня 2012

Я думаю, что вы действительно хотите это

git blame --reverse START..END filename

С справочная страница :

Ходить по истории вперед, а не назад.Вместо того, чтобы показывать ревизию, в которой появилась строка, она показывает последнюю ревизию, в которой существовала строка.Для этого требуется ряд изменений, таких как START..END, где путь к обвинению существует в START.

С помощью git blame reverse вы можете найти последний коммит, в котором появилась строка. Вам все еще нужно получить коммит, который следует после.

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

git log --reverse --ancestry-path COMMIT^..master
8 голосов
/ 20 декабря 2018

Просто для завершения ответа Каскабеля

git log --full-history -S <string> path/to/file

У меня была та же проблема, что и здесь: , но оказалось, что строка отсутствует, потому что коммит слияния из ветви был отменензатем слились обратно в нее, эффективно удаляя данную строку.Флаг --full-history запрещает пропуск этих коммитов.

8 голосов
/ 10 марта 2017

git blame --reverse может заставить вас закрыть туда, где удалена строка. Но на самом деле не указывает на ревизию, в которой удалена строка. Он указывает на последнюю ревизию, где строка была присутствует . Тогда, если следующая ревизия является простым коммитом, вам повезло, и вы получили ревизию удаления. OTOH, если следующая ревизия - коммит слияния , то все может стать немного диким. В рамках усилий по созданию difflame я решил эту проблему, поэтому, если на вашем компьютере уже установлен python и вы хотите попробовать его, не ждите больше и дайте мне знать как дела.

https://github.com/eantoranz/difflame

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