Git (Русский)
- «Я встречал людей, которые думали, что git — это фронтенд для GitHub. Они ошибались: git — это фронтенд для AUR» — Линус Т.
Git — система управления версиями (VCS), созданная Линусом Торвальдсом, создателем ядра Linux. Git используется во множестве проектов, в том числе для управления исходным кодом ядра Linux. Также Git используется для управления файлами сборки пакетов в официальных репозиториях Arch и в AUR.
Установка
Установите пакет git. Также доступна разрабатываемая версия git-gitAUR. Для использования некоторых инструментов (таких как git svn, git gui или gitk) понадобится установить опциональные зависимости.
Графические интерфейсы
Смотрите также git GUI Clients.
- Giggle — GTK-фронтенд для git.
- GitAhead — Графический интерфейс для git со встроенным Merge Tool.
- GitButler — Клиент git на базе Tauri/Rust/Svelte.
- Git Cola — Изящный и мощный графический интерфейс для Git, написанный на Python.
- Git Extensions — Графический интерфейс для Git, позволяющий управлять им без использования командной строки.
- gitg — Клиент GNOME для просмотра репозиториев git. Входит в состав gnome-extra.
- git-gui — Графический интерфейс для Git на базе Tcl/Tk.
- https://git-scm.com/docs/git-gui || git + tk
- Примечание: Для включения проверки правописания в git-gui установите aspell и словарь, соответствующий языку из переменной окружения
LC_MESSAGES
(FS#28181).
- GitHub Desktop — Графический интерфейс на базе Electron, созданный командой GitHub.
- gitk — Просмотрщик репозиториев Git на базе Tcl/Tk.
- Gittyup — Клиент Git на базе Qt.
- Guitar — Графический клиент Git.
- gitui — Быстрый консольный интерфейс для git, написанный на Rust.
- Kommit — Клиент Git для KDE.
- lazygit — Простой консольный интерфейс для команд git.
- QGit — Графический инструмент для просмотра истории ревизий, содержимого патчей и изменённых файлов, графического отслеживания различных веток разработки.
- RabbitVCS — Набор графических инструментов, написанных для обеспечения простого и понятного доступа к используемым вами системам контроля версий.
- Sublime Merge — Клиент Git от создателей Sublime Text.
- Tig — Консольный интерфейс для git на базе ncurses.
- ungit — Обеспечивает удобство работы с git, не жертвуя при этом универсальностью git.
Настройка
Перед использованием Git как минимум укажите свои имя и почту, которые будут добавляться в создаваемые вами патчи и коммиты:
$ git config --global user.name "John Doe" $ git config --global user.email "johndoe@example.com"
Смотрите Введение - Первоначальная настройка Git.
Примеры дополнительных настроек есть в разделе #Советы и рекомендации.
Использование
Git-репозиторий находится в каталоге .git
, в нём хранится история ревизий и другие метаданные. Каталог, который отслеживается этим репозиторием (по умолчанию родительский), называется рабочим каталогом. Изменения в рабочем дереве должны быть добавлены в индекс (staged), прежде чем они будут записаны (commit) в репозиторий. Git также позволяет отменять изменения в файлах, восстанавливая их старые версии из ранее созданных коммитов.
Смотрите Введение - О системе контроля версий.
Получение Git-репозитория
Смотрите Основы Git - Создание Git-репозитория.
Запись изменений
Смотрите Основы Git - Запись изменений в репозиторий.
Просмотр истории изменений
Смотрите Основы Git - Просмотр истории коммитов.
Операции отмены
Смотрите Основы Git - Операции отмены.
Работа с удалёнными репозиториями
Смотрите Основы Git - Работа с удалёнными репозиториями.
Ветвление
Смотрите Ветвление в Git - О ветвлении в двух словах.
Основы ветвления и слияния
Смотрите Ветвление в Git - Основы ветвления и слияния.
Управление ветками
Смотрите Ветвление в Git - Управление ветками.
Работа с ветками
Смотрите Ветвление в Git - Работа с ветками.
Удалённые ветки
Смотрите Ветвление в Git - Удалённые ветки.
Перебазирование
Смотрите Ветвление в Git - Перебазирование.
Совместная работа
Распределённый рабочий процесс
Смотрите Распределённый Git - Распределённый рабочий процесс.
Участие в проекте
Смотрите Распределённый Git - Участие в проекте.
Сопровождение проекта
Смотрите Распределённый Git - Сопровождение проекта.
Инструменты Git
Выбор ревизии
Смотрите Инструменты Git - Выбор ревизии.
Интерактивное индексирование
Смотрите Инструменты Git - Интерактивное индексирование.
Припрятывание и очистка
Смотрите Инструменты Git - Припрятывание и очистка.
Подпись
Смотрите Инструменты Git - Подпись.
Поиск
Смотрите Инструменты Git - Поиск.
Перезапись истории
Смотрите Инструменты Git - Перезапись истории.
Раскрытие тайн reset
Смотрите Инструменты Git - Раскрытие тайн reset.
Продвинутое слияние
Смотрите Инструменты Git - Продвинутое слияние.
Rerere
Смотрите Инструменты Git - Rerere.
Обнаружение ошибок с помощью Git
Смотрите Инструменты Git - Обнаружение ошибок с помощью Git.
Подмодули
Смотрите Инструменты Git - Подмодули.
Создание пакетов
Смотрите Инструменты Git - Создание пакетов.
Замена
Смотрите Инструменты Git - Замена.
Хранилище учётных данных
Смотрите Инструменты Git - Хранилище учётных данных.
Советы и рекомендации
Использование git-config
Git считывает свои настройки из четырёх INI-подобных файлов:
-
/etc/gitconfig
для общесистемных настроек -
~/.gitconfig
и~/.config/git/config
(с версии 1.7.12) для пользовательских настроек -
.git/config
для настроек, специфичных для конкретного репозитория
Можно редактировать эти файлы напрямую, но обычно лучше использовать git config; ниже приведены несколько примеров.
Список текущих установленных переменных:
$ git config {--local,--global,--system} --list
Изменение редактора по умолчанию на nano:
$ git config --global core.editor "nano -w"
Изменение действия по умолчанию при выполнении git push:
$ git config --global push.default simple
Изменение инструмента git difftool (по умолчанию meld):
$ git config --global diff.tool vimdiff
Подробнее смотрите git-config(1) и Конфигурация Git.
Этикет
- Если вы собираетесь внести свой вклад в существующий проект, прочитайте и поймите его лицензию, поскольку она может существенно ограничивать ваши возможности по изменению кода. Некоторые лицензии могут порождать споры о праве собственности на код.
- Подумайте о сообществе проекта и о том, насколько хорошо вы сможете в него вписаться. Чтобы почувствовать направление развития проекта, почитайте любую документацию и даже историю коммитов.
- Если вы собираетесь предложить внести свои изменения в проект (отправить патч), старайтесь делать эти изменения минимальными и хорошо документированными; это поможет сопровождающим понять их и решить, стоит ли принять их или попросить вас внести поправки.
- Если предложенное вами изменение отклонено, не расстраивайтесь; в конце концов, это их проект. Если это важно, обсудите причины отклонения как можно более чётко и терпеливо: может быть, в процессе обсуждения вы найдёте устраивающее всех решение.
Ускорение аутентификации
Если вам не нравится ручная аутентификация при каждом обращении к Git-серверу, есть способы упростить её.
- Если вы аутентифицируетесь с помощью ключей SSH, используйте агент SSH. Смотрите также OpenSSH (Русский)#Увеличение скорости SSH и OpenSSH (Русский)#Поддержание подключения.
- Если вы аутентифицируетесь с помощью имени пользователя и пароля, перейдите на ключи SSH, если сервер поддерживает SSH, в противном случае используйте git-credential-libsecret, или попробуйте git-credential-cache или git-credential-store.
Использование git-credential-libsecret
Git может считывать учётные данные из поддерживающего org.freedesktop.secrets хранилища ключей, например GNOME Keyring, KeePassXC или KDE Wallet. Если вы используете такое хранилище, убедитесь, что оно зарегистрировано в dbus:
$ dbus-send --session --print-reply --dest=org.freedesktop.DBus / \ org.freedesktop.DBus.GetConnectionUnixProcessID \ string:org.freedesktop.secrets
и затем выполните
$ git config --global credential.helper /usr/lib/git-core/git-credential-libsecret
чтобы git стал его использовать.
Использование git-credential-netrc
Git может считывать учётные данные из файла netrc. Включите его использование в git командой:
$ git config --global credential.helper /usr/share/git/credential/netrc/git-credential-netrc.perl
И создайте файл .netrc
:
~/.netrc
machine git-host login username password password
Также поддерживаются файлы, зашифрованные с помощью gpg (~/.netrc.gpg
).
Протокол по умолчанию
Если вы настроили увеличение скорости SSH, как упоминалось выше, Git через SSH может оказаться быстрее, чем HTTPS. Кроме того, некоторые серверы (например, AUR) позволяют выполнять git push только через SSH. Следующая конфигурация настроит подключение к AUR через SSH в любых репозиториях.
~/.gitconfig
[url "ssh://aur@aur.archlinux.org/"] insteadOf = https://aur.archlinux.org/ insteadOf = http://aur.archlinux.org/ insteadOf = git://aur.archlinux.org/
Автодополнение для Bash
Чтобы включить автодополнение команд git в Bash, добавьте /usr/share/git/completion/git-completion.bash
в файл настроек Bash или установите bash-completion.
Строка приглашения Git
Пакет Git предоставляет скрипт для отображения информации о репозитории в строке приглашения Bash или zsh. Для его использования выполните source файла /usr/share/git/completion/git-prompt.sh
в вашей командной оболочке и задайте строку приглашения с параметром %s
:
- Для Bash:
PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
- Для Zsh:
setopt PROMPT_SUBST ; PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '
Совет: Zsh предоставляет функциюvcs_info
, которую можно использовать в качестве альтернативы. Смотрите zshcontrib(1) § GATHERING INFORMATION FROM VERSION CONTROL SYSTEMS.
Имейте в виду, что подстановку команд необходимо экранировать; смотрите раздел Bash/Настройка приглашения#Встроенные команды. Чтобы сделать это постоянным, запишите эти команды в настройках вашей командной оболочки; смотрите Командная оболочка#Файлы настроек.
При переходе в каталог с репозиторием Git строка приглашения будет показывать название ветки. Можно включить отображение дополнительной информации через специальные переменные:
Переменная | Информация |
---|---|
GIT_PS1_SHOWDIRTYSTATE | Добавляет + при наличии изменений в индексе (staged) и * при наличии изменений не в индексе (unstaged).
|
GIT_PS1_SHOWSTASHSTATE | Добавляет $ , если что-то спрятано в git stash.
|
GIT_PS1_SHOWUNTRACKEDFILES | Добавляет % , если есть неотслеживаемые файлы.
|
GIT_PS1_SHOWUPSTREAM | Добавляет = , < , > , <> — сравнение состояния с апстримом.
|
GIT_PS1_STATESEPARATOR | Задаёт разделитель между названием ветки и символами состояния. |
GIT_PS1_DESCRIBE_STYLE | Задаёт способ отображения коммита, тега или ветки при отсоединённом (detached) HEAD. |
GIT_PS1_SHOWCOLORHINTS | Включает использование цветов при отображении. |
Подробнее о переменных можно почитать в комментариях к скрипту.
- Если у вас
$(__git_ps1)
выдаёт((unknown))
, значит в текущем каталоге есть подкаталог.git
, в котором нет репозитория. Например, такое может случиться, если вы по ошибке создали~/.git/config
вместо~/.gitconfig
. - Если в репозиториях с большим числом файлов строка приглашения появляется с заметной задержкой, причиной этого может быть включенный
GIT_PS1_SHOWUNTRACKEDFILES
, который вынужден просматривать все файлы рабочего каталога в поисках неотслеживаемых, что замедляет работу командной оболочки. Чтобы отключить его только в определённом репозитории, выполнитеgit config --local bash.showUntrackedFiles false
.
Также есть другие реализации строки приглашения Git, например bash-git-promptAUR или gittifyAUR.
Визуальное представление
Краткая статистика про количество внесённых изменений:
$ git diff --stat
История коммитов с визуальным отображением веток:
$ git log --graph --oneline --decorate
Для удобства можно создать псевдоним, например git graph:
$ git config --global alias.graph 'log --graph --oneline --decorate'
Коммиты
Откат к предыдущему коммиту (очень опасная команда, стирает все изменения в отслеживаемых файлах и сбрасывает их состояние на указанный коммит):
$ git reset --hard HEAD~
Изменение адреса удалённого репозитория:
$ git remote set-url origin git@адрес:пользователь/репозиторий.git
Или можно отредактировать .git/config
, прописав в нём новый адрес.
Добавление строки Signed-off-by (требуется в некоторых проектах):
$ git commit -s
Автоматическое добавление Signed-off-by в патчах (при использовании git format-patch коммит
):
$ git config --local format.signoff true
Ручной выбор добавляемых в индекс изменений вместо добавления файлов целиком. Полезно, если вы внесли в один файл много разных изменений и хотите разделить их на несколько небольших коммитов:
$ git add -p
Подпись коммитов
Git позволяет добавлять криптографические подписи к коммитам и тегам с помощью GnuPG. Смотрите Инструменты Git - Подпись.
export GPG_TTY=$(tty)
(или использовать pinentry-tty), иначе создание подписи завершится неудачей, если GPG в данный момент находится в заблокированном состоянии (поскольку не сможет запросить pin).Включить автоматическую подпись всех создаваемых коммитов:
$ git config --global commit.gpgSign true
Работа в отдельной ветке
Иногда сопроводители проектов просят вносить изменения не в ветке master
или main
, а в отдельной ветке, например devel
или testing
. Сперва склонируйте репозиторий как обычно.
Чтобы переключиться на другую ветку (посмотреть список веток можно с помощью команды git branch -a
):
$ git checkout -b ветка origin/ветка
Затем вносите изменения как обычно, но не забывайте периодически синхронизировать состояние локального репозитория с удалённым:
$ git pull --all $ git push --all
Отправка патчей в список рассылки
Можно отправлять письмо с патчем в список рассылки (mailing list) непосредственно через Git. Для этого установите пакеты perl-authen-sasl и perl-io-socket-ssl.
Убедитесь, что имя и почта в настройках Git заданы (смотрите раздел #Настройка).
Настройте отправку почты через ваш SMTP-сервер:
$ git config --global sendemail.smtpserver smtp.example.com $ git config --global sendemail.smtpserverport 465 $ git config --global sendemail.smtpencryption ssl $ git config --global sendemail.smtpuser foobar@example.com
После этого отправка патчей должна заработать (смотрите также OpenEmbedded: Sending the Patches via Email и git-send-email.io):
$ git add файл $ git commit -s $ git send-email --to=pacman-contrib@lists.archlinux.org --confirm=always -M -1
Работа с большим репозиторием git
При работе с большим удалённым репозиторием приходится скачивать значительный объём данных. Примеры ниже демонстрируют, как оптимизировать работу с большими репозиториями, на примере репозитория ядра Linux.
Получение репозитория целиком
Самый простой, но не очень удобный способ:
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
git clone
прервётся, продолжить её нельзя, только начинать заново.Обновлять репозиторий можно с помощью git pull
.
Получение репозитория частично
Чтобы скачать только небольшое подмножество данных, можно использовать shallow clone:
$ git clone --shallow-exclude v4.13 git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
Данная команда скачает все коммиты начиная с версии v4.14, но более старые коммиты скачивать не будет.
Скачать только самый последний снимок (но лучше по возможности просто скачайте tar-архив):
$ git clone --depth 1 git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
Можно докачать отсутствующие коммиты позже, например:
$ git fetch --tags --shallow-exclude v4.1 $ git fetch --tags --shallow-since 2016-01-01
--tags
не скачаются теги.Использование Scalar
Scalar (ранее Virtual File System for Git) позволяет получить доступ к репозиториям git без локального экземпляра.
Смотрите scalar(1).
Получение других веток
Показанные выше примеры получают данные только из master-ветки, то есть mainline-ядро. Если вы, например, хотите получить последнюю LTS-версию ядра 4.14, можно использовать такие команды:
$ git remote set-branches --add origin linux-4.14.y $ git fetch --shallow-exclude v4.14 $ git branch --track linux-4.14.y origin/linux-4.14.y
Последняя команда необязательна, но вы скорее всего хотите её выполнить. (Чтобы узнать правильное название нужной вам ветки, можно, например, заглянуть на страницу «refs» в интерфейсе gitweb.)
После этого можно переключиться на ветку:
$ git checkout linux-4.14.y
Или сделать клон в отдельном каталоге:
$ mkdir /path/to/src-4.14; cd /path/to/src-4.14 $ git clone --no-local --depth 1 -b linux-4.14.y ../linux-stable
Используйте git pull
как обычно для обновления.
Фильтрация конфиденциальной информации
Иногда программы хранят пароли не в хранилище паролей, а в открытом виде в своих файлах настроек. В таких случаях может пригодиться git clean-filters, чтобы не допустить случайного добавления конфиденциальной информации в репозиторий. Например, если есть «какой-то-dotfile» с паролем внутри, можно включить фильтр для него:
.gitattributes
какой-то-dotfile filter=remove-pass
Теперь каждый раз, когда «какой-то-dotfile» будет добавляться в репозиторий, git будет запускать фильтр «remove-pass» для этого файла перед его добавлением. Этот фильтр нужно создать в настройках, например (не забудьте отредактировать команду в соответствии с форматом вашего файла):
.git/config
[filter "remove-pass"] clean = "sed -e 's/^password=.*/#password=TODO/'"
Документация в формате HTML
Документация, отображаемая командой git help
, также доступна в виде HTML; установить её можно с помощью пакета git-htmldocsAUR. После установки можно использовать опцию -w
для открытия документации в браузере, например:
$ git help -w merge
Чтобы всегда открывать html по умолчанию, можно изменить настройки:
$ git config --global help.format html
Расширения
- gitflow-avh — Дополняет git моделью ветвления от Винсента Дриссена. Версия AVH Edition добавляет больше функциональности.
- git-extras — Некоторые утилиты для git (сводка по репозиторию, repl, генерация списка изменений, статистика по авторам коммитов и т. п.). Пользователи oh-my-zsh также могут включить плагин git-extras.
- gitmoji-cli — Интерактивный клиент на NodeJS для использования gitmoji в сообщениях коммитов.
Смотрите также
- Документация: git(1)
- Pro Git — книга на русском языке
- Git Reference на GitHub
- Git workflow: Forks, remotes, and pull requests
- Статья на VideoLAN wiki
- Git на сервере - Протоколы
- How to GitHub