Подтвердить что ты не робот

Почему git log --cherry-pick не удаляет эквивалентные коммиты?

Я пытаюсь использовать

git log --no-merges --cherry-pick --right-only master...my-branch

чтобы сгенерировать список коммитов, которые находятся в my-ветки, но не в master (согласно документации git -log). Однако в списке все еще много эквивалентных коммитов. Если я покажу им и их патчи, нет никакой разницы, кроме идентификатора фиксации.

git show 16cbd0e47406a4f7acbd6dc13f02d74d0b6a7621 >patcha
git show c53c7c32dcd84bfa7096a50b27738458e84536d5 >patchb

diff patcha patchb
1c1
< commit 16cbd0e47406a4f7acbd6dc13f02d74d0b6a7621
---
> commit c53c7c32dcd84bfa7096a50b27738458e84536d5

И даже git patch-id показывает их как эквивалентные:

git show c53c7c32dcd84bfa7096a50b27738458e84536d5 | git patch-id
2b5504fb9a8622b4326195d88c7a20f29701e62b c53c7c32dcd84bfa7096a50b27738458e84536d5
git show 16cbd0e47406a4f7acbd6dc13f02d74d0b6a7621 | git patch-id
2b5504fb9a8622b4326195d88c7a20f29701e62b 16cbd0e47406a4f7acbd6dc13f02d74d0b6a7621

Как git log --cherry-pick не выбрать их как дубликаты?

4b9b3361

Ответ 1

Вы объединили мастера в свою ветку с тех пор, как сделали вишневые кирки? --cherry-pick работает сначала, сопоставляя идентификатор фиксации, а затем, если это не удается, ищет идентификатор патча. Если вы объединили мастера в свою ветку, у вас теперь будет фактическая фиксация на вашей ветке и вишневая версия. Таким образом, он найдет идентификатор фиксации, а затем продолжит сообщать о вишневой версии.

Я часто задавался вопросом, должен ли git всегда проверять оба, но это, вероятно, значительное поражение производительности.

Ответ 2

Я часто задавался вопросом, должен ли git всегда проверять оба, но это, вероятно, значительное поражение производительности.

Это поведение теперь (Git 2.11, Q4 2016) быстрее, чем раньше.

См. commit 7c81040 (12 сентября 2016 г.) и commit 5a29cbc (09 сентября 2016 г.) Джефф Кинг (peff).
Помог: Йоханнес Шинделин (dscho).
(слияние Junio ​​C Hamano - gitster - в commit f0a84de, 21 Sep 2016)

patch-ids: отказаться от вычисления patch-id для компиляции слиянием

"git log --cherry-pick", используемый для включения коммитов в качестве кандидатов чтобы быть согласованным с другими коммитами, в результате чего было потрачено много времени. Логика генерации патчей-идентификаторов обновлена, чтобы игнорировать слияния с избегайте потерь.

[...] мы можем потратить много дополнительного времени на вычисление этих различий слияния.
В случае, когда этот патч вдохновил этот патч, "git format-patch --cherry-pick" упал с более чем 3 минут до менее 3 секунд.