================================================================================
GIT - Список основных команд
================================================================================
# Ссылки для обязательного прочтения:
# Git: Использование и основные схемы работы
http://rezvanov.info/whygitisbetter/#github
# Git: наглядная справка (использование основных команд)
https://marklodato.github.io/visual-git-guide/index-ru.html
--------------------------------------------------------------------------------
# Добавление файлов в индекс (примеры с разными ключами)
# https://stackoverflow.com/questions/572549/difference-between-git-add-a-and-git-add
--------------------------------------------------------------------------------
git add . - Добавить все файлы в текущей дирректории
git add -u - Добавляет измененные и удаленные (новые не добавит) = git add --update
git add -A - Добавляет все файлы относительно корня проекта = git add --all
git add :/path/to/files/ - Путь относительно корневой директории
git add --force <file> - Принудительно добавить файл в индекс (даже если он в .gitignore)
git add -p <file> - Добавление с выбором для каждого измененного фрагмента в файле
git reset HEAD - отмена добавления файлов в индекс (после "git add .")
git reset HEAD <file> - отмена добавления файла <file> (или каталога) в индекс
--------------------------------------------------------------------------------
Добавление файлов по маске
git add images/\*.jpg - Добавляем только файлы .jpg изображений из папи /images/
git add local/\*.php - аналогично для файлов .php
--------------------------------------------------------------------------------
# Удаление файлов из индекса
--------------------------------------------------------------------------------
git rm <file> - удаление файла из индекса = rm <file> + git add <file>
git rm --cached <file> - Удаление из индекса, при этом файл остался в рабочем каталоге
git rm -r <dir> - Удаление каталога из индекса = rm -r <dir> + git add <dir>
git rm -r --cached <dir> - Удаление каталога из индекса, при этом каталог остался в рабочем каталоге
git rm -rf <dir> - Удаление каталога принудительно (из git и рабочей дирректории)
# флаг -r означает рекурсивное удаление (для каталогов)
# флаг --cashed означает что изменения производятся только с индексом, но не с рабочим каталогом
# например, таким образом можно убрать файлы, чтобы затем добавить их в .gitignore
--------------------------------------------------------------------------------
# Коммиты
--------------------------------------------------------------------------------
git commit -a - добавление изменений в коммит (с вызовом редактора)
git commit -a <path> - добавление изменений (вызов редактора), но для одного или нескольких файлов
git commit -m "commit message" - добавление коммита с сообщением (без вызова редактора)
git commit -m "message" <file> - добавление коммита только для <file>
git commit -am "commit message" - добавление изменения в индекс и коммит (!только для отслеживаемых файлов)
# Заменена последнего коммита (используется если хотим еще добавить изменений в последний коммит)
git commit --amend - добавление изменений в коммит (вызов редактора)
git commit --amend --no-edit - добавление изменений в коммит (без вызова редактора)
git commit --amend -m "message" - переписать сообщение коммита
# Команда commit --amend делает следующие действия:
git reset --soft HEAD~ - передвигает ветку назад (файлы в индексе и в рабочем каталоге не изменяются)
git commit -c ORIG_HEAD - создается новый коммит из текущего индекса, описание для нового коммита берется
из старого коммита. Вернуться на старый коммит можно переключившись на ОRIG_HEAD
# Замена нескольких последних коммитов одним новым:
git reset --soft HEAD~2 - передвигаем указатель ветки на нужное количество коммитов(2)
git commit -m 'new message' - делаем новый коммит
# Создание алиаса для добавления всех изменений в индекс и создание коммита (для неотслеживаемых файлов тоже)
git config --global allias.commitall '!git add -A; git commmit'
git commitall -m 'message' - использование с добавлением сообщения для коммита
# Комманда commit работает только для отслеживаемых файлов и ранее добавленных изменений в индекс
# Коммиты создаются только для рабочего кода
# Как делать хорошие коммиты - Commit early. Commit Often.
# https://learn.javascript.ru/screencast/git#basics-good-commits
--------------------------------------------------------------------------------
# Работа с ветками:
--------------------------------------------------------------------------------
git branch - Список веток
git branch -v - Список веток с выводом hash и коммита (более детально)
git branch -a - Список всех веток (включая удаленные)
git branch -m <newname> - Переименовать текущую ветку
git branch -m <oldname> <newname> - Переименовать любую ветку
git branch feature - Создание новой ветки feature
git branch -f feature - Создние ветки, если она существует
git branch -f master <hash> - Перемещение существующей ветки на коммит c <hash>
git branch -f master fix - Ветка мастер указывает туда же куда и ветка fix
# Удаление веток:
# При удалении веток удаляется только ссылка на последний коммит,
# Сами коммиты будут удалены автоматически сбощиком мусора GIT
git branch -d <branch> - Удалить ветку (ссылку на ветку)
git branch -D <branch - Принудительное удаление ветки
# Для отметы удаления ветки (если оно было только что)
можно создать ветку с таким же названием, которая будет указывать на тот же коммит, что и удаленная:
git branch old_feature <hash>
git checkout feature - Переключение на ветку feature
git checkout -b feature - Создание новой ветки feature и переключение на нее
git checkout -b feature <hash> - Создание ветки на указанном коммите и переключение на нее
# Отмена незакоммиченных изменений (файлы в рабочем каталоге будут перезаписаны):
# - Когда поработали, но коммит не сделали (остались незакоммиченные изменения)
# - Используется, когда хотим поэкспериментировать, а затем удалить изменения
# - Используется, когда просто хотим вернуть файлы на состояние последнего коммита
git checkout -f - Отмена незакоммиченных изменений на текущей ветке
git checkout -f HEAD - Тоже самое (более наглядно, т.к. понятно откуда перезаписывается)
git checkout -f feature - Принудительное переключение на ветку (внесенные узменения будут удалены)
# git checkout <branch> при незакоммиченных изменениях:
# https://learn.javascript.ru/screencast/git#branches-checkout-modified
# 1) Если измененные файлы отличаются между ветками, git не даст переключится!
Основные решения:
- git checkout -f HEAD # удалить все изменения из рабочего каталога
- git stash # скрыть изменения в рабочей дирректор и переключится
!только потом не забыть на какой ветке сделали git stash
(git stash не привязыватся к веткам и можно перетащить спрятанные изменения не в ту ветку)
# 2) Если измененные файлы одинаковые между ветками,
git переключает на другую ветку и показывает что файлы были изменены.
Если после этого сделать "git add" и "commit", тогда изменения таких
файлов на одной ветке прилетят в другую ветку, что может быть не правильно.
(т.е. нам могут не нужны быть такие изменения в другой ветке)
! При этом изменения на ветке, из которой мы перешли потеряются.
! Если не хотим переноса изменений из файлов, сделанных на другой ветке,
тогда возвращаемся в старую ветку добавляем измененения в коммит, или делаем git stash,
затем переключаемся обратно на нужную ветку, в которой хотим поработать.
ИТОГО:
Что делать, если внесли изменения на ветке, но коммит пока делать рано,
и необходимо переключится на другую ветку (например, чтобы сделать срочный FIX)?
В данном случае переключившись на другую ветку мы рискуем перенести незакоммиченные
изменения из одной ветки в другую (потерять изменения на нужной ветке)
Решение:
- Спрятать изменения (git stash), затем переключится на нужную ветку,
поработать сделать коммит, переключится обратно на ветку, где спрятали изменения, и
вернуть спратанные изменения (git stash pop), доработать изменения и внести в коммит.
--------------------------------------------------------------------------------
# Правка истории, если сделали ошибочные коммиты в ветке master:
--------------------------------------------------------------------------------
1) Вариант:
git branch fix - создадим ветку fix на том же последнем коммите
git checkout fix - переключимся на fix
git branch -f master <hash> - Переместить ветку мастер на указанный коммит <hash>
(c флагом -f = --force)
2) Вариант:
git checkout -b fix - Создание ветки fix и переключение на нее
git checkout -B master <hash> = git branch -f master <hash> + git checkout master
# Обратная операция:
git branch -f master fix - Ветка мастер указазывает туда же куда и fix
--------------------------------------------------------------------------------
# Если ветку мастер передвинули и хотим вернуть обратно
--------------------------------------------------------------------------------
git branch -f master ORIG_HEAD - возврат ветки мастер на место где раньше был старый указатель HEAD
--------------------------------------------------------------------------------
# Восстановление файла из любого коммита или ветки:
--------------------------------------------------------------------------------
git checkout <hash> <filepath> - Восстанавление файла из коммита
git checkout <fix> <filepath> - Восстановение файла из другой ветки
# можно передать несколько файлов (путей) через пробел
# файлы восстанавливаются в индексе, и в рабочей дирректории
# Дальнейшие действия (или):
git reset <filepath> - Удалить файлы из индекса
git commmit - Добавить состояние файлов в коммит
git checkout HEAD <filepath> - Вернуть файлы в индекс и рабочий каталог из текущей ветки
git checkout <filepath> - Вернуть файлы в рабочий каталог из индекса текущей ветки
# Восстановление с указанием пути (когда возможна неопредленость)
# Пусть есть ветка мастер и раздел с именем master
git checkout -- master - Откатить файлы в каталоге "master"
все что после "--" определяется как путь
git checkout HEAD -- master - Флаги ставятся до "--"
--------------------------------------------------------------------------------
# Прятанье изменений
--------------------------------------------------------------------------------
git stash - Скрыть изменения в рабочем каталоге
Если опять сделать изменения, и снова git stash изменения опять скроются,
Все спрятанные изменения добавляются в специальный стек.
git pop - Вернуть в рабочий каталог последнее спрятанное измененение (из стека)
git stash list - Показать список сохраненных изменений в стеке (сначала последние)
# git stash
# - убирает изменения из файлов и архивирует их в .git
# - не привязывается к конкретной ветке: можно сделать git stash на одной ветке,
# затем вызвать git pop на другой и получить бяку (изменения прилетят из одной ветки в другую)
--------------------------------------------------------------------------------
# Копирование коммитов
--------------------------------------------------------------------------------
git cherry-bick <hash> - Копирование коммита на текущую ветку
(можно несколько через пробел)
--------------------------------------------------------------------------------
# Удаленные репозитории (например, GitHub, GitLab)
--------------------------------------------------------------------------------
git pull - Забираем изменения из удаленного репо
git push - Отправить ветку seodev в Удаленную ветку seodev
git push --force origin master - Принудительно перезаливаем ветку master в удаленном репозитории
git remote - Список удаленных репозиториев
git pull origin master - Получение из удаленного репозитория из удаленной ветки master в ветку master
git push origin master - Отправка в удаленный репо из ветки master в ветку master
# Слияние веток:
git merge <веткаА> - встаем на ветку, в которую нужно слить <веткуА>
git merge --abort - отмена слияния
--------------------------------------------------------------------------------
# ПРОСМОТР ИЗМЕНЕНИЙ В ФАЙЛАХ:
git diff <branch1> <branch2> <fileName> - Разница в файлах между двумя ветками
git diff --name-only <branch> - Список измененныйх файлов на текущей ветке и ветке <branch>
--------------------------------------------------------------------------------
# ПРОСМОТР СТРУКТУРЫ РЕПОЗИТОРИЯ:
--------------------------------------------------------------------------------
git log --oneline - Форматированный лог в одну строку
git log master --oneline - Просмотр для ветки master
git log --pretty=format:"%h | %an (%ae) | %ar | %s" -10 - Список 10 последних коммитов
git log --graph --oneline --all
git log --oneline -g - Просмотр информациии из reflog
git show - Просмотр информации о текущем коммите
git show HEAD - Просмотр инфо о текущей ветке
git show master - Просмотр инфо о ветке
git show <hash> - Просмотр информации о любом коммите по hash
git show <hash> --pretty-fuller - Просмотр полной информации о коммите
git show HEAD~ - Информация родителе последнего коммита
git show HEAD~~~ - Три коммита назад
git show HEAD~3 - Три коммата назад (сокращенная запись)
git show @~ = git show HEAD~ - HEAD сокращено до @
git show master~ - Аналогично от ветки
git show <hash>~ - Аналогично от <hash>
git show @~:index.html - Просмотр файла из коммита родителя
git show fix:index.html - Посмотреть файл на ветке
git show :index.html - Просмотр файла в индексе (может отличаться от HEAD)
git show :/hello - Поиск по последним коммитам по слову в описании коммита
--------------------------------------------------------------------------------
# Сборка мусора: https://learn.javascript.ru/screencast/git#branches-gc
# !Пока жив коммит, живы и находятся в базе все его родители
--------------------------------------------------------------------------------
git gc - Основная команда для сборки мусора
git fsck --unreachable - Просмотр списка недостажимых коммитов
# Если коммит был сделан менее чем две недели назад, он будет в базе:
gc.pruneExpire="2 weeks ago"
# Можно чистить данные, которые являются секретными
# или, если в коммит попали большие бинарные файлы (подробнее в видео)
--------------------------------------------------------------------------------
# Очистка рабочего каталога от неотслеживаемых файлов:
# - команда git reset --hard очищает рабочий каталог от изменененных файлов
и не трогает не отслеживаемые.
# Полная очистка каталога (включая не отслеживаемые файлы)
git reset --hard - очистка рабочего каталога от изменений (состояние последнего коммита)
git clean -df - очистка не отслеживаемых файлов (кроме файлов .gitignore)
# или
git clean -dxf - очистка не отслеживаемых файлов (кроме файлов .gitignore)
# Описание флагов для clean:
-d - удалять не только файлы, но и дирректории
-x - удалять файлы, игнорируемые в .gitignore (можно оставить)
-f - принудительное удаление
--------------------------------------------------------------------------------
# Удаление файлов и каталогов:
git rm -rf <dir> - Удалить папку из удаленного репозитория (рекурсивно, принудительно)
--------------------------------------------------------------------------------
GIT Workflow с использованием двух сайтов и Gitlab:
- Production - Боевой сайт
- Develop - Тут ведется разработка и показывается клиенту
- Gitlab - Удаленный репозиторий
--------------------------------------------------------------------------------
Полезные ссылки:
--------------------------------------------------------------------------------
https://learn.javascript.ru/screencast/git - Лучший Скринкаст по Git
https://habr.com/ru/company/mailru/blog/267595/ - 19 советов по работе с Git
http://ixrevo.me/wordpress-deployment-git/ - деплоймент Local->Remote (wordpress)
https://tproger.ru/explain/git-pull-and-git-fetch-whats-the-difference/ - pull/fetch (отличия)
https://github.com/eveness/git-and-timeweb - git (timeweb)
https://tproger.ru/translations/most-common-git-screwupsquestions-and-solutions/ - исправление ошибок
http://qaru.site/questions/58/how-do-i-rename-a-local-git-branch - переименовать ветку
https://monsterlessons.com/project/lessons/git-kak-rabotayut-vetki - ветки в гит
https://monsterlessons.com/project/lessons/git-merge-kofliktov - merge conflict (+ webstorm)
https://monsterlessons.com/project/lessons/git-izuchaem-komandy-pull-i-push - push/pull (работа с удаленными репо)
https://monsterlessons.com/project/lessons/git-nastrojki-i-aliasy - aliases/configs
https://monsterlessons.com/project/lessons/git-uchimsya-rabotat-s-pravilnym-workflow - workflow Git (+++)
https://monsterlessons.com/project/lessons/git-optimiziruem-rabotu-s-pomoshyu-gitflow - git flow
https://toster.ru/q/387110#comment_1278346 - git pull/push
http://staindb.pixarts.ru/git-cikly-i-rabota-s-xostingom-timeweb/ - Git для Timeweb
http://zencoder.ru/git/ - Список статей
https://github.com/igorcomputer/web-development/tree/master/git - Шпоргалка по GIT
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------