🧪 Git Commit –amend — исправление последнего коммита
git commit --amend позволяет изменить последний коммит без создания нового.
Типичные случаи:
• забыли добавить файл;
• опечатка в сообщении;
• мелкая правка кода.
Использование:
Только изменить сообщение:
Важно:
• переписывает hash коммита;
• не использовать для уже запушенных коммитов;
• идеально перед push или PR.
--amend — аккуратность вместо мусора в истории.
➡️ GitHub Ready | #урок
git commit --amend позволяет изменить последний коммит без создания нового.
Типичные случаи:
• забыли добавить файл;
• опечатка в сообщении;
• мелкая правка кода.
Использование:
git add forgotten_file.js
git commit --amend
Только изменить сообщение:
git commit --amend -m "fix: correct auth flow"
Важно:
• переписывает hash коммита;
• не использовать для уже запушенных коммитов;
• идеально перед push или PR.
--amend — аккуратность вместо мусора в истории.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
🧭 Git Describe — понятные версии вместо hash
git describe показывает текущий коммит через ближайший тег. Удобно для отладки, логов и версий сборок.
Базово:
Что вернёт:
Где:
• v1.2.0 — ближайший тег;
• 5 — количество коммитов после тега;
• g9f3a1c2 — hash коммита.
С учётом всех тегов:
Использование:
• версии в CI/CD;
• отладка сборок;
• понимание «где мы находимся» без hash.
git describe — читаемый идентификатор состояния проекта.
➡️ GitHub Ready | #урок
git describe показывает текущий коммит через ближайший тег. Удобно для отладки, логов и версий сборок.
Базово:
git describe
Что вернёт:
v1.2.0-5-g9f3a1c2
Где:
• v1.2.0 — ближайший тег;
• 5 — количество коммитов после тега;
• g9f3a1c2 — hash коммита.
С учётом всех тегов:
git describe --tags
Использование:
• версии в CI/CD;
• отладка сборок;
• понимание «где мы находимся» без hash.
git describe — читаемый идентификатор состояния проекта.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
📐 Git Range-diff — сравнение двух серий коммитов
git range-diff показывает разницу между наборами коммитов, а не файлами. Полезно после rebase, когда нужно понять, что реально изменилось.
Базовый пример:
Что показывает:
• какие коммиты изменились;
• какие были удалены или добавлены;
• как поменялось содержимое коммитов.
Типичный сценарий:
• сделал rebase;
• хочешь проверить, не потерял ли правки;
• сравниваешь старую и новую версию ветки.
Важно:
• работает на уровне истории;
• незаменим при код-ревью после rebase;
• читается проще, чем log + diff.
range-diff — контроль истории, а не файлов.
➡️ GitHub Ready | #урок
git range-diff показывает разницу между наборами коммитов, а не файлами. Полезно после rebase, когда нужно понять, что реально изменилось.
Базовый пример:
git range-diff main..feature main..feature-rebased
Что показывает:
• какие коммиты изменились;
• какие были удалены или добавлены;
• как поменялось содержимое коммитов.
Типичный сценарий:
• сделал rebase;
• хочешь проверить, не потерял ли правки;
• сравниваешь старую и новую версию ветки.
Важно:
• работает на уровне истории;
• незаменим при код-ревью после rebase;
• читается проще, чем log + diff.
range-diff — контроль истории, а не файлов.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
🧵 Git Notes — комментарии к коммитам без изменения истории
Добавить заметку:
Просмотр заметки:
Удаление:
Важно:
* заметки хранятся отдельно от коммитов;
* по умолчанию не пушатся;
* для синхронизации:
Использование:
* пояснения к сложным коммитам;
* результаты ревью;
* внутренние комментарии команды.
➡️ GitHub Ready | #урок
git notes позволяет добавлять заметки к коммитам, не меняя их hash и историю.Добавить заметку:
git notes add <hash>
Просмотр заметки:
git notes show <hash>
Удаление:
git notes remove <hash>
Важно:
* заметки хранятся отдельно от коммитов;
* по умолчанию не пушатся;
* для синхронизации:
git push origin refs/notes/*
Использование:
* пояснения к сложным коммитам;
* результаты ревью;
* внутренние комментарии команды.
git notes — контекст без переписывания истории.Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
🔄 Git Merge — стратегии слияния веток
При слиянии веток Git использует разные стратегии, и их выбор влияет на историю.
Основные стратегии:
1. recursive (по умолчанию)
* подходит для большинства случаев;
* умеет решать конфликты при слиянии двух веток с общим предком.
2. ours
сохраняет изменения текущей ветки;
игнорирует изменения сливаемой ветки:
3. octopus
для слияния более двух веток одновременно;
конфликты не решает, только простые случаи.
Советы:
чаще всего хватает стандартного
Стратегия merge — инструмент контроля истории, а не магия.
➡️ GitHub Ready | #урок
При слиянии веток Git использует разные стратегии, и их выбор влияет на историю.
Основные стратегии:
1. recursive (по умолчанию)
* подходит для большинства случаев;
* умеет решать конфликты при слиянии двух веток с общим предком.
2. ours
сохраняет изменения текущей ветки;
игнорирует изменения сливаемой ветки:
git merge -s ours feature
3. octopus
для слияния более двух веток одновременно;
конфликты не решает, только простые случаи.
Советы:
чаще всего хватает стандартного
recursive;ours — для отмены чужих изменений при слиянии;octopus — при массовом объединении веток для релиза.Стратегия merge — инструмент контроля истории, а не магия.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🧾 .gitattributes — управление поведением файлов в Git
.gitattributes позволяет задавать правила обработки файлов: diff, merge, eol, linguist, binary — без влияния на код.
Примеры:
Пометить бинарные файлы:
Настроить конец строк (важно для Windows/Linux):
Отключить diff для файлов:
Задать кастомный diff:
Зачем это нужно:
• меньше конфликтов;
• корректные diff;
• одинаковое поведение в команде;
• контроль без хаков.
.gitattributes — тонкая настройка Git на уровне файлов.
➡️ GitHub Ready | #урок
.gitattributes позволяет задавать правила обработки файлов: diff, merge, eol, linguist, binary — без влияния на код.
Примеры:
Пометить бинарные файлы:
*.png binary
*.zip binary
Настроить конец строк (важно для Windows/Linux):
*.sh text eol=lf
*.bat text eol=crlf
Отключить diff для файлов:
package-lock.json -diff
Задать кастомный diff:
*.md diff=markdown
Зачем это нужно:
• меньше конфликтов;
• корректные diff;
• одинаковое поведение в команде;
• контроль без хаков.
.gitattributes — тонкая настройка Git на уровне файлов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🧠 Git Plumbing vs Porcelain — внутренняя кухня Git
Git-команды делятся на два уровня: для людей и для машин.
Porcelain — высокоуровневые команды для ежедневной работы:
• git commit
• git merge
• git pull
• git status
Plumbing — низкоуровневые команды, из которых всё собрано:
• git hash-object
• git cat-file
• git update-index
• git write-tree
Пример:
Зачем знать:
• отладка сложных кейсов;
• понимание, как Git хранит данные;
• написание скриптов и инструментов.
Porcelain — интерфейс. Plumbing — механизм.
➡️ GitHub Ready | #урок
Git-команды делятся на два уровня: для людей и для машин.
Porcelain — высокоуровневые команды для ежедневной работы:
• git commit
• git merge
• git pull
• git status
Plumbing — низкоуровневые команды, из которых всё собрано:
• git hash-object
• git cat-file
• git update-index
• git write-tree
Пример:
git cat-file -p HEAD
Зачем знать:
• отладка сложных кейсов;
• понимание, как Git хранит данные;
• написание скриптов и инструментов.
Porcelain — интерфейс. Plumbing — механизм.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
🧪 Git Filter-Repo — переписывание истории правильно
git filter-repo — современная замена filter-branch. Используется для очистки истории: удаление файлов, директорий, секретов.
Удалить файл из всей истории:
Удалить директорию:
Заменить e-mail автора:
Важно:
• полностью переписывает историю;
• после — force push;
• использовать осознанно.
filter-repo — хирургия истории без костылей.
➡️ GitHub Ready | #урок
git filter-repo — современная замена filter-branch. Используется для очистки истории: удаление файлов, директорий, секретов.
Удалить файл из всей истории:
git filter-repo --path config.env --invert-paths
Удалить директорию:
git filter-repo --path build/ --invert-paths
Заменить e-mail автора:
git filter-repo --email-callback '
return b"user@old.com" == email and b"user@new.com" or email
'
Важно:
• полностью переписывает историю;
• после — force push;
• использовать осознанно.
filter-repo — хирургия истории без костылей.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
📦 Git Bundle — перенос репозитория без интернета
git bundle упаковывает историю репозитория в один файл. Подходит для передачи кода офлайн или через закрытые контуры.
Создать bundle:
Создать bundle с одной веткой:
Проверить содержимое:
Клонировать из bundle:
Использование:
• офлайн-передача;
• air-gapped среды;
• быстрый бэкап истории.
git bundle — репозиторий в одном файле.
➡️ GitHub Ready | #урок
git bundle упаковывает историю репозитория в один файл. Подходит для передачи кода офлайн или через закрытые контуры.
Создать bundle:
git bundle create repo.bundle --all
Создать bundle с одной веткой:
git bundle create feature.bundle feature/login
Проверить содержимое:
git bundle list-heads repo.bundle
Клонировать из bundle:
git clone repo.bundle project
Использование:
• офлайн-передача;
• air-gapped среды;
• быстрый бэкап истории.
git bundle — репозиторий в одном файле.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🧩 Git Merge — как использовать --no-ff и зачем он нужен
По умолчанию, если ветка может быть слита без конфликта, Git делает fast-forward — история остаётся линейной. Но иногда нужен merge-коммит для ясности.
Пример:
Что происходит:
• создаётся отдельный коммит слияния;
• сохраняется факт объединения ветки;
• история ветки видна в графе.
Когда использовать:
• длинные фичи;
• командная работа;
• подготовка к релизу.
--no-ff — контроль структуры истории без потери изменений.
➡️ GitHub Ready | #урок
По умолчанию, если ветка может быть слита без конфликта, Git делает fast-forward — история остаётся линейной. Но иногда нужен merge-коммит для ясности.
Пример:
git merge --no-ff feature/login
Что происходит:
• создаётся отдельный коммит слияния;
• сохраняется факт объединения ветки;
• история ветки видна в графе.
Когда использовать:
• длинные фичи;
• командная работа;
• подготовка к релизу.
--no-ff — контроль структуры истории без потери изменений.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
📡 Git Remote — управление удалёнными репозиториями
Посмотреть текущие remote:
Добавить новый:
Переименовать:
Удалить:
Зачем это нужно:
* работа с fork + upstream;
* миграция репозитория;
* контроль источников кода.
➡️ GitHub Ready | #урок
git remote отвечает за подключённые удалённые репозитории и их адреса.Посмотреть текущие remote:
git remote -v
Добавить новый:
git remote add upstream https://github.com/org/project.git
Переименовать:
git remote rename origin old-origin
Удалить:
git remote remove upstream
Зачем это нужно:
* работа с fork + upstream;
* миграция репозитория;
* контроль источников кода.
git remote — карта связей между репозиториями.Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🤝1
🧠 Git Index (Staging Area) — скрытый слой между кодом и коммитом
Index — это промежуточное состояние между рабочей директорией и коммитом. Git коммитит не файлы, а именно содержимое index.
Добавление в index:
Проверка состояния:
Убрать файл из index, не трогая код:
Частичное добавление:
Зачем нужен index:
• точечные коммиты;
• контроль содержимого;
• чистая история.
Index — причина, почему Git мощнее простых VCS.
➡️ GitHub Ready | #урок
Index — это промежуточное состояние между рабочей директорией и коммитом. Git коммитит не файлы, а именно содержимое index.
Добавление в index:
git add file.js
Проверка состояния:
git status
Убрать файл из index, не трогая код:
git restore --staged file.js
Частичное добавление:
git add -p
Зачем нужен index:
• точечные коммиты;
• контроль содержимого;
• чистая история.
Index — причина, почему Git мощнее простых VCS.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
🧯 git pull --rebase --autostash — обновление без ручного stash
При rebase Git обычно требует чистую рабочую директорию. Флаг --autostash решает это автоматически.
Использование:
Что происходит:
• текущие изменения временно сохраняются;
• выполняется fetch + rebase;
• изменения автоматически возвращаются обратно.
Полезно, когда:
• есть незакоммиченные правки;
• нужно быстро подтянуть remote;
• не хочется вручную делать stash.
Можно включить по умолчанию:
autostash — меньше ручных шагов, меньше ошибок.
➡️ GitHub Ready | #урок
При rebase Git обычно требует чистую рабочую директорию. Флаг --autostash решает это автоматически.
Использование:
git pull --rebase --autostash
Что происходит:
• текущие изменения временно сохраняются;
• выполняется fetch + rebase;
• изменения автоматически возвращаются обратно.
Полезно, когда:
• есть незакоммиченные правки;
• нужно быстро подтянуть remote;
• не хочется вручную делать stash.
Можно включить по умолчанию:
git config --global rebase.autoStash true
autostash — меньше ручных шагов, меньше ошибок.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🧪 Git Restore — возврат файлов без влияния на историю
Откат файла из рабочей директории:
Убрать файл из index:
Вернуть файл из другого коммита:
Почему это важно:
* замена опасных
* точечный контроль;
* безопасный откат.
➡️ GitHub Ready | #урок
git restore используется для отката изменений в файлах и индексе, не трогая коммиты и ветки.Откат файла из рабочей директории:
git restore file.js
Убрать файл из index:
git restore --staged file.js
Вернуть файл из другого коммита:
git restore --source=HEAD~1 file.js
Почему это важно:
* замена опасных
checkout;* точечный контроль;
* безопасный откат.
git restore — инструмент аккуратной работы с изменениями.Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3🔥1
🔍 Git Log — удобные фильтры для истории коммитов
git log позволяет не просто смотреть коммиты, а фильтровать их по автору, дате, сообщению и файлам.
Примеры:
• Коммиты конкретного автора:
• Коммиты за последние 7 дней:
• По ключевому слову в сообщении:
• История конкретного файла:
💡 Фильтры помогают быстро найти нужный коммит без просмотра всей истории.
➡️ GitHub Ready | #урок
git log позволяет не просто смотреть коммиты, а фильтровать их по автору, дате, сообщению и файлам.
Примеры:
• Коммиты конкретного автора:
git log --author="Nadir"
• Коммиты за последние 7 дней:
git log --since="7 days ago"
• По ключевому слову в сообщении:
git log --grep="fix login"
• История конкретного файла:
git log -- path/to/file.js
💡 Фильтры помогают быстро найти нужный коммит без просмотра всей истории.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🧵 Git Patch — перенос изменений без merge и cherry-pick
git patch позволяет переносить изменения между репозиториями или ветками в виде файлов-патчей.
Создать патч из последнего коммита:
Создать патчи для диапазона коммитов:
Применить патч:
Или с созданием коммита:
Когда это используют:
• код-ревью по почте;
• перенос правок без доступа к remote;
• изоляция изменений.
Patch — перенос кода без привязки к репозиторию.
➡️ GitHub Ready | #урок
git patch позволяет переносить изменения между репозиториями или ветками в виде файлов-патчей.
Создать патч из последнего коммита:
git format-patch -1 HEAD
Создать патчи для диапазона коммитов:
git format-patch main..feature
Применить патч:
git apply fix.patch
Или с созданием коммита:
git am fix.patch
Когда это используют:
• код-ревью по почте;
• перенос правок без доступа к remote;
• изоляция изменений.
Patch — перенос кода без привязки к репозиторию.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
🧭 Git HEAD~ и ^ — навигация по истории коммитов
Git позволяет ссылаться на коммиты относительно текущего положения, без копирования hash.
Примеры:
Оператор ^:
Комбинации:
Полезно для:
• reset / checkout;
• revert;
• анализа истории без git log.
Относительные ссылки — быстрый способ перемещаться по истории Git.
➡️ GitHub Ready | #урок
Git позволяет ссылаться на коммиты относительно текущего положения, без копирования hash.
Примеры:
HEAD~1 # предыдущий коммит
HEAD~3 # три коммита назад
Оператор ^:
HEAD^ # первый родитель
HEAD^2 # второй родитель (при merge)
Комбинации:
HEAD~2^
Полезно для:
• reset / checkout;
• revert;
• анализа истории без git log.
Относительные ссылки — быстрый способ перемещаться по истории Git.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
📌 Git Assume-Unchanged vs Skip-Worktree — временно игнорировать изменения
Эти флаги говорят Git не обращать внимания на локальные изменения, но делают это по-разному.
Assume-unchanged
* Git перестаёт проверять изменения файла;
* используется для ускорения
* небезопасен при активной разработке.
Skip-worktree
* файл считается «не для изменений»;
* безопаснее для локальных конфигов;
* часто применяют для
Сброс флагов:
Важно:
* не замена
* не коммитится;
* действует только локально.
Эти флаги — для тонкого локального контроля, а не для команды.
➡️ GitHub Ready | #урок
Эти флаги говорят Git не обращать внимания на локальные изменения, но делают это по-разному.
Assume-unchanged
git update-index --assume-unchanged config.yml
* Git перестаёт проверять изменения файла;
* используется для ускорения
status;* небезопасен при активной разработке.
Skip-worktree
git update-index --skip-worktree config.yml
* файл считается «не для изменений»;
* безопаснее для локальных конфигов;
* часто применяют для
*.env.Сброс флагов:
git update-index --no-assume-unchanged config.yml
git update-index --no-skip-worktree config.yml
Важно:
* не замена
.gitignore;* не коммитится;
* действует только локально.
Эти флаги — для тонкого локального контроля, а не для команды.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
🧩 Git Shortlog — краткая статистика по коммитам
Базовое использование:
Список авторов с количеством коммитов:
*
*
Фильтр по ветке или диапазону:
Когда полезно:
* отчёт для менеджеров;
* подготовка релизного отчёта;
* обзор активности команды.
➡️ GitHub Ready | #урок
git shortlog показывает, кто и сколько коммитов сделал, удобно для отчётов и обзора вклада команды.Базовое использование:
git shortlog
Список авторов с количеством коммитов:
git shortlog -s -n
*
-s — только числа;*
-n — сортировка по количеству коммитов.Фильтр по ветке или диапазону:
git shortlog main..feature
Когда полезно:
* отчёт для менеджеров;
* подготовка релизного отчёта;
* обзор активности команды.
shortlog — быстрый взгляд на вклад каждого разработчика.Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
🧾 .git-blame-ignore-revs — чтобы blame был полезным
Иногда git blame показывает коммиты с форматированием или рефакторингом, которые не несут смысла. Это можно исключить.
Создай файл:
Добавь hash-коммиты, которые нужно игнорировать:
Включи настройку:
Что это даёт:
• blame показывает реальные изменения логики;
• форматирование не шумит;
• проще искать причины багов.
.git-blame-ignore-revs - чистый blame без мусора.
➡️ GitHub Ready | #урок
Иногда git blame показывает коммиты с форматированием или рефакторингом, которые не несут смысла. Это можно исключить.
Создай файл:
.git-blame-ignore-revs
Добавь hash-коммиты, которые нужно игнорировать:
a1b2c3d4
e5f6g7h8
Включи настройку:
git config blame.ignoreRevsFile .git-blame-ignore-revs
Что это даёт:
• blame показывает реальные изменения логики;
• форматирование не шумит;
• проще искать причины багов.
.git-blame-ignore-revs - чистый blame без мусора.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
🧠 Git Rev-Parse — как Git понимает ссылки на коммиты
Получить hash текущего коммита:
Hash ветки:
Проверка, существует ли ссылка:
Определить имя текущей ветки:
Зачем использовать:
* shell-скрипты и CI;
* диагностика сложных кейсов;
* понимание, как Git резолвит ссылки.
➡️ GitHub Ready | #урок
git rev-parse показывает, во что Git реально преобразует ссылки вроде HEAD, веток и тегов. Полезно для скриптов и отладки.Получить hash текущего коммита:
git rev-parse HEAD
Hash ветки:
git rev-parse main
Проверка, существует ли ссылка:
git rev-parse --verify feature/login
Определить имя текущей ветки:
git rev-parse --abbrev-ref HEAD
Зачем использовать:
* shell-скрипты и CI;
* диагностика сложных кейсов;
* понимание, как Git резолвит ссылки.
rev-parse — взгляд на Git без абстракций.Please open Telegram to view this post
VIEW IN TELEGRAM
❤2