Как найти коммит по хэшу

I need to find a commit in Git by a given hash, SHA. For example, if I have the «a2c25061» hash, and I need to get the author and the committer of this commit.

What is the command to get that?

Flip's user avatar

Flip

6,1037 gold badges45 silver badges75 bronze badges

asked Jan 5, 2013 at 0:51

Ghadeer's user avatar

0

Just use the following command

git show a2c25061

6

git log -1 --format="%an %ae%n%cn %ce" a2c25061

The Pretty Formats section of the git show documentation contains

  • format:<string>

The format:<string> format allows you to specify which information you want to show. It works a little bit like printf format, with the notable exception that you get a newline with %n instead of n

The placeholders are:

  • %an: author name
  • %ae: author email
  • %cn: committer name
  • %ce: committer email

Community's user avatar

answered Jan 5, 2013 at 1:29

Greg Bacon's user avatar

Greg BaconGreg Bacon

134k31 gold badges187 silver badges245 bronze badges

1

There are two ways to do this.

1. providing the SHA of the commit you want to see to git log

git log -p a2c25061

Where -p is short for patch

2. use git show

git show a2c25061

The output for both commands will be:

  • the commit
  • the author
  • the date
  • the commit message
  • the patch information

answered Dec 28, 2019 at 18:55

Yamona's user avatar

YamonaYamona

1,0401 gold badge16 silver badges36 bronze badges

I am fairly new to Github and have come across an amateur-ish problem.

I have been asked to do a code review and have been provided with a commit hash, however I have tried looking in Git if I can search using commit hashes but couldn’t find anything.

Is there a way I can find the changed code just by using the commit hash?

frederj's user avatar

frederj

1,4459 silver badges20 bronze badges

asked Aug 31, 2012 at 11:48

dopplesoldner's user avatar

dopplesoldnerdopplesoldner

8,77312 gold badges43 silver badges55 bronze badges

5

A URL of the form https://github.com/<owner>/<project>/commit/<hash> will show you the changes introduced in that commit. For example here’s a recent bugfix I made to one of my projects on GitHub:

https://github.com/jerith666/git-graph/commit/35e32b6a00dec02ae7d7c45c6b7106779a124685

You can also shorten the hash to any unique prefix, like so:

https://github.com/jerith666/git-graph/commit/35e32b


I know you just asked about GitHub, but for completeness: If you have the repository checked out, from the command line, you can achieve basically the same thing with either of these commands (unique prefixes work here too):

git show 35e32b6a00dec02ae7d7c45c6b7106779a124685
git log -p -1 35e32b6a00dec02ae7d7c45c6b7106779a124685

Note: If you shorten the commit hash too far, the command line gives you a helpful disambiguation message, but GitHub will just return a 404.

answered Aug 31, 2012 at 11:52

Matt McHenry's user avatar

Matt McHenryMatt McHenry

19.8k8 gold badges65 silver badges64 bronze badges

10

View single commit:
https://github.com/<user>/<project>/commit/<hash>

View log:
https://github.com/<user>/<project>/commits/<hash>

View full repo:
https://github.com/<user>/<project>/tree/<hash>

<hash> can be any length as long as it is unique.

answered Jan 20, 2015 at 19:18

qwertzguy's user avatar

2

The ability to search commits has recently been added to GitHub.

To search for a hash, just enter at least the first 7 characters in the search box. Then on the results page, click the «Commits» tab to see matching commits (but only on the default branch, usually master), or the «Issues» tab to see pull requests containing the commit.

To be more explicit you can add the hash: prefix to the search, but it’s not really necessary.

There is also a REST API (at the time of writing it is still in preview).

answered May 31, 2017 at 0:30

Todd Owen's user avatar

Todd OwenTodd Owen

15.6k7 gold badges53 silver badges52 bronze badges

4

With the GitHub CLI gh v2.22.0 (Jan. 2023), you can search from within your local cloned GitHub repository:

See gh search commits:

Examples:

# search commits matching hash "8dd03144ffdc6c0d486d6b705f9c7fba871ee7c3"
$ gh search commits --hash=8dd03144ffdc6c0d486d6b705f9c7fba871ee7c3

But also:

# search commits matching set of keywords "readme" and "typo"
$ gh search commits readme typo

# search commits matching phrase "bug fix"
$ gh search commits "bug fix"

# search commits committed by user "monalisa"
$ gh search commits --committer=monalisa

answered Jan 26 at 0:00

VonC's user avatar

VonCVonC

1.2m516 gold badges4339 silver badges5153 bronze badges

Вне зависимости от размера кодовой базы, часто возникает необходимость поиска места вызова/определения функции или получения истории изменения метода.
Git предоставляет несколько полезных утилит, с помощью которых легко и просто осуществлять поиск по коду и коммитам.
Мы обсудим некоторые из них.

Команда git grep

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

По умолчанию эта команда ищет по файлам в рабочем каталоге.
В качестве первого варианта вы можете использовать любой из параметров -n или --line-number, чтобы распечатать номера строк, в которых Git нашел совпадения:

$ git grep -n gmtime_r
compat/gmtime.c:3:#undef gmtime_r
compat/gmtime.c:8:      return git_gmtime_r(timep, &result);
compat/gmtime.c:11:struct tm *git_gmtime_r(const time_t *timep, struct tm *result)
compat/gmtime.c:16:     ret = gmtime_r(timep, result);
compat/mingw.c:826:struct tm *gmtime_r(const time_t *timep, struct tm *result)
compat/mingw.h:206:struct tm *gmtime_r(const time_t *timep, struct tm *result);
date.c:482:             if (gmtime_r(&now, &now_tm))
date.c:545:             if (gmtime_r(&time, tm)) {
date.c:758:             /* gmtime_r() in match_digit() may have clobbered it */
git-compat-util.h:1138:struct tm *git_gmtime_r(const time_t *, struct tm *);
git-compat-util.h:1140:#define gmtime_r git_gmtime_r

В дополнение к базовому поиску, показанному выше, git grep поддерживает множество других интересных параметров.

Например, вместо того, чтобы печатать все совпадения, вы можете попросить git grep обобщить выводимые командой данные, показав только те файлы, в которых обнаружены совпадения, вместе с количеством этих совпадений в каждом файле. Для этого потребуется параметр -c или --count:

$ git grep --count gmtime_r
compat/gmtime.c:4
compat/mingw.c:1
compat/mingw.h:1
date.c:3
git-compat-util.h:2

Если вас интересует контекст строки поиска, можно показать метод или функцию, в котором присутствует совпадение с помощью параметра -p или --show-function:

$ git grep -p gmtime_r *.c
date.c=static int match_multi_number(timestamp_t num, char c, const char *date,
date.c:         if (gmtime_r(&now, &now_tm))
date.c=static int match_digit(const char *date, struct tm *tm, int *offset, int *tm_gmt)
date.c:         if (gmtime_r(&time, tm)) {
date.c=int parse_date_basic(const char *date, timestamp_t *timestamp, int *offset)
date.c:         /* gmtime_r() in match_digit() may have clobbered it */

Здесь вы можете видеть, что gmtime_r вызывается из функций match_multi_number и match_digit в файле date.c (третье отображаемое совпадение представляет собой только строку, появившуюся в комментарии).

Вы также можете искать сложные комбинации строк, используя опцию --and, которая гарантирует, что будут отображены только строки, имеющие сразу несколько совпадений.
Например, давайте поищем любые строки, которые определяют константу, имя которой содержит любую из подстрок «LINK» или «BUF_MAX», особенно в более старой версии кодовой базы Git, представленной тегом v1.8.0 (мы добавим параметры --break и --heading, которые помогут вывести результаты в более читаемом виде):

$ git grep --break --heading 
    -n -e '#define' --and ( -e LINK -e BUF_MAX ) v1.8.0
v1.8.0:builtin/index-pack.c
62:#define FLAG_LINK (1u<<20)

v1.8.0:cache.h
73:#define S_IFGITLINK  0160000
74:#define S_ISGITLINK(m)       (((m) & S_IFMT) == S_IFGITLINK)

v1.8.0:environment.c
54:#define OBJECT_CREATION_MODE OBJECT_CREATION_USES_HARDLINKS

v1.8.0:strbuf.c
326:#define STRBUF_MAXLINK (2*PATH_MAX)

v1.8.0:symlinks.c
53:#define FL_SYMLINK  (1 << 2)

v1.8.0:zlib.c
30:/* #define ZLIB_BUF_MAX ((uInt)-1) */
31:#define ZLIB_BUF_MAX ((uInt) 1024 * 1024 * 1024) /* 1GB */

Команда git grep имеет несколько преимуществ перед поиском с помощью таких команд, как grep и ack.
Во-первых, она действительно быстрая, во-вторых — git grep позволяет искать не только в рабочем каталоге, но и в любом другом дереве Git.
Как вы видели, в прошлом примере мы искали в старой версии исходных кодов Git, а не в текущем снимке файлов.

Поиск в журнале Git

Возможно, вы ищете не где присутствует некоторое выражение, а когда оно существовало или было добавлено.
Команда git log обладает некоторыми мощными инструментами для поиска определённых коммитов по содержимому их сообщений или содержимому сделанных в них изменений.

Например, если вы хотите найти, когда была добавлена константа ZLIB_BUF_MAX, то вы можете с помощью опции -S попросить Git показывать только те коммиты, в которых была добавлена или удалена эта строка.

$ git log -S ZLIB_BUF_MAX --oneline
e01503b zlib: allow feeding more than 4GB in one go
ef49a7a zlib: zlib can only process 4GB at a time

Если мы посмотрим на изменения, сделанные в этих коммитах, то увидим, что в ef49a7a константа была добавлена, а в e01503b — изменена.

Если вам нужно найти что-то более сложное, вы можете с помощью опции -G передать регулярное выражение.

Поиск по журналу изменений строки

Другой, довольно продвинутый, поиск по истории, который бывает чрезвычайно полезным — поиск по истории изменений строки.
Просто запустите git log с параметром -L, и он покажет вам историю изменения функции или строки кода в вашей кодовой базе.

Например, если мы хотим увидеть все изменения, произошедшие с функцией git_deflate_bound в файле zlib.c, мы можем выполнить git log -L :git_deflate_bound:zlib.c.
Эта команда постарается определить границы функции, выполнит поиск по истории и покажет все изменения, которые были сделаны с функцией, в виде набора патчей в обратном порядке до момента создания функции.

$ git log -L :git_deflate_bound:zlib.c
commit ef49a7a0126d64359c974b4b3b71d7ad42ee3bca
Author: Junio C Hamano <gitster@pobox.com>
Date:   Fri Jun 10 11:52:15 2011 -0700

    zlib: zlib can only process 4GB at a time

diff --git a/zlib.c b/zlib.c
--- a/zlib.c
+++ b/zlib.c
@@ -85,5 +130,5 @@
-unsigned long git_deflate_bound(z_streamp strm, unsigned long size)
+unsigned long git_deflate_bound(git_zstream *strm, unsigned long size)
 {
-       return deflateBound(strm, size);
+       return deflateBound(&strm->z, size);
 }


commit 225a6f1068f71723a910e8565db4e252b3ca21fa
Author: Junio C Hamano <gitster@pobox.com>
Date:   Fri Jun 10 11:18:17 2011 -0700

    zlib: wrap deflateBound() too

diff --git a/zlib.c b/zlib.c
--- a/zlib.c
+++ b/zlib.c
@@ -81,0 +85,5 @@
+unsigned long git_deflate_bound(z_streamp strm, unsigned long size)
+{
+       return deflateBound(strm, size);
+}
+

Если для вашего языка программирования Git не умеет правильно определять функции и методы, вы можете передать ему регулярное выражение.
Например, следующая команда выполнит такой же поиск как и предыдущая git log -L '/unsigned long git_deflate_bound/',/^}/:zlib.c.
Также вы можете передать интервал строк или номер определённой строки и в этом случае вы получите похожий результат.

There are scenarios where you might need to checkout or clone from a specific git commit id. For example, you might want to perform a git pull on a specific commit version for troubleshooting.

This blog explains the steps involved in checking out a specific git commit ID (SHA).

Important Note: Always keep a backup of your code with all the commit histories before performing any git activity that may change or reverse the code.

Follow the steps to checkout from a specific commit id.

Step 1: Clone the repository or fetch all the latest changes and commits.

Step 2: Get the commit ID (SHA) that you want to checkout. From your local repository, you can get the commit SHA from the log. If you are using any platforms like Github, you can get the SHA id from the GUI itself.

git log

git commit ids min

Step 3: Copy the commit (SHA) id and checkout using the following command.

git checkout 28cd74decb47d8a5294eb59e793cb24a0f242e9e

You can also use the short form of the SHA ID from the start, as shown below.

git checkout 28cd74de

You need to be very careful with this checkout. It will be in the detached HEAD mode. Meaning, you can play around with making the changes without impacting any branches. So if you need to make any actual changes to a specific commit, use a branch checkout as explained in the next step.

Step 4: If you want to make changes from the commit ID checkout, you need to create a branch, as shown below.

git checkout -b <new-branch-name> <commit-id-sha>

For example,

git checkout -b test-branch 7d4c59f5

This will retain everything from the commit ID to the test-branch.

Git Clone From Specific Commit ID

There is no direct way to clone directly using the commit ID. But you can clone from a git tag.

However, you can do the following workaround to perform a clone if it is really necessary.

  1. Clone the repository
  2. Perform a hard reset with commit SHA id

The above steps will make your current HEAD pointing to the specific commit id SHA.

For example,


git clone <repository>
 
git reset --hard <COMMIT-SHA-ID>
 

Set Git HEAD to Specific Commit ID

If you want to revert your HEAD to a specific commit, perform a hard reset with the latest commit SHA after pulling the changes, as shown below.

git pull
git reset --hard 7d4c59f5

To revert it back, you can perform a git pull that will get all the changes from the upstream branch.

Also, learn how to checkout a git pull request.

Established in 2014, a community for developers and system admins. Our goal is to continue to build a growing DevOps community offering the best in-depth articles, interviews, event listings, whitepapers, infographics and much more on DevOps.

Урок, в котором мы подробнее рассмотрим историю коммитов и научимся путешествовать по истории

Видеоурок

Конспект урока

Краткое содержание урока, основные инструкции для командной строки, полезные ссылки и советы.

Для информации

Урок частично повторяет содержание предыдущего. Но в отличие от прошлого историю коммитов мы рассмотрим намного подробнее.

История коммитов

Сохранение истории изменений или история коммитов — одна из самых важных частей git. В истории сохраняются все коммиты, по которым можно посмотреть автора коммита, commit message, дату коммита и его хэш.
А также можно увидеть измененные файлы и изменения в каждом файле. То есть git хранит буквально все, от самого начала проекта.

Команда git log

За просмотр истории коммитов отвечает команда git log. В сочетании с различными параметрами эта команда выводит историю по-разному.
Есть много различных вариантов и комбинаций параметров, посмотрим некоторые из них

git log, просмотр истории по умолчанию


    $ git log

Показывает все коммиты от новых к старым. Для каждого коммита выводится

  • хэш
  • автор
  • дата
  • сообщение (commit message)

git log -p, расширенный вывод истории


    $ git log -p

Выводит то же, что и git log, но еще и с изменениями в файлах

git log —oneline, короткая запись


    $ git log --oneline

Вывод коммитов в одну строку. Показывает только хэш коммита и commit message

git log —stat —graph, история в виде дерева


    $ git log --stat --graph

Выводит коммиты в виде дерева, в командной строке псевдографикой. Плюс выводит список измененных файлов. К дереву коммитов мы вернемся, когда будем работать с ветками.

Сортировка и фильтрация истории

Есть множество команд, которые позволяют сортировать и фильтровать историю коммитов в командной строке. В том числе в сочетании с линуксовыми командами.
Рассмотрим некоторые из них

Поиск по коммитам

Команда grep — мощный инструмент, который помогает работать в том числе и с git. Например, искать по коммитам


    git log --oneline | grep revert # поиск упоминания revert
    git log --oneline | grep -i revert # независимо от регистра

Коммиты, затронувшие один файл


    git log index.html

Поиск по автору


    git log --author webdevkin

В опции —author можно указать имя или email, необязательно целиком, можно только часть.

Поиск по диапазону дат

Опции —after и —before задают начальную и конечную даты коммитов


     git log --after='2020-03-09 15:30' --before='2020-03-09 16:00'

Комбинация команд и опций

Команды и опции git можно комбинировать и дополнять их линуксовыми командами


    git log --author=webdevkin --oneline | grep footer # все коммиты от автора, в которых упоминается footer
    git log --oneline | wc -l # количество коммитов

Какие еще есть варианты

Мы рассмотрели базовые примеры, но в документации по git log есть много различных опций.
Все их рассматривать нет смысла, при необходимости изучайте документацию.


    git log --help

Просмотр отдельного коммита, git show

Чтобы просмотреть отдельный коммит, нужно узнать его хэш. Хэш коммита выводится в любой команде git log, с параметрами или без. Например,


    $ git log --oneline
    
    7b7d7fa Fixed footer
    26812f9 Revert "Fixed footer"
    0f90ae7 Revert "Fixed styles"
    ...
    a1f3c45 Added footer
    a65aa43 Added new block students to main page
    0b90433 Initial commit

Смотрим второй коммит


    $ git show 43f6afc

Выводится подробная информация о коммите:

  • хэш
  • автор
  • дата
  • commit message
  • список измененных файлов
  • изменения в каждом файле

Короткий хэш коммита

Хэш коммита 40-символьный, но можно использовать короткую запись — первые 7 символов хэша.
Команда git log —oneline выводит именно короткий хэш. Для других операций с коммитами достаточно использовать первые 4 символа.
Например, 3 команды ниже покажут содержимое одного и того же коммита


    $ git show 051f75475cb1dca3cd08c1c7367a3308671ccf7b
    $ git show 051f754
    $ git show 051f

История коммитов в PhpStorm

В окне Local Changes, на вкладке Log показывается вся история коммитов, в левой половине вкладки. В списке коммитов показываются их commit message, автор и дата.
Клик на нужный коммит откроет в правой части вкладки список измененных файлов. Клик на нужном файле и Ctrl/Cmd+D покажет все изменения в этом файле точно так же, как и git diff.

В тексте объяснить работу с историей в PhpStorm сложно, смотрите видеоурок.

Переключение на старый коммит, зачем это нужно

Нужно это обычно в двух случаях:

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

2. При отладке. Когда в код закралась бага и мы постепенно продвигаемся «назад в прошлое» и ищем, в какой момент что-то сломалось

Как переключиться на коммит в терминале

Первое — узнать хэш нужного коммита. Например, имеем такую историю


    $ git log --oneline
    
    7b7d7fa Fixed footer
    26812f9 Revert "Fixed footer"
    0f90ae7 Revert "Fixed styles"
    ...
    a1f3c45 Added footer
    a65aa43 Added new block students to main page
    0b90433 Initial commit

Хотим переключиться на предпоследний коммит. Коммиты идут в порядке убывания, поэтому нам нужен второй сверху — 26812f9. Переключаемся на него командой


    $ git checkout 26812f9

Все, вернулись в прошлое. Проверим историю, теперь коммит, на который мы переключились — последний


    $ git log --oneline 
    
    26812f9 Revert "Fixed footer"
    0f90ae7 Revert "Fixed styles"
    ...
    a1f3c45 Added footer
    a65aa43 Added new block students to main page
    0b90433 Initial commit

Уйдем еще дальше, переключимся на первый коммит. Так как коммиты упорядочиваются по убыванию даты, то первый коммит — это последний в списке — 0b90433 Initial commit


    $ git checkout 0b90433

Проверяем историю


    $ git log --oneline 
    
    0b90433 Initial commit

Чтобы вернуться обрано, в исходное состояние, нужно набрать


    $ git checkout master

master — это ветка, в которой мы работаем по умолчанию. О ветках поговорим через пару уроков

Как переключаться между коммитами в PhpStrom

Вкладка Log, правый клик на нужном коммите и Checkout Revision. Все. История коммитов будет видна по-прежнему вся, но напротив текущего коммита будет стоять значок HEAD с символом «!»

Как вернуться обратно? В правом нижем угле PhpStorm есть пункт git:, кликаем на него, выбираем Local Branches — master — checkout. Значок «!» пропадет — мы вернулись в исходное состояние

Что могу посоветовать

  • как и git diff, историю коммитов git log удобнее смотреть в PhpStorm
  • в команде git log есть множество вариантов сортировки и фильтрации
  • сочетание git log с простыми линуксовыми командами дает хороший эффект. Обычный grep — очень хороший помощник
  • PhpStorm предоставляет удобные возможности по фильтрации коммитов. Можно искать коммиты по commit message, по автору, дате и по папкам, в которых происходили изменения
  • перемещайтесь по истории осторожно, не забывайте возвращаться в исходное состояние

На этом все. В следующем уроке мы поговорим о взаимодействии с сервером и познакомимся с командами git push и git pull.

Спасибо за внимание и до встречи!

Все уроки курса

  • Вводный урок
  • 1. Установка и базовая настройка git
  • 2. Создание и клонирование репозитория git
  • 3. Делаем первые изменения, git status и git diff
  • 4. Коммиты и история коммитов, git commit, git log и git show
  • 5. Подробнее об истории коммитов. Путешествие по истории
  • 6. Работа с сервером, git push и git pull
  • 7. Ветки — главная фишка git, git branch и git checkout
  • 8. Работа с ветками на сервере, git fetch
  • 9. Слияния или мерджи веток, git merge
  • 10. Конфликты и их разрешение
  • Платная часть курса. Презентация
  • * 11. Работа с gitignore и git exclude
  • * 12. Буфер обмена git, git stash
  • * 13. Копирование коммитов, git cherry-pick
  • * 14. Отмена и редактирование последнего коммита
  • * 15. Отмена произвольного коммита, git revert
  •    16. Склеивание коммитов, git rebase —interactive и git reflog
  • * 17. Зачем склеивать коммиты. Плюсы и минусы сквоша
  • * 18. Работа с git rebase. Отличия от merge
  • * 19. Что такое git push —force и как с ним работать
  • * 20. Ищем баги с помощью git, git bisect
  • * 21. Как и зачем работать с тегами git
  • * 22. Процессы: github flow и git flow
  • * 23. Псевдонимы в git
  •    24. Мердж-реквесты
  • * 25. Форки

* платные уроки

список обновляется…

Понравилась статья? Поделить с друзьями:
  • Как составить резюме инструктора по йоге
  • Маткад как найти максимальное значение функции
  • Уголки рта опущены вниз как исправить уколы
  • Синий экран 0x0000004e windows 7 как исправить
  • Как найти военный билет если потерял