Поисковая шпаргалка по Git, охватывающая настройку, ежедневный цикл коммитов, ветвление, удалённые репозитории, историю и восстановление, с копированием каждой команды в один клик.
Сорок девять команд Git, которые стоит помнить. Фильтруйте по именам команд и описаниям, затем копируйте нужную. Сгруппировано по настройке, повседневной работе, ветвлению, удалённым репозиториям, истории и отмене ошибок.
Ни одна команда не соответствует фильтру.
Понимание команд Git, которые вы используете каждый день
Для чего на самом деле нужна шпаргалка по Git
В Git более сотни фарфоровых (porcelain) команд, но большинство инженеров используют одни и те же двадцать–тридцать каждый день, а до остальных добираются несколько раз в год. Шпаргалка — не замена пониманию модели; она нужна, чтобы команды, которые вы уже понимаете, были в одном нажатии клавиши, а не в одной вкладке браузера и трёх ответах Stack Overflow.
Справочник на этой странице сгруппирован так, как работа происходит на самом деле: настройка репозитория, цикл коммитов, который вы запускаете десятки раз в день, ветвление, работа с удалённым репозиторием, чтение истории и выход из затруднительных ситуаций. Введите текст в поле фильтра — и список сузится и по тексту команды, и по её описанию, поэтому поиск по «stash», «force» или «undo» сразу выводит нужные строки. У каждой строки есть кнопка копирования, потому что перенабор команды с --force-with-lease — это именно так и появляются опечатки.
Ментальная модель за командами
Почти любая команда Git имеет смысл, стоит вам держать в голове три места. Рабочая директория (working tree) — это файлы на диске, как вы видите их в редакторе. Индекс (index) — он же область подготовки (staging area) — это снимок, который вы собираете для следующего коммита. Репозиторий (repository) — это неизменяемая цепочка уже записанных коммитов. git add перемещает содержимое из рабочей директории в индекс, git commit превращает индекс в новый коммит, а git restore возвращает содержимое обратно.
Ветвление — вторая идея, и оно проще, чем кажется: ветка — это просто перемещаемый указатель на один коммит, а HEAD — это указатель на ту ветку, на которой вы находитесь. Создание ветки ничего не стоит, потому что записывает один файл с сорокасимвольным хешем. Именно поэтому git switch -c достаточно дёшев, чтобы использовать его для пятиминутного эксперимента.
Слияние и перебазирование объединяют работу из двух веток, но различаются тем, что они записывают. Merge сохраняет обе истории и добавляет коммит, соединяющий их, — это честно, но порождает оплетённый граф. Rebase перезаписывает ваши коммиты так, будто они написаны поверх другой ветки, что даёт чистую прямую линию, но меняет хеши коммитов — и именно поэтому вы никогда не делаете rebase коммитов, которые другие уже забрали.
Восстановление при сбоях
Самое полезное, что стоит знать о Git: он очень редко теряет закоммиченную работу. Если изменение было когда-то закоммичено, git reflog покажет вам хеш, а git switch -c rescue <hash> вернёт его. Эта сетка безопасности покрывает неудачные rebase, случайный reset --hard после коммита и слишком поспешно удалённые ветки.
Опасные операции — те, что затрагивают незакоммиченную работу: git reset --hard, git checkout -- на изменённом файле и git clean -fd. Ни одно из этих изменений никогда не было записано, поэтому reflog не на что указывать. Привычка, которую стоит выработать: коммитьте пораньше и почаще в черновую ветку или делайте git stash push перед любым экспериментом. Коммит, который вы потом сожмёте, ничего не стоит; а день незакоммиченной работы не вернётся.
В общих ветках отдавайте предпочтение git revert перед переписыванием истории. Он записывает новый коммит, отменяющий старый, поэтому клоны остальных остаются валидными. Приберегите --force-with-lease для своих собственных feature-веток и учтите, что это заметно безопаснее обычного --force: он отказывается выполняться, если удалённый репозиторий изменился с момента последней выборки, — и именно в этом случае обычный force push молча уничтожил бы коммиты коллеги.
Часто задаваемые вопросы
Эти команды работают в Windows, macOS и Linux?
Да. Каждая запись — это чистый Git, и поведение идентично на всех трёх платформах, будь то PowerShell, Command Prompt, Terminal или любая Linux-оболочка. Единственные заметные различия — обработка окончаний строк (управляется core.autocrlf) и правила кавычек для аргументов, содержащих пробелы.
В чём разница между git switch и git checkout?
Исторически git checkout выполнял две не связанные между собой задачи: переключение между ветками и восстановление файлов. Git 2.23 разделил их на git switch для веток и git restore для файлов. checkout всё ещё работает и не считается устаревшим, но switch и restore понятнее и их труднее случайно использовать неправильно.
Когда следует делать rebase вместо merge?
Делайте rebase вашей собственной неопубликованной feature-ветки на актуальный main, чтобы история оставалась линейной и обзоры были читаемыми. Используйте merge, когда ветка общая, когда коммиты уже отправлены или когда вы хотите, чтобы историческая запись показывала, что две линии работы шли параллельно.
Как восстановить случайно удалённый коммит?
Запустите git reflog, чтобы увидеть каждую позицию, которую занимал HEAD, найдите хеш нужного коммита, затем выполните git switch -c rescue <hash>. Это работает для коммитов, потерянных из-за неудачного rebase, жёсткого сброса или удалённой ветки, пока не запустилась сборка мусора — обычно это даёт не менее 30 дней.
Действительно ли git push --force-with-lease безопаснее, чем --force?
Да, и значительно. Обычный --force безусловно перезаписывает удалённую ветку. --force-with-lease сначала проверяет, что удалённый репозиторий всё ещё на том коммите, который вы последний раз забрали, и прерывается, если кто-то другой успел запушить — и именно в этой ситуации force push уничтожил бы работу коллеги.
Покидает ли что-то, что я ввожу в поле фильтра, мой браузер?
Нет. Шпаргалка — это небольшой блок данных, встроенный в страницу, а фильтр — обычное сопоставление строк на JavaScript. После загрузки страницы никаких запросов, аналитических вызовов и серверов не задействовано.