Как просмотреть все коммиты за определенный день?

188

Я уже посмотрел соответствующие документы с git-scm.com и gitref.org , но, похоже, не могу понять это.

Допустим, я хочу получить все коммиты на вторник, 12 ноября 2013 года. Используя в качестве примера существующее репо, я точно знаю, что у меня были коммиты в этот день, а также коммиты накануне и на следующий день.

С 2013-11-11и2013-11-12

Все следующее дает мне коммиты на 11 и 12 ноября:

  • git log --after="2013-11-11" --until="2013-11-12"
  • git log --since="2013-11-11" --until="2013-11-12"
  • git log --after="2013-11-11" --before="2013-11-12"
  • git log --since="2013-11-11" --before="2013-11-12"

С 2013-11-12только

Все последующие не дают мне коммитов:

  • git log --since="2013-11-12" --until="2013-11-12"
  • git log --since="2013-11-12" --before="2013-11-12"
  • git log --after="2013-11-12" --until="2013-11-12"
  • git log --after="2013-11-12" --before="2013-11-12"

С 2013-11-12и2013-11-13

Как и ожидалось (из результатов 2013-11-11и 2013-11-12выше), все следующее дает мне результаты как 12, так и 13 ноября:

  • git log --since="2013-11-12" --before="2013-11-13"
  • git log --after="2013-11-12" --before="2013-11-13"
  • git log --since="2013-11-12" --until="2013-11-13"
  • git log --after="2013-11-12" --before="2013-11-13"

...и так далее и тому подобное. Я чувствую, что я перепробовал все возможные комбинации since, after, before, и , untilно до сих пор не могут найти ответ, и я не понимаю , являются ли эти варианты , включающие или исключающие, поскольку они , как представляется, включительно , если эти две даты отличаются, но Исключительно, если они в один день. Я что-то пропустил / что я делаю не так ?!

3cheesewheel
источник
8
Я обнаружил, что git'ы с / после / до / до обработки очень странные, поэтому я не знаю ответа, но вы пытались указать дату + время (например, --since = "2013-11-12 00:00 «)? Кроме того, имеют ли (какие-либо из) ваши коммиты разные даты коммиттера и автора?
Джон Варфоломей
Ты понял! Указав время отработано. Мне даже не пришло в голову попробовать это со временем. Спасибо! Что касается дат коммиттеров и авторов - в те даты не было патчей, так что это не так.
звездочное колесо
Сдается мне, что 'git log --boundary' должен сделать это для вас, так что 'git log --boundary --after = "2013-11-12" --before = "2013-11-12" "покажет ровно один коммит (тот, который, как вы думаете, будет :)).
Qneill

Ответы:

231

Спасибо Джон Варфоломей!

Ответ заключается в указании времени, например, git log --after="2013-11-12 00:00" --before="2013-11-12 23:59"

3cheesewheel
источник
12
Ницца. Однако эта команда пропустит фиксацию между 23:59 и 00:00 следующего дня, поэтому git log --after="2013-11-12 00:00" --before="2013-11-13 00:00"лучше. Я полагаю, gitk --since="2013-11-12 00:00" --until="2013-11-13 00:00" &будет также работать, если у вас установлен gitk.
Здравствуйте, до свидания,
6
В git 2.13.0. git log --after="2017-07-25" --before="2017-07-26"дает действительные результаты для меня.
Powlo
1
Это для текущей проверенной ветки? Как посмотреть по всем веткам?
Nawfal
Это правильный ответ, но я все еще озадачен этим и разместил следующий вопрос: stackoverflow.com/questions/59691065/…
bgoodr
28

Я обычно проверяю свой журнал git и вижу то, над чем я работал в определенный день, и обновляю свое расписание на основании этого, но задница - это боль в наборе полной даты в формате ISO, поэтому я просто делаю это так

git log --after=jun9 --before=jun10

и я добавляю --authorтолько распечатать мои коммиты

git log --since=jun9 --until=jun10 --author=Robert 

Это печатает коммиты, которые произошли 9 июня (в данном случае это касается 2016 года, а не 2015 или 2014 и т. Д.).

Параметры --since/--afterи --until/--beforeтакже могут принимать такие вещи, как 3 days ago, yesterdayи т. Д.

Коханьи Роберт
источник
Просто не работает, ничего не выводит. Я что-то пропустил? Должен ли я указать ветку?
Ауримас
1
@ Aurimas Ну, не уверен, что пошло не так с твоей стороны. Если ваши значения sinceи untilзначения не верны, вы точно не получите вывод. Используйте git logсначала, и попытайтесь выбрать sinceи untilзначение в зависимости от того, что вы видите. Никаких веток или чего-то особенного не требуется. Не уверен, с какой версии Git эта функция доступна. Убедитесь, что у вас есть последняя версия.
Kohányi Róbert
6
Я должен был использовать пробелы:git log --after="may 2" --before="may 3"
Коннор Кларк
16

Ничего плохого в принятом ответе (за который я проголосовал), но ... мы здесь для науки!

Вывод ниже можно расширить / настроить с помощью pretty=format:<string> заполнителей :

git log --pretty='format:%H %an %ae %ai' | grep 2013-11-12

Не на 100% невосприимчив к ошибкам, так как пользователь мог ввести ту же строку.Но приемлемо в зависимости от того, какие заполнители используются. Например, приведенный выше фрагмент не потерпит неудачу.

Можно также просто разобрать все , git logчтобы JSONи потреблять / манипулировать свои данные к своему содержанию сердца. Проверьте https://github.com/dreamyguy/gitlogg и никогда не оглядывайтесь назад!

Отказ от ответственности: это один из моих проектов.

Уоллес Сидре
источник
10

Я сделал псевдоним для этой конкретной цели:

commitsAtDate = "!f() { git log --pretty='format:%C(yellow)%h %G? %ad%Cred%d %Creset%s%C(cyan) [%cn]' --decorate --after=\"$1 0:00\" --before=\"$1 23:59\" --author \"`git config user.name`\"; }; f"

Использование:

git commitsAtDate 2017-08-18
Майкл Гроссе
источник
1
Вы также можете указать относительные даты для этого псевдонима, то есть git commitsAtDate yesterday, 2 days agoи т.д.
voiger
-2

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

Сценарий продолжает запрашивать даты, пока вы не нажмете Enter или Control-D.

Пользователи Mac: требуется дата GNU.

#!/bin/bash

COMMITS=`git log --abbrev-commit --pretty="format:%h %H %ai" | sort -k3 -k4`
FIRST=`echo "$COMMITS" | head -n 1`
LAST=`echo "$COMMITS" | tail -n 1`
echo "First commit: $FIRST"
echo "Last commit: $LAST"
printf "Date to search for commits: "
read DATE
while [[ "$DATE" ]]; do
  NEXT_DATE=`date +%Y-%m-%d -d "$DATE +1 day"`
  #echo "Searching for commits from $DATE to $NEXT_DATE"
  echo `git log --after="$DATE" --before="$NEXT_DATE" --pretty="format:%h %H %an %ci '%s'"`
  printf "\nDate to search for commits: "
  read DATE
done

Я назвал сценарий commitsOnDates, и вот он в действии. Первая дата, которую я ввожу, не имеет коммитов, поэтому ответ - просто пустая строка:

$ commitsOnDates
First commit: 375bcfb 375bcfbbf548134a4e34c36e3f28d87c53b2445f 2015-08-03 13:37:16 -0700
Last commit: 1d4c88c 1d4c88ce6a15efaceda1d653eed3346fcae8f5e6 2018-10-13 21:32:27 -0700
Date to search for commits: 2015-08-13


Date to search for commits: 2015-08-03
375bcfb 375bcfbbf548134a4e34c36e3f28d87c53b2445f Mike Slinn 2015-08-03 13:37:16 -0700 'this is a comment'

Date to search for commits: 2018-10-13
1d4c88c 1d4c88ce6a15efaceda1d653eed3346fcae8f5e6 Mike Slinn 2018-10-13 21:32:27 -0700 'a comment' 64d6e16 64d6e16338657b82c91ac94bea8ebf7b80dc4c28 Mike Slinn 2018-10-13 18:28:41 -0700 'nother comment' d5eb26e d5eb26e49fc9dceee9b9f5a2d8fa052bff2cfbbc Mike Slinn 2018-10-13 18:16:20 -0700 'no comment' d8a4992 d8a4992df208ba5efb50728311820bdad5ba5332 Mike Slinn 2018-10-13 12:02:00 -0700 'commented'

Date to search for commits:
Майк Слинн
источник