Этот вопрос имеет несколько возможных основных значений, поэтому у него есть несколько возможных ответов. Ключевой вопрос здесь заключается в том, что задействованы как минимум два разных Git репозитория.
Remotes
Прежде чем мы перейдем к двум ответам, отметим, что remote - это короткое имя, подобное origin
. Сам пульт содержит URL , по которому ваш Git вызывает другой Git. Вы можете иметь столько пультов, сколько захотите. Есть и другие вещи, которые вы можете сделать с пультом, помимо простого сохранения URL-адреса, но сохранение URL-адреса является своего рода главным. Команда git remote
- это основная пользовательская команда для работы с пультами, но поскольку git clone
создает для вас пульт с именем origin
, вам практически никогда не требуется использовать git remote
.
Имена удаленного отслеживания
Ваш Git на вашем компьютере сохраняет и обновляет ваш Git репозиторий. Ваш Git имеет ваши имена ветвей, имена тегов и другие имена, а также набор коммитов. коммиты - это часть, которую ваш Git делит с другими Git репозиториями, хотя также есть некоторая степень совместного использования имен.
Между тем, поскольку у вас Git есть Вызвал еще один Git и запомнил URL для , который другие Git под именем origin
, ваш Git также помнит их Git имена веток. Для этого ваш Git создает в своем хранилище имен для удаленного отслеживания 1 , таких как origin/master
. Эти имена просто помнят, что в прошлый раз, когда ваши Git звонили другим Git в origin
, они говорили, что их master
был каким-то конкретным га sh ID.
Когда вы запускаете git fetch origin
(или просто git fetch
, если есть только один пульт с именем origin
), ваш Git вызывает другой Git в этот момент, получает любой новые коммиты, которые у них есть, которых у вас нет, и обновляет все ваши имена для удаленного отслеживания origin/*
.
Запуск git branch -r
выведет список ваших имен для удаленного отслеживания, поэтому git branch -r
покажет вам, что ваш Git видел в их Git, последний раз, когда ваш Git обновлялся с использованием их Git. Обратите внимание, что git branch -a
включает git branch -r
, но добавляет слово remotes/
перед именами origin/master
. 2
Однако здесь возникает одна проблема: может удалить некоторые названия филиалов. Предположим, например, что их Git вчера имели ветвь с именем feature/tall
, но больше не имеют этой ветки. Ваш Git вчера вызвал их Git и создал или обновил ваш origin/feature/tall
, чтобы соответствовать их feature/tall
. Теперь ваши Git вызывают свои Git, и они не перечисляют feature/tall
.
По умолчанию ваш Git ничего не делает this.
Однако, если вы запустите git fetch --prune
, ваш Git вызовет их Git как обычно, перечислит все имена их ветвей и обнаружит, что у вас есть устаревшие origin/feature/tall
, возвращаемые, когда у них было feature/tall
, а удаляет это.
Итак, в общем, вы должны добавить --prune
каждому git fetch
, так что имена для удаленного отслеживания Git будут удалены, как только ваш Git заметит, что они устарели (но не раньше). Вы можете настроить свой Git, чтобы сделать это автоматически:
git config fetch.prune true
Вы можете настроить Git так, чтобы оно использовалось по умолчанию для всех ваших репозиториев. на вашем ноутбуке или любой другой машине, которую вы используете, с:
git config --global fetch.prune true
См. документацию git config
для (очень длинного) списка всего, что git config
действительно может сделать.
1 Документация Git в основном называет эти имена удаленных отслеживающих ветвей , но я думаю, что смысл в конечном итоге станет более понятным, если мы оставим слово филиал отсюда.
2 Все имена Git - имена ветвей, имена тегов, имена для удаленного отслеживания и другие подобные имена - живут в пространствах имен и иметь более длинные полностью определенные имена, чтобы сделать их явными. Например, ваша ветвь master
действительно refs/heads/master
; Ваш тег v1.2
, если он у вас есть, действительно refs/tags/v1.2
. Имена удаленного отслеживания, такие как origin/master
, действительно refs/remotes/origin/master
.
Git обычно удаляют часть refs/heads/
имен ветвей, часть refs/tags/
имен тегов и часть refs/remotes/
имен удаленного слежения при отображении этих сокращенных имен. По какой-то причине git branch -a
удаляет только часть refs/
при отображении имен удаленного отслеживания, даже если git branch -r
удаляет часть refs/remotes/
. (Причина этого мне не ясна.)
Имена ветвей на пульте
Поскольку здесь задействован второй Git, вы также можете просто иметь свой Git позвоните ему прямо сейчас , сделайте так, чтобы он перечислил все свои имена ветвей, и пусть ваш Git напечатает эти имена. Команда git ls-remote
делает именно это:
git ls-remote origin
вызывает Git в origin
, заставляет их перечислить свои ветви и теги и другие подобные имена, а затем печатает все из них. (Он не не обновляет ни одно из ваших имен для удаленного слежения: осталось git fetch
, а также git remote update
.)
Команда git remote show
может также вызовите другой Git и получите информацию непосредственно от него, и покажите это. Иногда это так, а иногда нет. Это задокументировано , хотя и не очень ясно; подробности см. в документации git remote
.
Сводка
git branch -r
показывает имена ваших Git для удаленного слежения. Это быстро, поскольку это полностью локально. Но это может быть устаревшим.
git fetch
обновляет имена ваших Git для удаленного слежения; добавьте -p
или --prune
, чтобы очистить устаревшие, или установите fetch.prune
в значение true. Это медленно, так как добавляет новые коммиты, которых у вас нет, но впоследствии ваши имена для удаленного отслеживания быстро используются.
git remote update
в основном делает то же самое вещь как git fetch
. Поскольку git fetch
короче для ввода, я рекомендую вместо этого использовать git fetch
.
git ls-remote
вызывает другой Git и получает имена его ветвей. Это несколько медленно, но не так медленно, как git fetch
, если есть новые коммиты, так как он не получает коммиты - только имена и соответствующие идентификаторы ha sh.
git remote show
иногда работает локально, а иногда вызывает другой Git. Я нахожу его поведение несколько запутанным и не очень полезным, и обычно рекомендую избегать его.