Как узнать хэш коммита

Обновлено: 04.07.2024

Какова команда, чтобы узнать, какой коммит (хэш SHA1) в данный момент используется? git status этого не обеспечивает.

Редактировать: я думаю, что вызов git log и просмотр первой записи работает?

У вас есть как минимум 5 различных способов просмотра коммита, который вы в настоящий момент извлекли в свою рабочую копию во время сеанса git bisect ( обратите внимание, что варианты 1-4 также будут работать, когда вы не делаете биссект ):

  1. git show литий>
  2. git log -1 литий>
  3. приглашение Bash.
  4. git status литий>
  5. git bisect visualize литий>

Я объясню каждый вариант подробно ниже.

Вариант 1: git show

Как описано в этом ответе На общий вопрос о том, как определить, какой коммит вы в данный момент извлекли (не только во время git bisect ), вы можете использовать ---- +: = 6 =: + ---- с опцией git show для подавления вывода патча

Вариант 2: git log -1

Вы также можете просто выполнить $ git show --oneline -s a9874fd Merge branch 'epic-feature' , чтобы узнать, на каком коммите вы сейчас находитесь.

Вариант 3: приглашение Bash

В Git версии 1.8.3+ (или это была более ранняя версия?), если у вас есть приглашение Bash, настроенное для отображения текущей ветки, которую вы извлекли в рабочую копию, то оно также покажет вам текущий коммит Вы проверили во время сеанса деления пополам или когда вы находитесь в состоянии «отсоединенного HEAD». В приведенном ниже примере у меня в данный момент есть $ git log -1 --oneline c1abcde Add feature-003 :

Вариант 4: git status

(c1abcde. ) $ также покажет вам, что коммит вы извлекли во время биссектрисы и когда вы находитесь в отключенном состоянии HEAD:

Вариант 5: визуализация git bisect

введите описание изображения здесь

Вы можете просто сделать:

Чтобы объяснить немного подробнее: git rev-parse - это основная команда git для интерпретации любым из экзотических способов указания имени коммита и HEAD - это ссылка на ваш текущий коммит или ветку. (В сеансе git bisect он указывает непосредственно на коммит («отсоединенный HEAD»), а не на ветвь.)

В качестве альтернативы (и легче запомнить) было бы просто сделать:

. который по умолчанию показывает коммит, на который указывает HEAD . Для более краткой версии вы можете сделать:

В качестве альтернативы (если у вас есть теги):

(Хорошо подходит для наименования версии, но не очень хорошо для возврата в git.)

Или (как предложил Марк, перечисляя здесь для полноты):

Если вы хотите извлечь простую часть информации, вы можете получить ее, используя git show с --format=<string> option . и попросить его не давать вам diff с --no-patch . Это означает, что вы можете получить вывод в стиле printf того, что вы хотите, что часто может быть одним полем.

Например, чтобы получить только сокращенный хеш ( %h ), вы можете сказать:

Если вы хотите сохранить это в переменной окружения в bash (вероятно, люди захотят это сделать), вы можете использовать $() синтаксис :

Полный список того, что вы можете сделать, находится в git show --help . Но вот сокращенный список свойств, которые могут быть полезны:

  • %H зафиксировать хеш
  • %h сокращенный хеш коммита
  • %T хеш дерева
  • %t сокращенный хэш дерева
  • %P родительские хеши
  • %p сокращенные родительские хеши
  • %an имя автора
  • %ae электронная почта автора
  • %at дата автора, отметка времени UNIX
  • %aI дата автора, строгий формат ISO 8601
  • %cn имя коммиттера
  • %ce электронная почта коммиттера
  • %ct дата принятия, отметка времени UNIX
  • %cI дата принятия, строгий формат ISO 8601
  • %s тема
  • %f очищенная строка темы, подходящая для имени файла
  • %gD селектор журналов, например refs /stash @
  • %gd сокращенный селектор reflog, например, stash @

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

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

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

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

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

Команда git log

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

Изучение истории коммитов — важная составляющая работы с репозиторием. Увы, ввиду ветвления с этой историей не всегда просто разобраться. Обычно я для этой цели пользуюсь различными визуальными оболочками, но не всегда есть такая возможность. Временами приходится пользоваться средствами консоли, а именно командой git log. Основы работы с этой командой можно почитать в чудесной книге ProGit . git log имеет множество различных полезных параметров. Рассмотрим несколько примеров их использования.

Древовидный вид

Выводим полный граф коммитов, отводя по одной строке на коммит.

Линейный вид

Вывод списка коммитов с параметрами по умолчанию.

Выводим список коммитов и показываем diff для каждого.

Выводим список коммитов и показываем статистику по каждому.

Выводим список коммитов по одному на строчке.

Визуальный интерфейс

Если есть возможность, то всё таки коммиты приятнее изучать через специализированный интерфейс, а не из консоли. Лично я очень люблю GitExtensions:

Также удобно использовать встроенную утилиту gitk:

Полезные параметры

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

  • --graph Показывать древовидную структуру графа истории в ASCII-виде
  • -5 Посмотреть последних пять коммитов
  • --skip=3 Пропустить три коммита
  • --pretty=oneline Отводить по одной строчке на коммит
  • --since="today" Показать коммиты за сегодня
  • --since=2.weeks Показать коммиты за последние две недели
  • -p Показывать diff каждого коммита
  • --decorate Показывать ссылки на этот коммит
  • --stat Показывать подробную статистику по каждому коммиту
  • --shortstat Показывать краткую статистику по каждому коммиту
  • --name-only Показывать список изменённых файлов
  • --name-status Показывать список изменённых файлов с информацией о них
  • --abbrev-commit Показывать только несколько первых цифр SHA-1
  • --relative-date Показывать дату в относительной форме

C помощью замечательного параметра --pretty=format:"" можно указать, какие именно данные о коммите нужно выводить, определив внутри кавычек общий паттерн, используя следующие обозначения:

Полный список обозначений можно найти в мануале , в разделе «PRETTY FORMATS».

В том случае, если изменения, внесённые пользователем, находятся в режиме накопления, применить их к ветке можно с помощью команды git stash apply. Также можно запустить git diff — эта команда поможет выявить различия. Для того, чтобы затем избавиться от накопленных данных, нужно запустить команду:

Если существует более одного накопления, найти нужное можно с помощью команды:

git stash list затем можно применить его, воспользовавшись его индексом:

Необходимо учитывать, что отсчёт индексов ведётся от нуля.

Восстановление удалённого тега

В том случае, если необходимо восстановить случайно удалённый тег, начать можно с его поиска:

После того, как нужный тег найден, его следует восстановить:

Восстановление удалённого файла

Если вы случайно удалили файл, его можно быстро восстановить:

Если требуется восстановить файл из конкретной временной точки истории коммитов, следует узнать хеш нужного коммита и запустить команду:

Восстановление удалённой ветки

С помощью комманды git reflog можно узнать хеш (SHA1) последнего коммита в удалённой ветке. Скопируйте этот хеш и используйте в команде:

После этого восстановить удалённую ветку можно будет вот такой командой:

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

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

Устали каждый раз печатать git status? Этой команде можно присвоить простой алиас, который проще и быстрее вбивать в git.

— теперь нужно писать только git st

Можно пойти дальше и присвоить алиасы более сложным командам:

Теперь алиас git logme будет выводить все наши коммиты.

Коммит в неправильную ветку

Нужно переключиться на новую ветку, которую вы забыли предварительно создать:

А затем переключиться к оригинальной ветке:

. и «откатиться» до последнего коммита, который нужно сохранить.

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

Предупреждение: Убедитесь в том, что никто не отправлял коммиты в оригинальную ветку во время выполнения вышеописанных процедур, в противном случае эти изменения будут потеряны!

Обновление конкретного подмодуля

Чтобы обновить конкретный подмодуль в репозитории, нужно добавить путь к подмодулю:

Откат к конкретному коммиту в истории

Если вас не очень беспокоят изменения в локальном репозитории, то можно «откатиться» к конкретному коммиту в истории с помощью команды:

Эта команда установит HEAD на конкретный коммит. Также можно воспользоваться хешем коммита.

Отмена коммита до публикации изменений

Если вы сделали коммит, который впоследствии понадобилось отредактировать или полностью стереть, поможет команда git reset.

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

Отмена коммита после отправки его в master-репозиторий

Рассмотрим процедуру возврата одного или нескольких коммитов, которые нужно стереть из удалённой ветки. Обозначить конкретный коммит можно с помощью его хеша:

Отмена только коммита, который является вторым после последнего:

Простая отмена последнего коммита:

Отмена локальных изменений файлов

Простейшим способом избавиться от нежелательных изменений для файлов и папок является восстановление состояния последнего коммита. Сделать это можно с помощью специальной команды:

Кроме того, можно восстановить конкретный путь к файлу:

Отображение всех коммитов одного файла

Если вы хотите просмотреть все коммиты с изменениями конкретного файла, воспользуйтесь командой git log --follow -p -- myfile

Аргумент —follow позволяет вывести все изменения над файлом, даже если в процессе работы он был переименован.

Отображения числа коммитов от каждого участника

Хотите узнать, сколько коммитов сделал каждый участник команды?

Эта команда выведет список, отсортированный в порядке убывания количества коммитов: git shortlog -s -n

Отобразить коммиты, содержащие удалённые файлы

Узнать, в каких коммитах содержатся удалённые файлы, можно с помощью команды:

Она покажет список коммитов, в которых удалялись файлы.

Отсортировать коммиты по автору

Чтобы вывести список коммитов, отфильтрованных по автору, следует воспользоваться следующей командой:

Очистка всех скрытых состояний

Очистить все скрытые состояния можно следующей командой:

Переименование локальной и удалённой ветки

Предложим, у вас есть ветка «fix-bug25», которую вы захотели переименовать в «hotfix-users». Прежде всего, нужно будет изменить локальную ветку:

А затем — удалённую ветку: переименовать её напрямую нельзя, поэтому нужно будет её удалить, и затем опубликовать заново уже с новым именем. Прежде чем приступать к этим процедурам, следует убедиться, что никто из членов команды не работает с этой веткой! Удаляем ветку: git push origin :fix-bug25

А теперь заново публикуем её с новым именем: git push origin hotfix-users

Переименование тега

Чтобы переименовать существующий тег:

Перестать отслеживать существующие файлы

Если вы хотите перестать отслеживать файлы, которые уже есть в репозитории, но при этом желаете сохранить его локально, осуществите коммит изменений и запустите команду:

Она удалит изменённые файлы из зоны подготовленных файлов (staging area). Затем нужно запустить команду:

Подготовка удалённых файлов

Чтобы подготовить к коммиту файлы и папки, которые были удалены локально, можно использовать специальную команду:

Если требуется подготовить только используемый в данный момент путь, воспользуйтесь командой

Пометить конфликтующий файл, как разрешённый

Чтобы пометить один или несколько конфликтующих файлов, как разрешённые, чтобы их можно было нормально изменять, воспользуйтесь командой:

Затем можно запустить git commit, чтобы разрешить конфликты и опубликовать изменения.

Просмотр всех неотправленных коммитов

Чтобы просмотреть все коммиты, которые ещё не были отправлены в соответствующие ветки, воспользуйтесь следующей командой:

Кроме того, можно использовать:

Просмотр старой ревизии файла

Существует возможность просмотреть содержимое файла в конкретный момент времени в прошлом. Для этого нужно использовать команду:

Публикация локальной ветки для удалённого редактирования

Если вы создали локальную ветку, и хотите, чтобы другие пользователи могли с ней работать, воспользуйтесь командой:

Теперь они тоже смогут вносить изменения в эту ветку.

Сброс локальной ветки до состояния удалённой

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

Прежде всего нужно получить свежие обновления из удалённой ветки:

А затем нужно сообщить git, что локальную ветку следует «откатить» до состояния удалённой:

При наличии коммита, который нужно сохранить, перед сбросом нужно создать новую ветку и произвести коммит: git commit -m «Обновление»

Синхронизировать ветку с master-репозиторием

Чтобы синхронизировать последние изменения в репозитории master (или с любой другой веткой, с которой вы работали) необходимо «перебазировать» локальную ветку. Предположим, вы работаете над веткой foobar:

А затем осуществляете «перебазирование»:

После этого будут применены коммиты origin из master. После разрешения конфликтов процесс можно продолжить с помощью команды git rebase —continue. Теперь можно продолжать работу над своей веткой или осуществить её слияние (merge) с главным репозиторием.

Слияние локальных изменений с другой веткой

Это можно сделать прямо в процессе стандартного слияния (merge). Вам стоит сохранить историю слияний используя флаг —no-ff, что означает no fast forward.

Перейдите в ветку, в которую будут вливаться изменения, убедитесь в её актуальности и запустите процесс:

Совмещение двух и более коммитов

Здесь нам понадобится произвести интерактивное перебазирование. Если перебазирование происходит относительно master-ветки, то начать следует с команды git rebase -i master. Однако, если перебазирование происходит не относительно ветки, то нужно будет перебазироваться относительно HEAD.

Если есть необходимость в совмещении двух последних коммитов, можно использовать команду

После её ввода появятся инструкции по выбору коммитов. В том случае, если необходимо совместить все коммиты с первым старейшим коммитов, то в первой строке нужно написать pick, а для всех остальных коммитов изменить букву на f. Подробнее здесь

Совмещение коммитов по конкретной функции для добавления в ветку релиза

Если вы решите совместить и опубликовать коммиты, то возникнет новый коммит в ветке релиза, поэтому история ветки конкретной функции останется неизменной.

Ниже представлен пример того, как достичь подобного эффекта:

В конечном итоге останется только один коммит в ветке релиза, а история изменений в ветке разработки конкретной функции останется нетронутой.

Создание новой ветки с изменениями текущей

Эта команда перенесёт файлы из текущей ветки в новую, которую потом уже можно «закоммитить».

Убрать файл из буфера

Чтобы убрать добавленный по ошибке файл из буфера, нужно воспользоваться простой командой:

Удаление внешней ветки

Если вы хотите удалить ветку, введите команду:

Удаление неотслеживаемых файлов и папок

Чтобы удалить неотслеживаемые файлы и папки из рабочей копии наберите следующую команду:

Чтобы в принципе удалить их:

Подсказка: чтобы увидеть, какие файлы являются лишними, перед их непосредственным удалением, наберите:

Удаление старых веток, стёртых из внешнего репозитория

Если ветка удалена из внешнего репозитория, её также можно стереть из локального репозитория с помощью команды

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

Удаление файла из git с сохранением его локальной копии

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

Без Гита и жизнь не та

Получите практику в Git на курсах HTML Academy. Мы расскажем всё, что знаем сами, чтобы вы прокачали навыки в веб-разработке.

Читайте также: