Я немного смущен вашим вопросом. Вы говорите, что вы можете видеть коммиты в gitk
, но не в git log -- filepath
?
Если это так, ваши коммиты не теряются; Упрощение истории git log
скрывает их от вас, потому что они думают, что они неинтересны. Если вы передадите аргумент --full-history
на git log
, вы должны их увидеть.
Объяснение
По умолчанию, когда вы делаете git log -- filepath
, Git не будет показывать вам изменения в этом файле, если Git считает, что это изменение неинтересно. Это называется «упрощением истории». Это часто случается с вишневыми кирками.
Документация по упрощению истории (см. git help log
) написана не очень хорошо (очень трудно понять), но вот ключевые части:
Режим по умолчанию
Упрощает историю до самой простой истории, объясняющей конечное состояние дерева. Проще всего, потому что он отбрасывает некоторые боковые ветви, если конечный результат один и тот же (то есть объединение ветвей с одинаковым содержимым)
[...]
Коммиты включаются, если они не являются TREESAME для любого из родителей (хотя это можно изменить, см. --sparse
ниже). Если фиксация была слиянием и TREESAME для одного из родителей, следует только за этим родителем. (Даже если есть несколько родителей TREESAME, следуйте только за одним из них.) В противном случае, следуйте за всеми родителями.
Другими словами, когда Git просматривает историю в поисках коммитов, которые меняют filepath
и сталкивается с коммитом слияния, он не всегда обходит всех родителей коммита слияния. Он часто выбирает только одного родителя и гуляет только с его предками. Это означает, что вы не увидите коммита, модифицирующего этот файл, если коммит находится в одной из других ветвей.
Аргумент --full-history
говорит git log
обойти всех родителей, показывая тем самым каждый коммит, который изменил filepath
независимо от того, считает ли Git это интересным или нет.