Сайт FSA
06.05.2021

Шпаргалка по Git

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

Для настройки Git используется команда git config. Конфигурация задаётся на 3 уровнях: уровне системы --system, уровне пользователя --global и непосредственно в репозитории. Например, указание ключа --global означает, что параметры будут сохранены в домашнем каталоге пользователя и будут использованы для всех его репозиториев (~/.gitconfig или ~/.config/git/config). По умолчанию используется ключ --local, при этом все настройки сохраняются в файле .git/config текущего репозитория. Конфигурация на каждом последующем уровне имеет более высокий приоритет, т.е. настройки внутри репозитория перекрывают настройки в домашнем каталоге пользователя, которые перекрывают системные настройки.

Изначально необходимо задать имя пользователя и адрес электронной почты, которые будут указаны в коммитах. Чтобы не указывать это каждый раз, следует добавить их глобально:

git config --global user.name "FSA"
git config --global user.email fsa@mail.com

В некоторых случаях в качестве дефолтного значения обычно предлагают текущий_пользователь@имя_хоста.

Просмотр конфигурации Git, локальной и глобальной:

git config --list
git config --list --global

Подробнее о параметрах конфигурации:

git help config

Удалить значение параметров конфигурации или даже целые секции можно так:

git config unset user.name
git config --remove-section user

Полезные опции

Текстовый редактор, который будет вызван при создании коммитов.

git config --global core.editor vim

Постраничный вывод результатов команд:

git config --global core.pager 'less -RFX'

Свои утилиты для просмотра изменений в файлах:

git config --global diff.tool kdiff3
git config --global merge.tool kdiff3

Алиасы

Добавление алиасов для часто используемых команд:

git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.co checkout
git config --global alias.st "status --short"
git config --global alias.hist "log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short"

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

Просмотр имеющихся веток и всех веток, в том числе в удалённых репозиториях:

git branch
git branch -a

Переключиться на ветку

git checkout ВЕТКА

Если необходимо переключиться на другую ветку, но некоторые файлы были изменены, то можно спрятать все изменения, которые не попали в коммиты (сохраняются только файлы, которые уже находятся в базе Git):

git stash

Восстановить сохранённые изменения:

git stash pop

Изменения сохраняются в виде стека. Просмотр сохранённых снимков:

git stash list

Просмотр ещё не влитых изменений в ветку master:

git log --no-merges master..

Редактирование коммитов

Иногда могут возникать ситуации, когда коммит уже выполнен, но оказалось, что забыли что-то исправить, например, не добавили нужные файлы. Можно отредактировать последний коммит. Точнее будет создан новый коммит, поэтому нельзя редактировать коммит, который уже был передан в другие репозитории!!! Чтобы изменить коммит, добавьте необходимые изменения для фиксации и выполните

git commit --amend --no-edit

Благодаря опции --no-edit редактор сообщения для коммита не будет вызван.

git push в несколько репозиториев

Резервных копий много не бывает. При разработке хочется обезопасить себя от потери кода, который вы написали. В этом случает можно создать несколько репозиториев. Однако для того, чтобы передать туда изменения нужно будет пушить в каждый из них. Если при этом вы не планируете получать из этих репозиториев данных, то можно воспользоваться следующим приёмом. Создаём новый удалённый репозиторий и добавляем URL для необходимых серверов:

git remote add backup gitea@MYGITSERVER:USERNAME/PROJECT
git remote set-url --add --push backup git@github.com:USERNAME/PROJECT.git
git remote set-url --add --push backup git@gitlab.com:USERNAME/PROJECT.git
git remote set-url --add --push backup git@bitbucket.org:USERNAME/PROJECT.git

В качестве изначального репозитория можно указать репозиторий-заглушку для команды git pull (например, ваш основной репозиторий). Он будет использован при попытке сделать git pull backup. Теперь с помощью команды git push backup будет производится push на серверы, которые указаны в set-url. Вместо backup можно использовать любое другое удобное имя.

Важное замечание! Не используйте этот приём для репозиториев, из которых вы планируете делать git pull. Все указанные серверы воспринимаются Git как единый репозиторий и будет создана метка в локальном репозитории для backup. Если вы создадите отдельную конфигурацию для одного из репозиториев, то при git push в backup, метка для этого репозитория не будет сдвигаться.

Удобства для работы с репозиториями

Если вы часто работаете с исходным кодом и используете Linux или любую другую систему, которая поддерживает командный интерпретатор zsh, то советую установить фреймворк, который позволит значительно упростить рутинные операции. Он позволит через командную строку ориентироваться на какой ветке Git вы находитесь, в каком состоянии находится ваш репозиторий, добавляет удобные алиасы для команд Git. Кроме этого, можно создать удобные хеши путей для своих проектов. Доступные алиасы команд можно узнать через команду alias. Я часто использую:

Кроме этих сокращений, есть ещё огромное множество. Ознакомьтесь с ним и ваша работа заметно упростится.

В первую очередь, для установки «Oh My Zsh» необходимо установить оболочку zsh. Далее обратитесь к сайту https://ohmyz.sh/ и страничке wiki (там указаны команды на установку фреймворка с помощью утилит curl, wget и tch). В качестве основной оболочки я, изначально, продолжал использовать bash и запускал zsh с помощью команды zsh, когда было необходимо, но, позднее, сделал её оболочкой по умолчанию.

Ввиду того, что я пишу код на разных языках, я не использую одну IDE. Обычно я храню исходный код в папках проектов IDE по умолчанию. В этом случае папка с проектами могут оказаться в разных папках домашнего каталога. ZSH позволяет создать хеши для определённых папок. В качестве хеша можно использовать имя проекта. Например, я разрабатываю проект SHCC в IDE Netbeans. В этом случае можно создать такую запись в ~/.zshrc:

hash -d shcc=/home/fsa/NetBeansProjects/shcc

Подобные записи я добавляю в конец файла. В этом случае, при переходе по пути ~shcc я попадаю в домашнюю папку проекта. Кроме этого, пути до файлов сокращаются до корневой папки ~shcc, что позволяет не только экономить место на экране, но и избавиться от лишней информации. Вы точно видите, что работаете с проектом с определённым именем, не важно по какому реальному пути, видите его состояние.

Фреймворк Oh My Zsh имеет множество встроенных тем для вашей командной строки на любой вкус, которые можно просмотреть на Wiki странице. Понравившуюся тему можно установить в файле .zshrc в переменной ZSH_THEME.

У меня возникает необходимость сохранить результаты работы не в один, а в несколько удалённых репозиториев. Ранее указанный метод push в несколько репозиториев не очень удобный, поскольку не позволяет что-то исправлять в отдельно взятом репозитории. Как выход, просто добавить ещё один или несколько репозиториев, например, так:

git remote add gitea gitea@MYGITSERVER:USERNAME/PROJECT

Для того, чтобы последовательно обеспечить push в репозитории можно использовать следующе две функции, разместив их в файле ~/.zshrc:

function gpa() {
    for server in $(git remote -v | cut -f1 | uniq) ; do
        echo "git push $server $@"; git push $server "$@"
    done
}

gpa производить обычный git push во все репозитории, что указаны в настройках. При необходимости можно указать дополнительные опции, например, gpa --tags --force. К сожалению запрос на добавление этой функции в «Oh My Zsh» не приняли, сославшись на то, что функции имеют достаточно разрушительный функционал и, при этом, есть возможность ввести комбинацию случайно вводя, например, gp, которая имеется в этом фреймворке. Но это не мешает добавить их себе вручную.

Глобальный .gitignore

При создании новых проектов или редактировании старых иногда необходимо, чтобы некоторые вещи никогда не попадали в репозиторий. Это могут быть, например, файлы конфигурации IDE, различные служебные файлы, где вы что-то тестируете и прочее.

Git позволяет создать глобальный файл игнорирования. Всё, что включено в этот файл будет игнорироваться в любом репозитории. Конечно, всё подряд туда добавлять не стоит и нужно внимательно проверить не создаст ли добавление очередной строки каких-либо побочных эффектов.

Задать расположение глобального файла игнорирования можно с помощью команды:

git config --global core.excludesFile '~/.gitignore'

Теперь можно создать или отредактировать указанный в команде файл ~/.gitignore. Имя и расположение файла может быть иным. Для примера исключим служебную папку среды разработки Visual Studio Code и папку .stuff, где мы будем располагать разные временные файлы (идея имени папки папки взята у Валентина Удальцова с Youtube канала «PHP Point»).

.vscode/
.stuff/

Обратите внимание, что заметки могут обновляться со временем. Это может быть как исправление найденных ошибок, так и доработка содержания с целью более полного раскрытия темы. Информация об изменениях доступна в репозитории на github. Там же вы можете оставить в Issue ваши замечания по данной заметке.


Если данная заметка оказалась вам полезной, можете поблагодарить автора финансово.