Коммиты Git
Команда git commit
откроет текстовый редактор для ввода сообщения коммита. Представим, что нам нужно добавить новый блок в html-разметку
и стилизовать в файле style.css
. Для сохранения изменений, их необходимо закоммитить. Но сначала, нужно обозначить эти файлы для Git, при помощи команды git add
.
История коммитов log
Посмотреть на историю коммитов в ветке:
git log
Посмотреть коммиты в указанной ветке:
git log название_ветки
Доступные опции:
-p
показывает изменения в каждом коммите--stat
показывает сокращённую статистику для коммитов, например изменённые файлы и количество добавленных/удалённых строк в каждом их них-n
показываетn
последних коммитов-since="дата"
позволяет отфильтровать коммиты по промежутку времени, например--since="2019-01-01"
покажет коммиты с 1 января 2019 года--until="дата"
позволяет отфильтровать коммиты по промежутку времени, например--until="2019-01-01"
покажет коммиты после 1 января 2019 года
Создание коммита commit
Создать новый коммит:
git commit -m "название_комита"
Доступные опции:
-m
позволяет написать название коммита с командой, не открывая редактор-a
переносит все отслеживаемые файлы в область подготовленных файлов и включает их в коммит, позволяет пропустить git add перед коммитом--amend
заменяет последний коммит новым изменённым коммитом, что бывает полезно, если вы неправильно набрали сообщение последнего коммита или забыли включить в него какие-то файлы
Переключение на другой коммит checkout
Переключение на нужный коммит:
git checkout хеш_коммита
Создать ветку new-branch
, начинающуюся с коммита c хешем 5589877
, переместить HEAD
на указанный коммит а рабочую директорию вернуть к состоянию на момент этого коммита, создать указатель на этот коммит (ветку) с указанным именем:
git checkout -b new-branch 5589877
Восстановить в рабочей директории указанный файл на момент указанного коммита и добавить это изменение в индекс:
git checkout хеш_коммита название_файла
Копирование коммитов cherry-pick
Скопировать на активную ветку изменения из указанного коммита, закоммитить эти изменения:
git cherry-pick хеш_коммита
Скопировать на активную ветку изменения из master, 2 последних коммита:
git cherry-pick master~2..master
Скопировать на активную ветку изменения из указанного коммита, но НЕ КОММИТИТЬ! Подразумевается, что мы сами потом закоммитим:
git cherry-pick -n хеш_коммита
Скопировать на активную ветку изменения из всех коммитов ветки feature
с момента её расхождения с master
(похоже на слияние веток, но это копирование изменений а не слияние), закоммитить эти изменения (возможен конфликт):
git cherry-pick master..feature
Прервать конфликтный перенос коммитов:
git cherry-pick –abort
Продолжить конфликтный перенос коммитов, сработает только после решения конфликта:
git cherry-pick –continue
Удалить незакомиченные изменения
Если требуется удалить все свои незакомиченные изменения, которые ещё не индексировались командой git add
. При этом появится ещё одно состояние проекта карман
:
git stash save --keep-index
Если карман
не нужен, его можно удалить:
git stash drop
Удалить все индексированные и неиндексированные изменения:
git stash save
Вернуть все обратно:
git stash apply
Удаление коммита
Единственный безопасный способ удалить коммит, это отменить его действие но при этом оставить информацию о коммите в истории. который по сути останется пустой. Такой способ обычно используется в публичных ветвях, где изменение истории недопустимо:
git revert хеш_коммита
Исправление статуса detached HEAD у коммита
Если коммит находится вне ветки, о чем говорит статус detached HEAD
, тогда коммит нужно вернуть в рабочую ветку, с которой дальше будем продолжать работать.
Создаем новую ветку на которую будет указывать HEAD
и куда автоматически попадет вневеточный коммит:
git branch название_ветки
Переключаемся на нужную ветку в которой будем продолжать работать, чаще это ветка master
:
git checkout название_ветки
Вливаем созданную ветку в текущую которую оставляем главной:
git merge название_ветки
Восстановление потерянных коммитов
Использование reflog
будет работать в течение определенного времени после потери коммитов. Git
периодически очищает рефлог.
Первым шагом к восстановлению потерянных коммитов, является восстановление списка всех предыдущих коммитов и действий, выполненных в репозитории:
git reflog
В выводе необходимо найти хэш нужного коммита который хотите восстановить. Для востановления используется следующая команда:
git cherry-pick хеш_коммита