Принудительно git log чтобы показать все коммиты, включая вишневый - PullRequest
0 голосов
/ 05 апреля 2020

Во время написания я только нашел ответ на этот вопрос, но все равно опубликую его, чтобы поделиться с другими.

Тестовый сценарий

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

(я использовал rebase -ir для искусственного создания этой истории испытаний)

Обычный журнал git показывает полную историю:

> git log --graph --decorate --pretty=oneline --abbrev-commit --abbrev=8
*   b1008ab1 (HEAD -> master) Merge 'alternative' into master.
|\  
| * 22a3a296 Add x.txt
| * 0af2f788 Add y.txt
* | 3856adbf Add y.txt
* | 8543e6d8 Add x.txt
|/  
* e7696150 Initial commit.

(для этого я использую псевдоним git lol, но для этого вопроса я опишу все варианты)

Однако , журнал git, отфильтрованный для одного из файлов, показывает только один из соответствующих коммитов, который находится в основной части ветви (первый родительский элемент слияния):

> git log --graph --decorate --pretty=oneline --abbrev-commit --abbrev=8 x.txt
* 8543e6d8 Add x.txt

Вопрос

Как заставить журнал git показывать все коммиты, которые изменяют соответствующий файл, включая дубликаты / коммиты, выбранные вишней?

Что я пробовал до сих пор

Я зарегистрировался git help log и найдено --cherry-mark, --cherry-pick, --left-only, --right-only, но ничего из этого не имеет значения.

1 Ответ

1 голос
/ 05 апреля 2020

Использование git log --full-history --simplify-merges!

--full-history уже делает то, что вы хотите, но в нем перечислено много слияний, которые предоставляют мало информации.

Добавление --simplify-merges скрывает некоторые из этих слияния.

Проверьте подробные объяснения git help log.

Это имеет значение, только если указан путь. Без указанного пути он все равно показывает все выбранные вишни коммиты.

> git log --graph --decorate --pretty=oneline --abbrev-commit --abbrev=8 -- x.txt
* 8543e6d8 Add x.txt
> git log --simplify-merges --full-history --graph --decorate --pretty=oneline --abbrev-commit --abbrev=8 -- x.txt
*   0de2139f (HEAD -> master) Merge 'alternative' into master.
|\  
| * 22a3a296 Add x.txt
* 8543e6d8 Add x.txt

Интересно, что этот путь также может быть глобальным подстановочным знаком.

> git log --graph --decorate --pretty=oneline --abbrev-commit --abbrev=8 -- *
* 2c970073 Add z.txt
* 22a3a296 Add x.txt
* 0af2f788 Add y.txt
* e7696150 (tag: BEGIN) Add a jpg image
> git log --simplify-merges --full-history --graph --decorate --pretty=oneline --abbrev-commit --abbrev=8 -- *
*   0de2139f (HEAD -> master) Merge 'alternative' into master.
|\  
| * 2c970073 Add z.txt
| * 22a3a296 Add x.txt
| * 0af2f788 Add y.txt
* | 3856adbf Add y.txt
* | 8543e6d8 Add x.txt
|/  
* e7696150 (tag: BEGIN) Add a jpg image

Caveats

Я обнаружил, что git log намного медленнее с --full-history и --simplify-merges в большом репо со сложной историей.

Если указан диапазон фиксации, например, git log <parameters> master..develop -- <path>, тогда гораздо больше слияний отображается даже с --simplify-merges.

Полезные псевдонимы

Параметры полезны в сочетании с параметром --graph. У меня уже есть псевдонимы lol и lola (есть сообщения в блоге, где люди придумывают эти имена, я их не придумывал).

Так что теперь я добавил это в свой глобальный git config:

[alias]
  lol = log --graph --decorate --pretty=oneline --abbrev-commit --abbrev=8
  lola = log --graph --decorate --pretty=oneline --abbrev-commit --abbrev=8 --all
  lolf = log --graph --decorate --pretty=oneline --abbrev-commit --full-history --simplify-merges --abbrev=8
  lolaf = log --graph --decorate --pretty=oneline --abbrev-commit --full-history --simplify-merges --abbrev=8 --all

Хорошо ли, что git log ведет себя таким образом?

Возможно, нет. Проверьте комментарий от torek ниже.

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