User Tools

Site Tools


git

Работа с 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
git.txt · Last modified: 2023/02/15 10:13 by jp