Git (Русский)

Состояние перевода:
На этой странице представлен перевод статьи
Git
. Дата последней синхронизации: 24 сентября 2024. Вы можете
помочь
синхронизировать перевод, если в английской версии произошли
изменения
.
Ссылки по теме
Bisecting bugs with Git
Concurrent Versions System
Git server
Gitweb
HTTP tunneling#Tunneling Git
Subversion
VCS package guidelines
«Я встречал людей, которые думали, что git — это фронтенд для GitHub. Они ошибались: git — это фронтенд для AUR» —
Линус Т.
Git
— система управления версиями (VCS), созданная Линусом Торвальдсом, создателем ядра Linux. Git используется во множестве проектов, в том числе для управления исходным кодом ядра Linux. Также Git используется для управления файлами сборки пакетов в официальных репозиториях Arch и в
AUR
.
Установка
Установите
пакет
git
. Также доступна разрабатываемая версия
git-git
AUR
. Для использования некоторых инструментов (таких как
git svn
,
git gui
или
gitk
) понадобится установить опциональные зависимости.
Графические интерфейсы
Смотрите также
git GUI Clients
.
Giggle
— GTK-фронтенд для git.
https://wiki.gnome.org/Apps/giggle/
||
giggle
GitAhead
— Графический интерфейс для git со встроенным Merge Tool.
https://gitahead.github.io/gitahead.com/
||
gitahead
AUR
GitButler
— Клиент git на базе Tauri/Rust/Svelte.
https://gitbutler.com/
||
gitbutler
AUR
Git Cola
— Изящный и мощный графический интерфейс для Git, написанный на Python.
https://git-cola.github.io/
||
git-cola
AUR
Git Extensions
— Графический интерфейс для Git, позволяющий управлять им без использования командной строки.
https://gitextensions.github.io/
||
gitextensions
AUR
gitg
— Клиент GNOME для просмотра репозиториев git. Входит в состав
gnome-extra
.
https://wiki.gnome.org/Apps/Gitg
||
gitg
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.
https://github.com/desktop/desktop
||
github-desktop
AUR
,
github-desktop-bin
AUR
gitk
— Просмотрщик репозиториев Git на базе Tcl/Tk.
https://git-scm.com/docs/gitk
||
git
+
tk
Gittyup
— Клиент Git на базе Qt.
https://github.com/Murmele/Gittyup
||
gittyup
AUR
Guitar
— Графический клиент Git.
https://github.com/soramimi/Guitar
||
guitar
AUR
gitui
— Быстрый консольный интерфейс для git, написанный на Rust.
https://github.com/extrawurst/gitui
||
gitui
Kommit
— Клиент Git для KDE.
https://apps.kde.org/kommit/
||
kommit
lazygit
— Простой консольный интерфейс для команд git.
https://github.com/jesseduffield/lazygit
||
lazygit
QGit
— Графический инструмент для просмотра истории ревизий, содержимого патчей и изменённых файлов, графического отслеживания различных веток разработки.
https://github.com/tibirna/qgit
||
qgit
RabbitVCS
— Набор графических инструментов, написанных для обеспечения простого и понятного доступа к используемым вами системам контроля версий.
http://rabbitvcs.org/
||
rabbitvcs
AUR
Sublime Merge
— Клиент Git от создателей Sublime Text.
https://www.sublimemerge.com/
||
sublime-merge
AUR
Tig
— Консольный интерфейс для git на базе ncurses.
https://jonas.github.io/tig/
||
tig
ungit
— Обеспечивает удобство работы с git, не жертвуя при этом универсальностью git.
https://github.com/FredrikNoren/ungit
||
nodejs-ungit
AUR
Настройка
Перед использованием 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-prompt
AUR
или
gittify
AUR
.
Визуальное представление
Краткая статистика про количество внесённых изменений:
$ 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 - Подпись
.
Примечание
Чтобы использовать
pinentry
curses, необходимо выполнить
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
Note
Без опции
--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/'"
Примечание
Экранирование специальных символов в выражениях sed может оказаться
непростой задачей
в данном контексте. Помните, что git превращает два обратных слеша в один, и оболочка, которую git вызывает для выполнения команд, тоже превращает два обратных слеша в один. Подробнее:
Git filter and sed fight over `\$`
.
Документация в формате HTML
Документация, отображаемая командой
git help
, также доступна в виде HTML; установить её можно с помощью пакета
git-htmldocs
AUR
. После установки можно использовать опцию
-w
для открытия документации в браузере, например:
$ git help -w merge
Чтобы всегда открывать html по умолчанию, можно изменить настройки:
$ git config --global help.format html
Расширения
gitflow-avh
— Дополняет git
моделью ветвления от Винсента Дриссена
. Версия AVH Edition добавляет больше функциональности.
https://github.com/petervanderdoes/gitflow
||
gitflow-avh
AUR
git-extras
— Некоторые утилиты для git (сводка по репозиторию, repl, генерация списка изменений, статистика по авторам коммитов и т. п.). Пользователи
oh-my-zsh
также могут включить
плагин git-extras
.
https://github.com/tj/git-extras
||
git-extras
AUR
gitmoji-cli
— Интерактивный клиент на NodeJS для использования
gitmoji
в сообщениях коммитов.
https://github.com/carloscuesta/gitmoji-cli
||
nodejs-gitmoji-cli
AUR
Смотрите также
Документация:
git(1)
Pro Git
— книга на русском языке
Git Reference
на GitHub
Git workflow: Forks, remotes, and pull requests
Статья на VideoLAN wiki
Git на сервере - Протоколы
How to GitHub