16.1 gh не заменяет git
Самая частая путаница на старте: «зачем мне gh, если у меня уже есть git». Ответ -они про разное.
git работает с локальным .git/ и удалёнными bare-репами
через push/fetch. Он ничего не знает про pull request, issue,
Actions -этих понятий в Git как протоколе не существует. Они
живут в базе GitHub.
gh работает с GitHub API. Через REST/GraphQL он создаёт PR,
листает issues, просматривает Actions runs, скачивает релизы.
В Git как таковом этого нет.
Простой тест на путаницу: вопрос про коммиты, ветки, diff,
merge, rebase -это git. Вопрос про PR, issue, review, label,
milestone, Actions, release -это gh. Когда вопрос смешанный
(например, «открыть PR из текущей ветки»), нужны оба: git push пушит ветку, gh pr create открывает PR на ней.
Иерархия:
твой код в файлах
↓ git add, git commit
твоя локальная .git/
↓ git push
bare-репо на GitHub (origin)
↓ gh pr create
pull request в базе GitHub
Каждая стрелка -свой инструмент. Их не имеет смысла объединять
в один: они про разные слои. gh намеренно не дублирует
возможности git (push, clone, fetch).
16.2 Установка и gh auth login
Установка зависит от системы:
# macOS
brew install gh
# Ubuntu/Debian
sudo apt install gh # на свежих, иначе добавить репо cli.github.com
# Windows
winget install GitHub.cli
# или
scoop install gh
# проверка
gh --version
Полный список -в cli.github.com. На большинстве систем
процесс одной команды.
Дальше -авторизация:
gh auth login
Команда задаёт несколько вопросов:
- GitHub.com или GitHub Enterprise Server? Обычно GitHub.com.
- Protocol для git: HTTPS или SSH? Если уже настроен ssh-keys-git, выбирай SSH -gh будет работать согласованно с твоим git. Если SSH ещё нет, HTTPS проще (gh сам настроит credential helper).
- Authenticate Git с GitHub credentials? Да. gh настроит
git credential helper, чтобы
git pushчерез HTTPS не просил пароль каждый раз. - How would you like to authenticate? Login with a web browser -удобнее всего. Откроется браузер, gh покажет код, ты подтвердишь в браузере, токен сохранится локально.
После этого:
gh auth status
Покажет, под какой учёткой ты, с какими scopes. Полезно, когда пытаешься сделать что-то и получаешь permission denied -проверь сначала status.
Токен gh хранит в:
- macOS: Keychain.
- Linux: secret-service (gnome-keyring/kwallet) или
~/.config/gh/hosts.ymlв чистом виде, если keyring нет. - Windows: Credential Manager.
Это не personal access token, который ты бы создал вручную
в Settings. Это отдельный OAuth-токен, выданный gh-приложению.
Если хочешь отозвать -gh auth logout, или вручную через
GitHub Settings -> Applications -> Authorized OAuth Apps.
Несколько аккаунтов одновременно: gh auth login ещё раз с
другим аккаунтом, потом gh auth switch для переключения. На
работе это часто бывает -личный аккаунт и рабочий.
16.3 gh repo: forks, clone, create
Базовые операции с репозиториями. Что добавляет gh поверх обычного git:
gh repo clone
gh repo clone cli/cli
Эквивалент обычного git clone, но не нужно помнить URL -
достаточно owner/repo. Какой URL подставится (SSH-style
git@github.com:... или HTTPS-style https://github.com/...),
зависит от gh config get git_protocol; выбор делается во
время gh auth login или вручную через gh config set git_protocol ssh|https. Если авторизация по HTTPS, gh
настраивает credentials автоматически без ручного credential
helper'а.
gh repo fork
gh repo fork acme/web
Делает fork на GitHub и добавляет два remote локально:
origin git@github.com:me/web.git (твой fork)
upstream git@github.com:acme/web.git (оригинал)
Это то, что в upstream-vs-origin делаешь вручную из трёх команд:
# вручную:
gh api repos/acme/web/forks -X POST
git clone git@github.com:me/web.git
cd web
git remote add upstream git@github.com:acme/web.git
# эквивалент через gh:
gh repo fork acme/web --clone
Полезные флаги:
--clone-сразу склонировать локально.--remote-добавить fork как remoteoriginв существующий clone (когда ты уже работал с upstream, а потом решил сделать fork).
gh repo create
# создать новый репо из текущей директории
gh repo create my-project --public --source=. --push
# или интерактивно
gh repo create
Делает: создаёт репо на GitHub, добавляет origin, делает
первый push. В одной команде то, что обычно делаешь в три
шага.
gh repo view
gh repo view acme/web
gh repo view acme/web --web # открыть в браузере
Показывает README и базовую инфу прямо в терминале. --web
-shortcut для открытия в браузере, удобно когда быстро надо
что-то посмотреть.
16.4 gh pr: основа повседневной работы
Pull request -центральный объект GitHub-workflow, и gh pr -
главная подкоманда gh.
Создать PR
# из текущей ветки в дефолтную ветку (обычно main)
gh pr create
# с явным заголовком и описанием
gh pr create -t "fix login crash" -b "Fixes #142"
# draft PR
gh pr create --draft
# сразу укажи reviewer'ов и labels
gh pr create -r alice,bob -l bug,backend
Без флагов команда задаёт вопросы интерактивно. С флагами - одна команда без отвлечения. Описание поддерживает markdown.
Если есть .github/PULL_REQUEST_TEMPLATE.md в репо, gh
подставит его как стартовое описание. Откроется в $EDITOR,
редактируешь, сохраняешь -PR создан.
Список и поиск
gh pr list # открытые PR в текущем репо
gh pr list --state closed # закрытые
gh pr list --author "@me" # мои PR
gh pr list --label bug # с лейблом bug
gh pr list --search "is:open draft" # синтаксис поиска как в UI
Посмотреть PR в терминале
gh pr view 123 # обзор + комментарии
gh pr view 123 --comments # развёрнуто
gh pr view 123 --web # открыть в браузере
gh pr diff 123 # diff всего PR
gh pr view отлично работает на маленьких PR. На больших
diff'ах удобнее --web: терминал не покажет inline-обсуждения
по строкам так же удобно, как UI.
Скачать PR локально для review
Главная команда, ради которой стоит ставить gh:
gh pr checkout 123
Что делает:
- Находит ветку PR (включая ветки из чужих форков, недоступные
напрямую через
git fetch origin). - Создаёт локальную ветку с этим состоянием.
- Переключается на неё.
Теперь у тебя локально код из этого PR. Можешь запустить тесты,
проверить, как код работает в реальном окружении, посмотреть
diff в любимом инструменте. Без gh pr checkout это три-четыре
ручных команды: добавить remote форка, fetch, checkout, и так
далее.
Это особенно ценно для PR из чужих fork'ов: обычный git fetch origin их не видит, потому что они в чужом namespace. gh pr checkout решает это под капотом.
Слить PR
gh pr merge 123 # интерактивно: какой merge?
gh pr merge 123 --squash # squash + удалить ветку
gh pr merge 123 --rebase
gh pr merge 123 --merge # обычный merge commit
gh pr merge 123 --delete-branch # удалить ветку после
gh pr merge 123 --auto --squash # дождаться зелёных чеков, потом merge
Стратегии слияния (squash / rebase / merge) подробно -
в merge-strategies и главе 17. Флаг --auto особенно
полезен: ставишь PR на «merge когда все checks зелёные», и
возвращаешься к работе.
Закрыть без merge
gh pr close 123
gh pr close 123 --delete-branch
Полезно, когда понимаешь, что подход неправильный, и переоткроешь PR с другой стороны.
16.5 gh pr review и checks
Review через CLI. Удобно для approve/comment, не очень удобно для inline-комментариев на конкретных строках -последнее лучше делать в браузере.
gh pr review 123 --approve # approve
gh pr review 123 --request-changes -b "..." # запрос изменений
gh pr review 123 --comment -b "looks good but..." # комментарий без решения
-b "..." -тело комментария. Можно -F file.md, чтобы взять
из файла, удобно для длинных review.
Статус CI
gh pr checks 123 # таблица всех checks PR
gh pr checks 123 --watch # обновлять в реальном времени
--watch -полезно, когда ждёшь, пока тесты пройдут перед
merge'ом. Терминал показывает прогресс, ты не переключаешься
в браузер каждые 30 секунд.
Полезный сценарий: pre-merge
Перед тем как ставить --auto merge, проверь review-состояние
и checks одной командой:
gh pr view 123 --json reviewDecision,statusCheckRollup
Вернёт JSON с двумя полями: reviewDecision (APPROVED /
CHANGES_REQUESTED / REVIEW_REQUIRED) и список checks. Это
основа для самопроверки перед merge или для интеграции в
скрипты.
Limitation: inline-комментарии
gh pr review хорошо для overall verdict (approve, request
changes, общий коммент). Для построчного review (выделить
строку 42 файла foo.py, написать «здесь возможна null
pointer») браузер удобнее: drag-select по строкам, кнопка
«Add a suggestion» с diff-форматом.
Не пытайся всё делать через gh pr review --body -ты
потеряешь привязку к конкретным строкам, и автору PR будет
труднее ориентироваться.
16.6 gh issue: симметрия с pr
gh issue повторяет интерфейс gh pr для issues. Большинство
команд один-в-один:
gh issue list # открытые issues
gh issue list --state all --label bug # с фильтрами
gh issue list --author "@me"
gh issue view 142 # обзор
gh issue view 142 --comments
gh issue view 142 --web
gh issue create # интерактивно
gh issue create -t "Login crash" -b "Steps to reproduce: ..." -l bug
gh issue close 142
gh issue reopen 142
gh issue edit 142 -l "wontfix,duplicate"
gh issue edit 142 --add-assignee "@me"
Особенно удобный сценарий -создать issue из терминала, когда что-то нашёл во время работы:
gh issue create -t "TODO refactor parser" -b "context: ..." -l tech-debt
Не нужно переключаться в браузер, потом искать репо, потом открывать форму. Одна команда -issue создан.
Связь issue и PR работает через автоматическое подхватывание
ключевых слов в тексте: Closes #142, Fixes #142, Resolves #142 в описании PR -GitHub при merge'е автоматически закроет
issue. Когда пишешь PR, добавляй такую строку, чтобы не
закрывать issue вручную.
16.7 gh workflow и gh run: Actions из терминала
GitHub Actions -CI/CD платформа, живёт в .github/workflows/.
Подробности про Actions -в главе 19 (Sprint Git-5). Сейчас
достаточно знать, что gh даёт доступ к ним.
gh workflow list # все workflows в репо
gh workflow view ci.yml # детали одного
gh workflow run ci.yml # запустить вручную (если workflow поддерживает workflow_dispatch)
gh run list # история последних runs
gh run list --workflow ci.yml # только этот workflow
gh run list --branch main # только на main
gh run view 1234567 # детали run
gh run view 1234567 --log # полные логи
gh run watch 1234567 # следить в реальном времени
gh run rerun 1234567 # перезапустить failed run
gh run rerun 1234567 --failed # только failed jobs
Главное преимущество gh здесь -скорость доступа к логам. В UI ты кликаешь на run, потом на job, потом разворачиваешь шаг, ищешь нужную строку в логе. В терминале:
gh run view --log -j 5678 # лог конкретного job
gh run view --log-failed # только failed-шаги
Это особенно полезно для grep'а по логу:
gh run view 1234 --log | grep -i 'error'
Локально ты получаешь полный текстовый лог в stdout, можешь
грепать, считать вхождения, выкидывать в файл. В браузере это
делать неудобно.
16.8 Когда gh быстрее браузера, когда нет
Главное правило: gh выигрывает в скорости и повторяемости. Браузер выигрывает в визуальной проработке.
gh быстрее, когда
- Создаёшь PR из текущей ветки.
gh pr createпротив браузера: 2 секунды против 30. Каждый PR в день. - Чекаут чужого PR для тестирования.
gh pr checkout 123-одна команда, особенно ценно для PR из чужих fork'ов. - Batch-операции по списку. «Все мои открытые PR» -
gh pr list --author "@me". В UI это три-четыре клика и потом скролл. - Скрипты и автоматизация.
ghс флагом--jsonотдаёт машиночитаемый вывод, который можно скормитьjqили обрабатывать в bash. - Просмотр CI-логов.
gh run view --logплюсgrep- быстрее, чем кликать по UI. - Создание issue из контекста терминала. Не теряешь фокус.
- Создание репо из существующего каталога.
gh repo create --source=.-одна команда, не выходя из cwd.
Браузер удобнее, когда
- Code review с inline-комментариями. Тянуть мышью по строкам, ставить замечания на конкретные строки -в браузере естественно. В CLI больно.
- Обсуждения с несколькими людьми, длинные треды. Читать и форматировать markdown-треды глазами лучше в браузере.
- Большой diff с многими файлами. В UI можно переключаться между файлами, сворачивать неважные. В терминале это менее удобно.
- Изучение незнакомого репо. README + дерево файлов + быстрая навигация по примерам кода. UI заточен под это.
- Настройка repo settings. Большинство admin-операций
(branch protection, secrets, webhooks) живёт в UI. Через
gh apiможно, но это уже скриптовая территория, не повседневная. - Управление организацией. Members, teams, billing -всё в UI.
Реальный workflow
Эти два пути не конкурируют, они дополняют. Типичная сессия
выглядит так: ты пишешь код в редакторе, коммитишь, пушишь -
git push. Открываешь PR -gh pr create. Жди review -между
делом другая задача. Получил ревью -читаешь его в браузере,
потому что там inline-комментарии и контекст. Правишь код,
пушишь, прогоняешь снова git push. Чекаешь CI -gh pr checks --watch. Когда зелёно -gh pr merge --squash --delete-branch.
В этом сценарии браузер открывается один раз (на review). Всё остальное -в терминале. Это и есть «gh для скорости, браузер для визуальности».
16.9 Алиасы, JSON и скрипты
gh поддерживает алиасы и JSON-вывод. Это превращает его из «удобной обёртки» в «инструмент для автоматизации».
Алиасы
gh alias set co 'pr checkout'
gh alias set pv 'pr view --web'
gh alias set prs 'pr list --author "@me"'
# потом просто
gh co 123 # эквивалент gh pr checkout 123
gh prs # мои PR
Алиасы хранятся в ~/.config/gh/config.yml. Можно делать
сложные алиасы с подстановкой аргументов через $1, $2:
gh alias set 'lab' 'pr list --label "$1" --state open'
gh lab bug # PR с label bug
JSON-вывод
Почти любая gh команда поддерживает --json с указанием
полей:
gh pr list --json number,title,author
Вернёт массив объектов JSON. Это вход для jq или питон-
скрипта:
# сколько PR у каждого автора?
gh pr list --state all --limit 200 --json author \
| jq -r '.[].author.login' \
| sort | uniq -c | sort -rn
# все PR с автором "@me" в виде "номер - заголовок"
gh pr list --author "@me" --json number,title \
| jq -r '.[] | "#\(.number) \(.title)"'
Список доступных полей gh подскажет, если вместо имён написать что-то невалидное:
gh pr list --json wrong
# gh выведет список валидных полей
Скрипты
Простой пример -скрипт «открой все мои черновики PR в браузере»:
#!/usr/bin/env bash
gh pr list --author "@me" --search "is:draft" --json number \
| jq -r '.[].number' \
| xargs -I{} gh pr view {} --webИли «notify меня, когда CI на текущей ветке станет зелёным»:
gh pr checks --watch && notify-send "PR ready to merge"
Главное преимущество перед прямой работой с GitHub API: gh берёт на себя авторизацию, ретраи, пагинацию. Ты пишешь скрипт без думать про токены и cursors.
Для случаев, когда gh не покрывает фичу (редкие
admin-операции, custom GraphQL), есть escape hatch:
gh api repos/cli/cli/contributors --jq '.[].login'
gh api graphql -f query='...'
Это сырой доступ к REST/GraphQL API с авторизацией от gh.
Уроки в sandbox
lab-16.1. PR от первого до merge'а полностью из терминала
Цель -сделать полный цикл «изменение -> PR -> review -> merge» не открывая GitHub в браузере. Ни одного клика. Только git и gh из терминала. После лабы у тебя будет привычка «когда нужен PR, руки идут на gh, а не в браузер».
Понадобится: gh установлен, gh auth status зелёный, и
какой-нибудь репо, где у тебя есть write-доступ (свой
персональный подойдёт; если нет -создай: gh repo create gh-lab --public --add-readme --clone && cd gh-lab).
Проверь авторизацию:
gh auth status. Должен показатьLogged in to github.com account ...и список scopes (минимумrepo). Если нет -gh auth loginещё раз.Создай ветку и сделай изменение:
git switch -c feat/gh-lab-1 && echo '## Section' >> README.md && git add README.md && git commit -m 'add section to README'.Пушни ветку:
git push -u origin feat/gh-lab-1. Обрати внимание -сначалаgit push, потомgh pr create. PR ничего не знает о ветке, пока она не на сервере.Создай PR:
gh pr create -t 'add Section to README' -b 'Test from lab 16.1. Adds heading.'. Если репо без шаблона PR, команда сразу создаст PR. Если есть шаблон -откроется $EDITOR с предзаполненным телом.Получи URL созданного PR:
gh pr view --json url -q '.url'. Скопируй его, но не открывай. Просто запомни.Посмотри статус PR:
gh pr view. Увидишь номер, автора (тебя), заголовок, последние коммиты, ссылку. Это replace для «открыть PR в браузере и посмотреть на странице».Имитируй review (если ты единственный с доступом, добавь sample-review от себя):
gh pr review --approve -b 'lgtm, looks fine'. На public-репо approve от self не считается -но команда отработает и комментарий запишется.Проверь checks:
gh pr checks. Если в репо нет workflow'ов -увидишь «no checks». Это нормально для учебного репо. Если есть -увидишь таблицу check'ов с их статусом.Посмотри diff в терминале:
gh pr diff. Должен показать ровно изменение, которое ты добавил в README.md. Сравни сgit diff main..feat/gh-lab-1.Перед merge'ом ещё раз:
gh pr view. Убедись, что заголовок и описание правильные. Если нужно поправить -gh pr edit -t 'new title' -b 'new body'.Слей PR:
gh pr merge --squash --delete-branch. Команда покажет диалог подтверждения. Подтверждаешь -PR смерджен squash-стратегией, веткаfeat/gh-lab-1удалена и на сервере, и локально.Догоним main локально:
git switch main && git pull origin main. Теперь у тебя в main коммит из PR. История на main линейная, без merge-коммита, потому что squash.Посчитай, сколько раз ты переключился в браузер за этот цикл. Должно быть ноль. Все шаги -из терминала.
Сделай ещё один цикл, но теперь с фокусом на скорость. Засеки время:
timeперед каждой командой или просто посмотри на часы. Полный цикл (новая ветка -> commit -> push -> PR -> approve -> merge) в этом репо должен укладываться в минуту.Уборка: можешь удалить тестовый репо (
gh repo delete gh-lab --yes) или оставить как полигон для следующих лаб.Бонус. Попробуй то же с
--draft:gh pr create --draft. Затем поднять draft в ready:gh pr ready. Затем merge. Draft-PR -это сигнал «работа не закончена, не ревьювите»; подробности в draft-pr и главе 17.
Резюме
- gh -CLI для GitHub-фич, не замена git. git push отправляет коммиты, gh pr create открывает PR на этих коммитах. Чёткое разделение между протоколом и платформой.
- Установка через brew/apt/winget/scoop в одну команду. `gh auth login` авторизует и настраивает git credential helper. Токен хранится в keychain ОС, не в plain text.
- gh repo clone/fork/create заменяет ручные комбинации git+web. `gh repo fork --clone` за один шаг делает форк, клонирует и настраивает origin/upstream remote'ы.
- gh pr create/list/view/checkout/review/merge -сердцевина повседневной работы. `gh pr checkout N` достаёт ветку любого PR локально, включая PR из чужих fork'ов.
- gh issue симметричен gh pr. gh workflow и gh run дают доступ к Actions: запустить workflow, посмотреть логи, перезапустить failed jobs прямо из терминала.
- Когда gh быстрее: создание PR/issue, checkout чужого PR, batch-операции, скрипты, просмотр CI-логов с grep. Когда браузер: inline review, длинные обсуждения, изучение незнакомого репо, admin-настройки.
- Алиасы (`gh alias set`) сокращают длинные команды. `--json` плюс `jq` превращают gh в скриптовый инструмент. `gh api` -escape hatch для прямого вызова REST/GraphQL когда нативной команды gh не хватает.
Контрольные вопросы
Я хочу создать PR из текущей ветки. Какие именно команды и в каком порядке?
Показать ответ
Минимальная последовательность:
bashgit push -u origin HEAD # запушить текущую ветку
gh pr create # открыть PR (интерактивно)
Если нужно одной командой без вопросов:
bashgit push -u origin HEAD
gh pr create -t "fix login" -b "Fixes #142"
Почему именно так: PR живёт поверх ветки на сервере. В современных версиях
gh(2.x) команда сама заметит, что локальная ветка ещё не запушена, и предложит, в какой remote её отправить, - после чего создаст PR. Это удобно, но push-first остаётся надёжным workflow: явныйgit push -u origin HEADставит upstream так, как ты хочешь, а не как gh угадает. И в редких сценариях (старый gh, неинтерактивный режим в CI)gh pr createвсё ещё ругнётся «no commits between main and feat/x», если ветки на remote нет.Полезный алиас, если делаешь это часто:
bashgh alias set new 'pr create --fill'
--fillберёт заголовок и тело из последнего коммита. Сделал хороший коммит -PR создаётся одной командой без редактора:bashgit push -u origin HEAD && gh new
Коллега открыл PR из своего форка. Я хочу запустить его код у себя локально, чтобы протестировать. Как?
Показать ответ
Одна команда:
bashgh pr checkout 123
Что произойдёт: gh найдёт ветку из чужого форка, создаст у тебя локальную ветку с этим состоянием, переключится на неё. Теперь у тебя в working tree код этого PR. Можешь запускать тесты, проверять как работает в твоём окружении, заглядывать в файлы.
Почему обычный
git fetch origin && git checkout pr-branchне сработает: ветка PR живёт в чужом форке, не вorigin.originзнает только свои ветки. Для доступа к чужому форку пришлось бы добавлять его как remote вручную:git remote add contrib git@github.com:contributor/repo.git && git fetch contrib && git checkout contrib/feat/x. Три команды против одной.После проверки вернись на main:
git switch main. Веткаfeat/xостанется локально, можешь удалить черезgit branch -D feat/x-или оставить на следующий цикл review.Хочу автоматически merge'ить PR, как только CI станет зелёным, без ручного клика. Можно?
Показать ответ
Да:
bashgh pr merge 123 --auto --squash --delete-branch
--autoставит PR в режим «auto-merge»: GitHub дождётся, пока все required checks пройдут и все required reviews апрувнут, и только потом сольёт. Если что-то fail'нется, auto-merge отменится, и нужно будет пушить новые коммиты или переоткрывать.Ограничения:
- Auto-merge должен быть включён в Settings репо (Pull Requests -> Allow auto-merge).
- Если у PR нет required reviews/checks, auto-merge сработает
мгновенно, как только ты добавишь
--auto-это, по сути, обычный merge. - Если есть required reviewer, чей approve уже получен, и checks зелёные -срабатывает сразу.
Удобный сценарий: ты сделал PR, прогнал ревью, попросил изменения, апдейтнул -CI пошёл. Вместо ожидания ставишь
--auto. Закрываешь терминал, идёшь делать другую задачу. GitHub сольёт за тебя, когда зелёное.Подскажи, как через gh посмотреть, у каких моих PR красные checks, в JSON для скрипта?
Показать ответ
bashgh pr list --author "@me" --state open \
--json number,title,statusCheckRollup \
| jq '.[] | select(.statusCheckRollup[] | .conclusion == "FAILURE") | {number, title}'Разбор по частям:
gh pr list --author "@me" --state open-твои открытые PR.--json number,title,statusCheckRollup-достаём три поля: номер, заголовок, и сводку по checks.jq '.[] | select(.statusCheckRollup[] | .conclusion == "FAILURE")'-фильтруем те, у кого хотя бы один check со статусом FAILURE.| {number, title}-выводим только нужные поля для вывода.
Список доступных полей -
gh pr list --jsonбез аргументов покажет ошибку с списком valid fields. Это надёжный способ посмотреть, что можно достать.Если хочешь то же самое для конкретного PR, а не по списку, то проще:
bashgh pr checks 123 --json name,conclusion \
| jq '.[] | select(.conclusion == "FAILURE")'
У меня два аккаунта на GitHub: личный и рабочий. Как переключаться?
Показать ответ
gh поддерживает несколько профилей из коробки.
Первый раз:
gh auth loginпод первым аккаунтом. Второй раз:gh auth loginпод вторым (gh не перетрёт первый, добавит).Проверь, что оба зарегистрированы:
bashgh auth status
# Logged in to github.com account work-user (oauth_token)
# Logged in to github.com account personal-user (oauth_token)
Переключение:
bashgh auth switch
# выберет интерактивно
gh auth switch --user personal-user
После switch все последующие
ghкоманды работают от выбранного аккаунта. Если делаешьgh pr createпод рабочим аккаунтом в репо, где у тебя нет доступа -получишь permission denied.Важная тонкость: git credential helper -это отдельная штука. Если ты push'ишь через HTTPS, git сам кэширует креды (обычно одни). Переключение
gh auth switchне переключит git credentials. Чтобы не запутаться, используй SSH (тогда git идёт через~/.ssh/, а не через credential helper) -см. ssh-keys-git. Один ssh-config с разными ключами для разных GitHub-аккаунтов -стандартное решение.