Синхронизация и много репозиториев

Предпросмотр пул-реквеста

Просмотр диффа в браузере говорит вам, хорошо ли читается код. Он не говорит, запускается ли ещё приложение. Чтобы это выяснить, надо запустить ветку — и вот тут люди застревают, потому что пул-реквест из форка живёт в репозитории, который вы никогда не клонировали и в который часто не можете пушить.

Локальный предпросмотр решает это фактом, который большинству никогда не приходится узнавать: форджи публикуют голову каждого пул-реквеста как обычную git-ссылку в целевом репозитории. Форк не обязан быть доступен, API-токен не нужен, и второй remote не добавляется. Один фетч — и код у вас на диске.

Локальный предпросмотр: выберите remote, пул-реквест и способ применения

Хостинг Где живёт голова PR
GitHub, GitHub Enterprise, Gitea, Forgejo, Gogs refs/pull/<n>/head
GitLab (облако и self-hosted) refs/merge-requests/<n>/head
Bitbucket Cloud, Bitbucket Server refs/pull-requests/<n>/from
Azure DevOps refs/pull/<n>/merge

Gitcito прощупывает все четыре за один ls-remote, так что незнакомый или self-hosted фордж работает, если он следует одному из этих соглашений.

Как открыть

  • Список пул-реквестов в боковой панели — кнопка со стрелкой на любой записи. Это работает для любого хостинга, в отличие от подробного вида, который есть только для GitHub.
  • Палитра команд: Предпросмотр пул-реквеста локально.
  • Внутри подробного вида пул-реквеста, рядом с кнопкой «открыть в браузере».

Что вы ему даёте

Remote — репозиторий, против которого открыт пул-реквест, обычно origin. Не форк.

Пул-реквест — номер или вставленный URL из браузера. 7, #7 и https://github.com/owner/repo/pull/7 работают одинаково; как и формы URL GitLab, Bitbucket и Azure DevOps. Нажмите Найти, и Gitcito сообщит, какую ссылку он разрешил и на какой коммит она указывает, ещё до того как что-либо будет получено.

Удалённая ветка — вторая вкладка, на случай когда никакой PR-ссылки найти нельзя: хостинг их не публикует или вы просто хотите попробовать ветку. Укажите имя ветки в том виде, в каком оно существует на remote.

Два способа применить

Ни один не пишет коммит. Это сделано намеренно — предпросмотр, от которого нельзя просто уйти, никакой не предпросмотр.

Режим Что происходит Как отменить
Локальная ветка Ссылка выгружается в собственную ветку (pr/7 по умолчанию) и переключается на неё. Остальные ваши ветки не тронуты. Отмена возвращает на ветку, где вы были, и удаляет ветку предпросмотра.
Слияние без коммита Ссылка сливается в текущую ветку с --no-commit --no-ff, оставляя объединённое дерево в индексе, чтобы вы могли собрать и протестировать. Отмена прерывает слияние.

Повторный предпросмотр того же пул-реквеста переиспользует ту же ветку, двигая её на новую голову — удобно, когда автор пушит исправление, пока вы тестируете. Если такая ветка уже существует, Gitcito говорит об этом и спрашивает, прежде чем сбрасывать её, потому что любой коммит, живущий только там, был бы потерян.

Чего он делать не станет

  • Он не может выдумать ссылку, которую хостинг не публикует. Некоторые self-hosted конфигурации отключают PR-ссылки; в некоторых форджах их никогда не было. Вы получите внятное «нет ссылки для #n» и вкладку удалённой ветки как выход.
  • Он не получает теги. Предпросмотр не должен затаскивать чужое пространство имён тегов в ваш репозиторий.
  • Режиму слияния нужно чистое рабочее дерево. Git отказывается сливать поверх незакоммиченной работы; сначала стеш.
  • Предпросмотр — это не ревью. Он кладёт код на вашу машину — он ничего не одобряет, не комментирует и не сливает. Это хостинги и пул-реквесты.
  • Приватные форки остаются приватными. PR-ссылку отдаёт целевой репозиторий, так что доступ определяется вашими учётными данными для этого remote — см. безопасность.

Уборка

Ветка предпросмотра — обычная ветка: удалите её из боковой панели, когда закончите, или нажмите отмену сразу после предпросмотра. Незакоммиченное слияние-предпросмотр можно отбросить отменой — или разрешить и закоммитить, если вы всё-таки решили, что оно вам нужно; в этот момент оно перестаёт быть предпросмотром и становится слиянием.

Улучшить этот перевод на GitHub