Git

Этот шпаргалка кратко описывает часто используемые команды Git для быстрой справки.

#Начало работы

#Создание репозитория

Создать новый локальный репозиторий

$ git init [имя проекта]

Клонировать репозиторий

$ git clone git_url

Клонировать репозиторий в указанную директорию

$ git clone git_url моя_папка

#Внесение изменений

Показать изменённые файлы в рабочем каталоге, подготовленные для следующего коммита

$ git status

Добавить файл в индекс (staging)

$ git add [файл]

Добавить все изменённые файлы в индекс

$ git add .

Зафиксировать все подготовленные файлы в истории версий

$ git commit -m "сообщение коммита"

Зафиксировать все отслеживаемые файлы в истории версий

$ git commit -am "сообщение коммита"

Отменить изменения в рабочем каталоге, не подготовленные к коммиту

$ git restore [файл]

Убрать файл из индекса

$ git restore --staged [файл]

Убрать файл из индекса, сохранив изменения

$ git reset [файл]

Откатить всё к последнему коммиту

$ git reset --hard

Показать разницу между изменениями и индексом

$ git diff

Показать разницу между индексом и последним коммитом

$ git diff --staged

Применить коммиты текущей ветки поверх указанной

$ git rebase [ветка]

#Конфигурация

Задать имя, которое будет прикреплено к вашим коммитам и тегам

$ git config --global user.name "имя"

Задать email, который будет прикреплён к вашим коммитам и тегам

$ git config --global user.email "email"

Включить цветной вывод Git

$ git config --global color.ui auto

Открыть глобальный конфигурационный файл в редакторе

$ git config --global --edit

#Работа с ветками

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

$ git branch

Показать все ветки, локальные и удалённые

$ git branch -av

Переключиться на my_branch и обновить рабочий каталог

$ git checkout my_branch

Создать новую ветку new_branch

$ git checkout -b new_branch

Удалить ветку my_branch

$ git branch -d my_branch

Слить ветку branchA в branchB

$ git checkout branchB
$ git merge branchA

Добавить тег к текущему коммиту

$ git tag my_tag

#Просмотр репозитория

Показать историю коммитов для активной ветки

$ git log

Показать коммиты в branchA, которых нет в branchB

$ git log branchB..branchA

Показать коммиты, изменившие файл (даже после переименования)

$ git log --follow [файл]

Показать разницу между ветками

$ git diff branchB...branchA

Показать любой объект Git в читаемом виде

$ git show [SHA]

#Синхронизация

Загрузить все ветки с удалённого репозитория

$ git fetch [псевдоним]

Слить удалённую ветку с текущей

$ git merge [псевдоним]/[ветка]
# Без fast-forward
$ git merge --no-ff [псевдоним]/[ветка]
# Только fast-forward
$ git merge --ff-only [псевдоним]/[ветка]

Отправить локальные коммиты на удалённый репозиторий

$ git push [псевдоним] [ветка]

Загрузить и слить изменения с отслеживаемой ветки

$ git pull

Слить конкретный коммит из другой ветки

$ git cherry-pick [id_коммита]

#Удалённый репозиторий

Добавить URL репозитория как псевдоним

$ git remote add [псевдоним] [url]

Показать имена настроенных удалённых репозиториев

$ git remote

Показать имена и URL удалённых репозиториев

$ git remote -v

Удалить удалённый репозиторий

$ git remote rm [имя]

Изменить URL удалённого репозитория

$ git remote set-url origin [git_url]

#Временные коммиты

Сохранить текущие изменения и подготовленные файлы

$ git stash

Показать список сохранённых изменений

$ git stash list

Применить верхний stash

$ git stash pop

Удалить верхний stash

$ git stash drop

#Отслеживание изменений путей

Удалить файл из проекта и подготовить удаление к коммиту

$ git rm [файл]

Переместить файл и подготовить перемещение

$ git mv [старый_путь] [новый_путь]

Показать логи коммитов с информацией о перемещённых файлах

$ git log --stat -M

#Игнорирование файлов

/logs/*

# "!" значит не игнорировать
!logs/.gitkeep

/# Игнорировать системные файлы Mac
.DS_store

# Игнорировать папку node_modules
node_modules

# Игнорировать конфигурацию SASS
.sass-cache

Файл .gitignore указывает файлы и папки, которые Git должен игнорировать

#Полезные приёмы

#Переименование ветки

  • #Переименовать в new_name

    $ git branch -m <new_name>
    
  • #Запушить и сбросить

    $ git push origin -u <new_name>
    
  • #Удалить старую ветку на удалённом репозитории

    $ git push origin --delete <old>
    

#Логи

Найти изменения по содержимому

$ git log -S'<слово_в_коде>'

Показать изменения конкретного файла со временем

$ git log -p <имя_файла>

Красивое визуальное отображение лога

$ git log --pretty=oneline --graph --decorate --all

#Ветки

Показать все ветки и их upstream

$ git branch -vv

Быстро переключиться на предыдущую ветку

$ git checkout -

Показать только удалённые ветки

$ git branch -r

Взять один файл из другой ветки

$ git checkout <ветка> -- <файл>

#Переписывание истории

Переписать сообщение последнего коммита

$ git commit --amend -m "новое сообщение"

Изменить последний коммит без изменения сообщения

$ git commit --amend --no-edit

См. также: Rewriting history

#Алиасы Git

git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status

См. также: More Aliases

#Продвинутый Git

#Подмодули

Создать новый подмодуль в репозитории:

$ git submodule add <url_репозитория> <путь>

Клонировать репозиторий и инициализировать его подмодули:

$ git clone --recursive <url_репозитория>

Обновить все подмодули до последних коммитов:

$ git submodule update

Загрузить последние изменения подмодулей:

$ git submodule update --remote

Удалить подмодуль из репозитория:

$ git submodule deinit <путь>
$ git rm <путь>
$ git commit -m "Удалён подмодуль"

#Cherry-pick

Cherry-pick позволяет применить конкретный коммит из одной ветки в другую.

$ git cherry-pick <хеш_коммита>

#Reflog

Показать историю изменений HEAD и веток:

$ git reflog

Найти хеш потерянного коммита или ветки и вернуть его:

$ git checkout <хеш_коммита_или_ветки>