Возможный ярлык: помните, что коммиты полные снимки . Все файлы, отличающиеся в подсказке master
, от того, что находится в коммите A
, можно наблюдать с помощью простого одиночного git diff
коммита A
против коммита подсказки master
. См. ответ Джейка Уорта . Это не покажет файлы, которые были изменены, затем были изменены назад; чтобы получить их, читайте дальше.
Вы правы, что --ancestry-path
делает что-то совсем другое:
...--o--A--*--*--*--* <-- master
/
...--o--o--o
Строка коммитов в нижней строке не является потомком коммита A
и будет исключена, но является предком кончика master
, и вы, вероятно, захотите включить его.
Помните, что в каждом коммите есть две отметки даты и времени. Это дата автора и дата коммиттера . 1 git log --pretty=fuller
покажет обе метки времени для каждого коммита.
Вы можете использовать --since
или --min-age
, чтобы ограничить ход редакции коммитами, чья временная метка committer превышает какое-либо минимальное значение. Если вас интересуют даты автора , это (намного) сложнее (git rev-list
не имеет возможности использовать даты автора).
Мне важно, чтобы коммит B был передан после коммита A и доступен из HEAD.
Нет доступных «отправлено после», так как в коммитах нет даты «отправлено». Коммит может быть сделан пять лет назад (так что его дата коммиттера - 2014) и выдвинут сегодня. (Вы также можете подделать дату коммиттера, и, конечно, даже если вы ее не фальсифицируете, это зависит от правильности часов компьютера.) Но, как правило, люди не связываются со своими временными метками коммиттера, поэтому, если вы доверяете чтобы быть достаточно хорошими, вы можете просто использовать их.
Все, что сказано, вам нужно извлечь метку времени коммиттера из вашего коммита A
сначала:
git log --no-walk --pretty=format:%ci A
будет получать метку времени коммиттера в формате ISO-8601. См. Список директив форматирования в документации git log
ФОРМАТЫ PRETTY в разделе для различных альтернатив. Парсер даты --since
принимает много форм ввода.
(Обратите внимание на проблемы с часовыми поясами, но я забыл, как Git на самом деле решает проблемы с часовыми поясами.)
1 дата автора предназначена для указания, когда изменение было впервые составлено. Дата коммиттера предназначена для хранения времени, в которое был создан конкретный коммит, идентифицированный по хеш-идентификатору коммита. Эти две метки времени изначально одинаковы, но если вы перебазируете или git cherry-pick
какой-то коммит, он сохраняет дату своего автора, получая новую (текущую) дату коммиттера в момент перебазирования или копирования вишневого пика (который также получает новый идентификатор хеша коммита).
Из-за всего этого, если коммит был впервые написан месяц назад, но должен был быть пересмотрен несколько раз, прежде чем получить коммит сегодня, у него будет дата автора, которая является одним месяцем, и дата коммиттера «сегодня» ». Следовательно, довольно типично найти дату коммиттера ≥ дату автора.