Документы для веб-разработчиков

================================================================================ 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 -------------------------------------------------------------------------------- --------------------------------------------------------------------------------