git clone
, git add
, git commit
, git pull/push
этими командами не удивишь и пользуемся мы ими часто. Но бывает, что иногда нужно из консоли посмотреть что-то более мощное и важное
Команды
Diff
git diff # просмотр разницы не включенных в индекс файлов
git diff --staged # просмотр разницы включенных в индекс
Log
git log # просмотр лога изменений (коммитов)
git log -p # просмотр изменений с дифом
show
git show 5120bea3e5528c29f8d1da43731cbe895892eb6d # показывает изменения конкретного коммита (в сравнении с предыдущим)
git show 5120bea3 # короткий вариант предыдущего хэша коммита
blame
git blame README.md # посмотреть изменения файла. Какие коммиты в какой строчке
grep
git grep text # ищет совпадение с указанной строкой во всех файлах проекта (игнорирует файлы из .gitignore и папку .git, так же ищет в истории)
git grep -i text # Флаг i позволяет искать без учета регистра
git grep text 5120bea3 # Поиск в конкретном коммите
git grep hexlet $(git rev-list --all) # Поиск по всей истории
# rev-list возвращает список хешей коммитов
отмена изменений — clean, restore
git clean -fd # удалить неотслеживаемые файлы (-f) директории (-d)
git restore filename # отменит полностью изменения
git restore --staged filename # исключит изменений из стейджа, но не удалит все
"откат" коммитов — revert
git revert 5120bea3e5528c29f8d1da43731cbe895892eb6d # возвращает изменения из определенного коммита
Удаление коммита. Возможно только если коммит не был отправлен во внешний репозиторий: git push
git reset --hard HEAD~ # отменит предыдущий коммит, который ещё не был отправлен
--hard
— полное удаление, без него git reset
отменит, но не удалит коммит, а поместит в рабочую директорию, с ними можно будет работать, если нет этого флага, считается, что --mixed
HEAD~
— один коммит от последнего коммита
HEAD~2
— два коммита от последнего
Добавление файлов в незаконченный коммит
Когда забыл файл или неверный текст в коммите, и ещё не запушил, можно добавить файлов или изменить текст коммита
git add filename # добавить недостающий файл
git commit --amend # директива сообщающая, что файл нужно добавить в предыдущий коммит
--no-edit
— если не нужно менять текст коммита
Интерактивный коммит
Разделить файл на коммиты можно используя интерактивный способ сохранения коммитов
Но это не очень простой путь, поэтому нужно в этом разобраться (Подробнее тут)
git add -i
Хождеиние по истории — log, checkout
git log --oneline # сокращенный вывод
git checkout 5120bea3e5528c29f8d1da43731cbe895892eb6d # переключиться на коммит
git checkout 5120bea3 # предыдущая команда в сокращенном виде
git branch # показывает где именно (ветка, коммит и т.п.) мы находимся
Чтобы не забывать где в текущий момент находишься, можно в командной строке вывести текущую ветку или коммит. Можно это сделать в обычном терминале (по поиску branch PS1 или подобное) или настроить zsh, ну и много вариантов или почитать тут.
git switch - # быстрое переключение обратно
git log --graph # вывод в виде дерева
Временное сохранение — stash
stash
работает по принципу stack
git stash # сохранение текущих изменений в stash
git stash pop # возвращение изменений из stash
git stash pop # (вызов второй раз и последующие) возвращает предыдущие изменения
Источники
- Введение в Git для начинающих, обучение с нуля – базовый курс
- Git — Интерактивное индексирование
- Как присоединиться к работе над опенсорсом, что такое PS1 и другие вопросы: отвечает разработчик Хекслета Андрей Мошков
- Git — Припрятывание и очистка