===== Работа с Git ===== ==== Команды для работы с git ==== Клонировать репозиторий с сервера: git clone path :!: path - путь к репозиторию, заканчивающийся .git. Сохраняем изменения в локальном репозитории с комментарием initial commit: git add . git commit -m 'initial commit' //Точка означает, что все изменения в текущей папке будут подготовлены к коммиту// Отправить изменения на сервер: git push -u origin master :!: После выполнения такой команды, следующий push можно выполнять просто: //git push// \\ :!: origin - название удаленного репозитория по умолчанию. Забрать изменения с сервера: git pull :!: git pull также скачает ветки из удаленного репозитория в случае, если их ещё нет в локальном. Узнать версию Git: git --version Установить имя пользователя: git config --global user.name "Evgeniy Kudryashov" Установить email пользователя: git config --global user.email "e.kudryashov@outlook.com" Просмотреть конфигурацию: git config --list Статус текущей папки как репозитория: git status Инициализировать репозиторий: git init // При этом создастся папка .git, в которой и будет храниться вся история репозитория // Информация о последнем коммите и его содержимом: git show // Выход из просмотра информации о коммите: q // История коммитов: git log Добавление файлов в индекс: git add file Установить в локальном репозитории связку с удаленным репозиторием: git remote add origin https://project-url/project.git Просмотреть - какой удаленный репозиторий настроен: git remote -v Удалить путь к настроенному удаленному репозиторию: git remote remove origin Создать новую ветку и переключиться в нее git checkout -b branch-name-here Переключиться на ветку master git checkout master Создать новую ветку git branch branch-name-here Посмотреть - какие есть ветки в локальном проекте git branch Посмотреть - какие есть ветки и в локальном проекте, и в удаленном (локальные - зеленые, удаленные - красные) git branch -a Отправить ветвь в удаленный репозиторий git push -u origin branch-name-here :!: Имена локальных веток и удаленных - могут не совпадать, но принято делать их такими же, чтобы не запутаться. Сохранить изменения в ветке, которые коммитить пока не нужно: git stash :!: При этом можно будет переключаться на другую ветку, а файлы в текущей ветке будут выглядеть как до внесения изменений.\\ :!: Изменения можно откладывать сколько угодно раз. Посмотреть список всех сохранений: git stash list Чтобы вернуть изменения вновь можно командой: git stash pop :!: Если были внесены дополнительные изменения в файл после сохранения изменений командой //git stash//, то будет произведен автоматический merge нового коммита с тем, что было в stash. \\ :!: В случае, если изменений было несколько, то команда git stash pop вернет последнее. Чтобы выполнить еще одно возвращение - нужно выполнить команду еще раз (столько раз, сколько нужно откатов).\\ :!: Изменения можно переносить сразу в другую ветку, тогда pop нужно делать из неё. Чтобы отказаться от изменений и удалить их, выполняем команду, где NUMBER - номер изменения: git stash drop NUMBER Влить другую ветку в текущую ветку (где BRANCH-NAME - имя вливаемой ветки): git merge BRANCH-NAME :!: При этом будет создан коммит слияния. Установить редактор разрешения конфликтов для git (к примеру, meld): git config --global merge.tool meld Запустить редактор разрешения конфликтов (когда конфликт уже существует): git mergetool Просмотреть изменения, которые были внесены в файл перед коммитом: git diff file-name Просмотреть все изменения: git diff Просмотреть изменения между более ранним коммитом и поздним в файле file-name: git diff early-commit-name later-commit-name file-name :!: Можно поменять местами коммиты, тогда изменения будут отображаться в обратном порядке. \\ :!: Можно указывать первые символы коммита, а не полный хеш (скажем, 4 символа). Посмотреть изменения всех файлов в рамках коммита проекта: git diff early-commit-name later-commit-name :!: Можно сравнивать коммиты из разных веток. Т.к. хеши уникальные - указывать названия веток необязательно.\\ :!: Команда //git diff// прекрасно умеет сранивать файлы и за пределами репозитория. Сравнить коммит с текущей версией: git diff commit-name Посмотреть кем вносились изменения в конкретный файл (и когда): git blame file-name Удалить изменения, которые ещё не были закоммичены: git restore file-name Удалить изменения в файле, кототрый был закоммичен: git restore --staged file-name git restore file-name Удаление всех не закоммиченых изменений (в т.ч. тех, которые не были добавлены в индекс): git reset --hard :!: Команда не удаляет файлы, которые не отслеживаются. Чтобы удалить файлы из репозитория, которые не отслеживаются, можно использовать команду: git clean -f :!: Использовать с осторожностью - удаленные изменения восстановить не получится. Удалить файл из отслеживания: git rm --cached file-name :!: При этом, файл нужно добавить в //.gitignore// \\ :!: Эти изменения всё равно нужно закоммитить. После этого они не будут отслеживаться. Вернуться к определенной версии файла из конкретного коммита: git checkout commit-name file-name Если мы хотим удалить эти изменения, мы можем выполнить: git restore --staged file-name git restore file-name :!: Файл будет возвращен к версии из коммита и добавлен в индекс. Отменить конкретный коммит: git revert commit-name :!: При этом, будет отменен конкретный коммит, а последующие отменены не будут. \\ :!: Если надо отменить несколько коммитов, то просто последовательно выполняем //git revert// (можно с опцией --no-commit, чтобы не коммитить каждый раз, а сделать единственный коммит). \\ :!: Изменения, сделанные с помощью revert тоже нужно коммитить. Мягкий режим отката изменения (откатит коммит, изменения будут добавлены в индекс): git reset --soft commit-name Смешанный режим отката изменений (откатит коммит, изменения не будут добавлены в индекс): git reset commit-name :!: Смешанный режим - это режим работы команды по умолчанию, поэтому параметр не нужен. Сбросить один коммит в смешанном режиме: git reset HEAD~1 Жёсткий режим сброса (все последующие коммиты будут удалены): git reset --hard commit-name :!: commit-name - имя коммита, до которого мы сбрасываем ветку (т.е. сам этот коммит станет HEAD). \\ :!: Использовать очень осторожно, изменения будут потеряны. Исправить ошибку в сообщении коммита: git commit --amend -m 'new_comment' Добавить файл в проведенный коммит без редактирования сообщения коммита: git commit --amend --no-edit Отменить слияние веток: git reset --merge commit-name :!: commit-name - имя коммита, предшествовавшего слиянию. Отменить слияние, если произошёл конфликт: git merge --abort Переименовать ветку: git branch -m new-name Удалить ветку: git branch -d branch-name :!: Данная команда не удалит ветку, если она не будет влита куда-то ещё. Принудительно удалить ветку, даже если она не влита: git branch -D branch-name Удалить ветку в удаленном репозитории: git push -u origin --delete branch-name ==== Состояния файлов git ==== * //commited// - файл сохранен с изменениями (закоммичен)\\ * //not staged// - в файл внесены изменения, но он не подготовлен к коммиту\\ * //staged// - файл подготовлен к коммиту (командой //git add file//)\\ ==== Не сохранять в репозитории ==== *//Логи// \\ *//Пользовательские файлы// - аватары, картинки, загруженные пользователями и т.д. \\ *//Файлы среды разработки// - конкретные настройки среды разработки конкретного пользователя. \\ *//Внешние библиотеки// - сторонние библиотеки, которые можно скачать в интернете. \\ *//Локальные файлы конфигураций// - с исключением для незаполненных файлов. \\ *//Специальные файлы ОС// - к примеру, //desktop.ini// \\ *//Слишком большие файлы// - бинарные и т.д. :!: исключить файлы из репозитория можно, создав в нём файл //.gitignore// В этом файле можно перечислять не только названия файлов, но и использовать маски, например: *.log А также можно делать исключения для конкретных файлов (к примеру, если мы забанили все файлы с определенным расширением). Для этого используем восклицательный знак. Пример: !logs/sample.log :!: //При этом нельзя включить в исключения файл из папки, которая исключена целиком.// ---- ==== Работа git с SSL ==== Отключить все проверки SSL для клиента git. //:!: (НЕ БЕЗОПАСНО для постоянной работы)// git config --global http.sslVerify false # Do NOT do this! Использовать хранилище сертификатов Windows вместо собственного. git config --global http.sslBackend schannel {{tag>DevOPS GIT}}