Git - это распределённая система контроля версий, разработанная для отслеживания изменений в исходном коде во время разработки программного обеспечения. Она позволяет нескольким разработчикам работать над одним проектом одновременно, управлять изменениями, создавать различные ветки для экспериментов и слияний, а также легко откатывать изменения при необходимости.


Инициализация репозитория

git init

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


# Настройки

Команда git config используется для настройки параметров конфигурации Git.

Эти параметры могут быть настроены для текущего пользователя, всего репозитория или глобально (флаг --global) для всех репозиториев на компьютере.

- Задаёт имя пользователя, которое будет отображаться в каждом коммите:

git config --global user.name "Orkhan Alishov"

- Устанавливает email, который привязывается к вашим коммитам:

git config --global user.email "or.alishov@gmail.com"

- Указывает текстовый редактор по умолчанию для работы с Git (например, при написании commit-сообщений):

git config --global core.editor "nano"

- Задаёт глобальный файл .gitignore, который применяется ко всем репозиториям:

git config --global core.excludesfile "~/.gitignore_global"

- Отключает автоматическое преобразование окончаний строк между Windows и Unix форматами:

git config --global core.autocrlf "false"

- Устанавливает имя основной ветки по умолчанию при создании нового репозитория:

git config --global init.defaultBranch "main"

- Настраивает формат вывода логов коммитов в удобочитаемом виде:

git config --global format.pretty "%h %ad | %s%d [%an]"

- Задаёт короткий формат отображения даты в логах Git:

git config --global log.date "short"

- Создаёт алиас co для команды checkout, позволяя писать короче:

git config --global alias.co checkout

- Выводит список всех текущих настроек Git:

git config --list

git clone

Эта команда используется для создания локальной копии удаленного репозитория. По сути, вы скачиваете всю историю проекта и рабочие файлы с сервера (например, с GitHub, GitLab, Bitbucket) на свой компьютер. Это самая первая команда, которую вы выполняете, когда начинаете работать с существующим проектом. Вы указываете URL репозитория, и Git создает папку с именем репозитория (если не указать другое имя) и загружает туда все необходимое.

git clone https://github.com/имя_пользователя/имя_репозитория.git

# Или так, чтобы клонировать в папку с другим именем:
git clone https://github.com/имя_пользователя/имя_репозитория.git моя_папка_проекта

Просто убедитесь, что у вас есть права доступа к репозиторию, если он приватный. И помните, git clone автоматически настраивает связь с удаленным репозиторием под именем origin, что упрощает последующие push и pull.


git status

Ваш главный индикатор состояния репозитория. Эта команда показывает, какие файлы были изменены с момента последнего коммита, какие файлы готовы к коммиту, а какие файлы Git еще не отслеживает. Выполнять git status стоит часто - перед add, перед commit, после pull, чтобы всегда понимать, что происходит в вашем рабочем каталоге. Она не меняет ничего, только информирует.

git status

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


git add

Эта команда добавляет изменения из рабочего каталога в так называемую "staging area". Staging area - это промежуточный этап перед созданием коммита. Вы сами выбираете, какие именно изменения войдут в следующий коммит. Это позволяет делать атомарные, логически завершенные коммиты, даже если вы внесли множество разных изменений в разные файлы. Можно добавлять файлы по одному, группами или все сразу.

# Добавить конкретный файл
git add index.html

# Добавить сразу несколько файлов
git add index.html index.css

# Добавить все изменения в текущей папке и подпапках
git add .

# Добавить все измененные и новые файлы во всем репозитории
git add -A

# Интерактивно выбрать, какие части изменений в файле добавить
git add -p

Часто используется git add ., но будьте внимательны: эта команда добавит все изменения, включая случайные или временные файлы, если они не указаны в .gitignore. Использование git add -p очень полезно для ревью собственных изменений перед коммитом.


git commit

Фиксирует изменения, добавленные в staging area (git add), в локальной истории репозитория. Каждый коммит - это снимок состояния проекта в определенный момент времени, снабженный уникальным хешем и сообщением, описывающим суть изменений. Хорошее сообщение коммита критически важно для понимания истории проекта вами и вашей командой.

# Создать коммит с коротким сообщением прямо из командной строки
git commit -m "Исправлена опечатка в README"

# Открыть текстовый редактор для ввода подробного сообщения коммита
git commit

# Изменить коммит без изменения его сообщения
git commit --amend --no-edit

# Добавление всех изменённых файлов (не добавляет новые файлы) и создание коммита
git commit -a -m "Обновил все изменённые файлы"

# Создание пустого коммита (без изменений)
git commit --allow-empty -m "Пустой коммит"

Старайтесь писать осмысленные сообщения коммитов. Стандартная практика - начинать с краткой строки (до 50 символов), описывающей суть, а затем, после пустой строки, добавлять более подробное описание, если это необходимо. Если вы забыли что-то добавить в последний коммит, можно использовать git commit --amend, но делайте это только с коммитами, которые еще не были отправлены на удаленный сервер (git push), иначе создадите проблемы коллегам.


git push

Отправляет ваши локальные коммиты на удаленный репозиторий (тот самый origin, который обычно настраивается при git clone). Это делает ваши изменения доступными для других членов команды. Вы указываете имя удаленного репозитория (обычно origin) и имя ветки, которую хотите отправить.

# Отправить изменения из текущей локальной ветки в одноименную ветку на origin
git push origin имя_ветки

# Более короткая версия, если upstream уже настроен (часто работает после первого push)
git push

# Принудительно перезаписывает историю на удалённом репозитории. Осторожно! Может сломать работу других разработчиков
git push -force (-f)

# То же, что --force, но проверяет, не изменилась ли удалённая ветка за время твоей работы. Более безопасно
git push --force-with-lease

Перед git push всегда полезно сделать git pull, чтобы убедиться, что ваша локальная версия ветки актуальна и избежать потенциальных конфликтов при отправке. Если Git откажется пушить из-за расхождения историй, вам сначала нужно будет интегрировать эти удаленные изменения (git pull).


git pull

Забирает изменения с удаленного репозитория и пытается слить их с вашей текущей локальной веткой. По сути, это комбинация двух других команд: git fetch (скачивает изменения, но не применяет их) и git merge (сливает скачанные изменения с вашей веткой). Это стандартный способ обновить вашу локальную копию проекта последними изменениями от коллег.

# Скачать изменения из ветки 'main' репозитория 'origin' и слить их с текущей локальной веткой
git pull origin main

# Короткая версия, если upstream настроен для текущей ветки
git pull

Будьте готовы к тому, что git pull может привести к конфликтам слияния, если вы и кто-то другой редактировали одни и те же участки кода в разных коммитах. Git сообщит об этом и отметит конфликтующие места в файлах. Вам нужно будет вручную разрешить эти конфликты, затем добавить (git add) исправленные файлы и завершить слияние (часто это делается новым коммитом). Иногда вместо merge при pull используется rebase (git pull --rebase), что сохраняет историю более линейной.


git fetch

Команда используется для загрузки обновлений из удаленного репозитория в ваш локальный репозиторий. В отличие от git pull, git fetch не сливает изменения автоматически в вашу текущую ветку. Вместо этого она загружает все обновления, которые затем можно просмотреть и слить вручную.

git fetch origin

git branch

Управляет ветками в вашем репозитории. Ветки - это независимые линии разработки, позволяющие работать над новой функциональностью или исправлением ошибок, не затрагивая основной стабильный код (например, в ветке main или master). Команда git branch без аргументов покажет список всех локальных веток и отметит текущую звездочкой.

# Показать все локальные ветки
git branch

# Создать новую ветку с именем 'new-feature'
git branch new-feature

# Удалить ветку (безопасно - не даст удалить, если изменения не слиты)
git branch -d old-feature

# Удалить ветку принудительно (опасно - можно потерять изменения)
git branch -D very-old-feature

# Показать все ветки (локальные и удаленные)
git branch -a

# Показывает только удалённые ветки
git branch -r

# Создаёт ветку на указанном коммите или теге
git branch <name> <commit>

Создание веток - дешевая операция в Git. Не бойтесь создавать их для каждой новой задачи. Это изолирует вашу работу и упрощает процесс ревью и слияния кода. Следите за количеством старых веток и удаляйте те, что уже не нужны, чтобы не захламлять репозиторий.


git checkout

Эта команда используется для переключения между ветками или восстановления файлов в рабочем каталоге до состояния из определенного коммита или индекса. Это одна из самых многозадачных (и потому иногда путающих) команд в Git. Основное применение - переход на другую ветку для работы над ней.

# Переключиться на существующую ветку 'develop'
git checkout develop

# Создать новую ветку 'hotfix' и сразу переключиться на неё
git checkout -b hotfix

# Отменить изменения в файле 'config.yml' до состояния последнего коммита
git checkout -- config.yml

# Переключение на конкретный коммит
git checkout <commit-hash>

# Восстановление всех файлов до состояния последнего коммита
git checkout -- .

Использование git checkout -- файл опасно, так как отменяет все незакоммиченные изменения в файле безвозвратно. Будьте уверены, что делаете это намеренно. Из-за многозначности checkout, в новых версиях Git появились команды git switch (для переключения веток) и git restore (для восстановления файлов), которые делают код более читаемым и безопасным. Но checkout всё ещё очень распространён.


git switch

Более современная и безопасная альтернатива git checkout для переключения между ветками. Эта команда создана специально для работы с ветками, что делает намерения в коде более ясными и снижает риск случайной потери данных при восстановлении файлов (так как switch этим не занимается).

# Переключиться на существующую ветку 'feature/auth'
git switch feature/auth

# Создать новую ветку 'bugfix/login-issue' и переключиться на неё
git switch -c bugfix/login-issue

# Вернуться на предыдущую ветку
git switch -

Если вы используете свежую версию Git, рекомендуется отдавать предпочтение git switch для переключения веток вместо git checkout. Это делает ваши скрипты и ручные операции более понятными и менее подверженными ошибкам.


git restore

Команда git restore предназначена для восстановления файлов из индекса или коммитов, заменяя собой некоторые функции git checkout и git reset. Она делает работу с откатом изменений более понятной и явной.

# Отменяет локальные изменения. Никак не влияет, если файл в индексе
git restore <file>

# Убирает файл из индекса (не трогает рабочую директорию)
git restore --staged <file>

# Убирает все файлы из индекса (не трогает рабочую директорию)
git restore --staged .

# Похоже на команду git checkout -- .. Восстанавливает все файлы в текущем каталоге и подкаталогах
git restore -- .

git merge

Сливает изменения из одной ветки в другую. Обычно вы переключаетесь на ветку, в которую хотите влить изменения (например, main или develop), а затем выполняете git merge с указанием ветки, из которой хотите забрать изменения (например, ваша feature ветка). Git попытается автоматически объединить истории.

# Переключаемся на основную ветку
git switch main

# Вливаем изменения из ветки 'new-feature' в 'main'
git merge new-feature

Если конфликтов нет, Git создаст новый "коммит слияния" (merge commit), у которого будет два родительских коммита. Если есть конфликты, Git остановит процесс, отметит конфликты в файлах, и вам нужно будет разрешить их вручную, добавить исправленные файлы (git add) и завершить слияние командой git commit. Слияние - ключевой процесс интеграции работы разных разработчиков или разных фич.


git rebase

Альтернатива merge. Позволяет "переписать" историю, подставив коммиты ветки поверх другой. Используется для чистой истории без лишних merge-коммитов.

# переключаемся на ветку
git checkout feature

# так же вливаем изменения
git rebase main

После завершения - git push --force, если история уже была опубликована.


git log

Показывает историю коммитов текущей ветки, начиная с самого последнего. Вы увидите хеш каждого коммита, автора, дату и сообщение коммита. Это основной инструмент для изучения истории проекта, понимания, кто и когда внес определенные изменения. git log имеет множество опций для форматирования вывода.

# Показать стандартный лог
git log

# Показать лог в более компактном виде (одна строка на коммит)
git log --oneline

# Показать лог с графическим представлением веток и слияний
git log --graph --oneline --decorate

# Показать лог изменений для конкретного файла
git log имя_файла.py

# Показать последние 5 коммитов
git log -n 5

# Фильтрация коммитов по автору
git log --author="Ivan"

# Фильтрация коммитов по дате
git log --since="2020-22-07" --until="2021-22-08"

# Показывает коммиты, затрагивающие конкретный файл
git log index.html

# Показывает только имена изменённых файлов
git log --name-only

Изучение git log и его опций - очень полезный навык. Он помогает не только смотреть историю, но и находить конкретные коммиты, например, чтобы отменить их (git revert) или посмотреть изменения (git show).


git diff

Показывает разницу между различными состояниями: между рабочим каталогом и индексом (staging area), между индексом и последним коммитом, между двумя коммитами или ветками. Это незаменимый инструмент для просмотра изменений перед их добавлением (git add) или коммитом (git commit).

# Показать изменения в рабочем каталоге, которые еще НЕ добавлены в индекс (unstaged changes)
git diff

# Вывести изменения только для определенного файла
git diff index.html

# Показать изменения, которые добавлены в индекс, но еще НЕ закоммичены (staged changes)
git diff --staged
# или
git diff --cached

# Показать разницу между двумя коммитами
git diff 1a2b3c4 5d6e7f8

# Показать разницу между двумя ветками
git diff main develop

# Сравнивает все файлы с расширением .css
git diff -- *.css

Используйте git diff перед git add . или git commit -a, чтобы точно понимать, какие изменения вы собираетесь зафиксировать. Это помогает избежать случайного коммита отладочного кода или нежелательных изменений. Также git diff часто используется при код-ревью для просмотра конкретных изменений между ветками.


git difftool

Команда позволяет использовать внешние дифф-утилиты для просмотра различий между файлами, а также менять код внутри файла. git difftool является дополнением команды git diff, но главное отличие - она умеет также и редактировать файлы.

git difftool

git stash

Временно сохраняет ваши незакоммиченные изменения (как из рабочего каталога, так и из индекса), чтобы вы могли переключиться на другую ветку или выполнить другую операцию, не теряя свою текущую работу. Это как положить свою работу на полку, чтобы потом вернуться к ней. После того как вы закончили с другими делами, вы можете вернуть сохраненные изменения обратно.

# Отправка изменений в стэш
git stash

# Сохранить текущие незакоммиченные изменения в 'stash'
git stash save "Работа над интерфейсом пользователя" # Необязательное сообщение

# Показать список сохраненных состояний ('stashes')
git stash list

# Применить последние сохраненные изменения и удалить их из списка stash
git stash pop

# Применить последние сохраненные изменения, но оставить их в списке stash
git stash apply

# Удалить последнее сохраненное состояние из списка
git stash drop

# Очистка всех стэшей
git stash clear

git stash - это спасение, когда вам срочно нужно переключиться на другую задачу (например, исправить баг в продакшене), но ваша текущая работа еще не готова к коммиту. Только не забывайте про сохраненные изменения в stash, со временем там может накопиться много всего, и будет сложно вспомнить, что к чему относится.


git reset

Команда с несколькими режимами, используемая в основном для отмены изменений. Она может перемещать указатель HEAD (и текущей ветки) на другой коммит, а также опционально изменять индекс (staging area) и рабочий каталог. Это мощная, но потенциально опасная команда, особенно в режиме --hard.

# Отменить 'git add' для файла (убрать из индекса, но оставить изменения в рабочем каталоге)
git reset HEAD имя_файла
# или более современный вариант: git restore --staged имя_файла

# Откатить последний коммит, но оставить изменения в рабочем каталоге и индексе (--soft)
git reset --soft HEAD~1

# Откатить последний коммит, оставить изменения в рабочем каталоге, но убрать из индекса (--mixed - это режим по умолчанию)
git reset HEAD~1

# Откатить последний коммит И УДАЛИТЬ все связанные с ним изменения из рабочего каталога и индекса (--hard - ОПАСНО!)
git reset --hard HEAD~1

Используйте git reset с осторожностью, особенно --hard, так как он безвозвратно удаляет незакоммиченные изменения. git reset также используется для отмены коммитов, которые еще не были отправлены на удаленный сервер. Если коммит уже опубликован (git push), для его отмены лучше использовать git revert, чтобы не переписывать общую историю.


git revert

Команда git revert используется для отката изменений, создавая новый коммит, который "отменяет" изменения, внесённые ранее указанным коммитом. Это безопасный способ отката, потому что он не переписывает историю (в отличие от git reset).

# Откатывает указанный коммит, создавая новый коммит с обратными изменениями
git revert <commit>

# Позволяет редактировать сообщение коммита перед сохранением
git revert --edit (-e)

# Применяет revert без изменения сообщения
git revert --no-edit

# Применяет изменения в рабочую область, но не создаёт коммит
git revert --no-commit (-n)

# Продолжает процесс после разрешения конфликтов
git revert --continue

# Прерывает процесс revert и возвращает всё к исходному состоянию
git revert --abort

# Выходит из режима revert без изменений
git revert --quit

# Используется при откате merge-коммита; указывает, какую родительскую ветку считать основной (например, 1 или 2)
git revert --mainline <n>

git remote

Команда git remote используется для управления удалёнными репозиториями в Git.

# Выводит список имён удалённых репозиториев c URL-ом
git remote -v

# Добавление удалённого репозитория
git remote add <name> <url>

# Удаление удалённого репозитория
git remote remove <name>

# Переименование удалённого репозитория
git remote rename <old-name> <new-name>

# Изменение URL удалённого репозитория
git remote set-url <name> <new-url>

git tag

Команда git tag используется для создания, просмотра и управления тегами в Git. Теги - это метки, которые обычно используются для обозначения стабильных версий проекта (например, v1.0.0, v2.1.3 и т.д.).

# Выводит список всех тегов
git tag

# Создаёт аннотированный тег с сообщением
git tag -a <tagname> -m "message"

# Создаёт тег на определённом коммите
git tag <tagname> <commit>

# Показывает информацию о теге: автор, дата, сообщение, изменения
git show <tagname>

# Показывает список тегов с кратким сообщением (если есть)
git tag -n

# Отправляет указанный тег на удалённый репозиторий
git push origin <tagname>

# Удаляет тег из локального репозитория
git tag -d <tagname>

# Удаляет тег из удалённого репозитория
git push origin --delete <tagname>

git cherry-pick

Команда git cherry-pick позволяет применить один или несколько конкретных коммитов из одной ветки на другую. Это удобно, если нужно перенести только определённые изменения, а не всю ветку целиком.

# Применяет указанный коммит на текущей ветке
git cherry-pick <commit>

# Применяет все коммиты между commit1 и commit2 (включая commit2, исключая commit1)
git cherry-pick <commit1>..<commit2>

# Применяет все коммиты от commit1 до commit2 включительно
git cherry-pick <commit1>^..<commit2>

# Позволяет редактировать сообщение коммита перед применением
git cherry-pick --edit (-e)

# Применяет изменения в индекс, но не создаёт коммит
git cherry-pick --no-commit (--n)

# Продолжает процесс после разрешения конфликтов
git cherry-pick --continue

# Отменяет cherry-pick и возвращает всё к исходному состоянию
git cherry-pick --abort

# Выходит из процесса cherry-pick без изменений
git cherry-pick --quit

Source: Habr