Как изменить отслеживаемую удаленную ветку в Git
Узнайте, как изменить, какую удаленную ветку отслеживает локальная ветка Git без редактирования конфигурационных файлов. Полное руководство с командами для решения проблемы 'актуально' при переносе репозиториев.
Как изменить, какую удаленную ветку Git отслеживает локальная ветка?
Я переместил свой центральный Git репозиторий на новый сервер и создал новый удаленный репозиторий в локальном репозитории. После отправки (push) на новый удаленный репозиторий, я столкнулся с проблемой, что git pull сообщает, что все обновлено, хотя я знаю, что новая удаленная ветка содержит дополнительные коммиты, которые нужно получить (fetch).
Проблема, кажется, заключается в том, что моя локальная ветка все еще отслеживает старую удаленную ветку. Я вижу эту конфигурацию в файле конфигурации Git:
[branch "master"]
remote = oldserver
merge = refs/heads/master
Как правильно изменить локальную ветку, чтобы она отслеживала другую удаленную ветку, без ручного редактирования файла конфигурации Git?
Как изменить отслеживаемую удаленную ветку для локальной ветки Git без ручного редактирования файла конфигурации
Чтобы изменить, какая удаленная ветка Git отслеживается локальной веткой без ручного редактирования файла конфигурации, можно использовать команду git branch --set-upstream-to или ее сокращенную версию git branch -u. Этот метод напрямую обновляет конфигурацию отслеживания, устанавливая отношение между вашей локальной веткой и желаемой удаленной веткой.
Содержание
- Понимание проблемы
- Методы изменения отслеживания удаленной ветки
- Пошаговые инструкции
- Проверка конфигурации отслеживания
- Распространенные сценарии и решения
- Дополнительные параметры конфигурации
Понимание проблемы
Когда вы перемещаете свой Git-репозиторий на новый сервер и добавляете новый удаленный репозиторий, ваши локальные ветки могут по-прежнему быть настроены на отслеживание старых удаленных веток. Именно поэтому git pull сообщает “up to date” (актуально), даже когда новый удаленный репозиторий содержит дополнительные коммиты — потому что Git все еще ищет обновления в старом удаленном репозитории.
Конфигурация отслеживания хранится в файлах конфигурации Git (обычно .git/config) и определяет два ключевых элемента информации для каждой ветки:
remote: имя удаленного репозиторияmerge: ссылка на конкретную ветку для слияния
Вместо того чтобы вручную редактировать эти записи конфигурации, Git предоставляет инструменты командной строки для эффективного управления этими отношениями.
Методы изменения отслеживания удаленной ветки
Основной метод: git branch --set-upstream-to
Наиболее прямой подход — использование команды git branch с опцией --set-upstream-to:
git branch --set-upstream-to=<удаленный-репозиторий>/<ветка> <локальная-ветка>
В вашем конкретном случае, если вы хотите изменить ветку master для отслеживания нового удаленного репозитория:
git branch --set-upstream-to=newserver/master master
Сокращенная версия: git branch -u
Git предоставляет удобную сокращенную версию для опции --set-upstream-to:
git branch -u <удаленный-репозиторий>/<ветка>
Эта команда устанавливает восходящий поток для текущей ветки (той, на которой вы находитесь):
# Переключитесь на ветку, которую нужно перенастроить
git checkout master
# Установите новый восходящий поток
git branch -u newserver/master
Альтернативный метод: git push --set-upstream
Если вы также отправляете свои изменения в новый удаленный репозиторий, вы можете объединить настройку восходящего потока с операцией отправки:
git push --set-upstream newserver master
Эта команда отправляет вашу ветку master в newserver/master и устанавливает отношение отслеживания за один шаг.
Пошаговые инструкции
Метод 1: Использование git branch --set-upstream-to
-
Убедитесь, что новый удаленный репозиторий добавлен:
bashgit remote -v # Должен показать URL вашего нового сервера -
Получите последние изменения из нового удаленного репозитория:
bashgit fetch newserver
-
Установите новое отслеживание восходящего потока:
bashgit branch --set-upstream-to=newserver/master master
-
Проверьте изменения:
bashgit branch -vv # Должен показать новую информацию об отслеживании удаленного репозитория
Метод 2: Использование git branch -u (сокращенная версия)
-
Переключитесь на ветку, которую нужно перенастроить:
bashgit checkout master
-
Установите восходящий поток с помощью сокращенной версии:
bashgit branch -u newserver/master
-
Проверьте конфигурацию:
bashgit pull # Теперь должно получать данные из нового удаленного репозитория
Метод 3: Использование git push --set-upstream
-
Отправьте вашу ветку в новый удаленный репозиторий:
bashgit push --set-upstream newserver master
-
Эта команда автоматически устанавливает отношение отслеживания во время отправки
Проверка конфигурации отслеживания
После изменения конфигурации восходящего потока вы должны проверить, что изменения были применены правильно:
Проверка информации об отслеживании ветки
Используйте команду git branch с флагом -vv (подробный режим) для просмотра подробной информации об отслеживании:
git branch -vv
Вывод должен выглядеть примерно так:
* master abc1234 [newserver/master: ahead 1] Ваш недавний коммит
Проверка деталей текущей ветки
Вы также можете проверить конфигурацию восходящего потока для текущей ветки:
git rev-parse --abbrev-ref @{u}
# или
git rev-parse --abbrev-ref --symbolic-full-name @{upstream}
Это выведет ветку отслеживания удаленного репозитория (например, newserver/master).
Проверка конфигурации Git
Хотя мы избегаем ручного редактирования конфигурации, вы можете проверить текущую конфигурацию с помощью:
git config --get branch.master.remote git config --get branch.master.merge
Эти команды теперь должны показывать newserver и refs/heads/master соответственно.
Распространенные сценарии и решения
Сценарий 1: Требуется перенастройка нескольких веток
Если у вас есть несколько веток, которые должны отслеживать новый удаленный репозиторий, вы можете использовать скрипт:
#!/bin/bash
for branch in $(git branch | cut -c3-); do
if git config --get "branch.$branch.remote" | grep -q "oldserver"; then
git branch --set-upstream-to="newserver/$branch" "$branch"
echo "Обновлена ветка $branch для отслеживания newserver/$branch"
fi
done
Сценарий 2: Отслеживание ветки с другим именем
Если имя вашей локальной ветки отличается от имени удаленной ветки:
git branch --set-upstream-to=newserver/имя-удаленной-ветки имя-локальной-ветки
Сценарий 3: Удаление отношения отслеживания
Если вы хотите удалить все отношения отслеживания для ветки:
git branch --unset-upstream master
Сценарий 4: Установка удаленного репозитория по умолчанию для всех веток
Вы можете настроить удаленный репозиторий по умолчанию для всех веток:
git config remote.pushdefault newserver
Это переопределяет настройку branch.<имя>.remote для всех веток.
Дополнительные параметры конфигурации
Автоматическая настройка восходящего потока
Git может автоматически настраивать отслеживание восходящего потока для новых веток. Вы можете настроить это поведение:
# Включить автоматическую настройку восходящего потока для всех веток
git config --global branch.autoSetupMerge true
# Включить автоматическую настройку восходящего потока только для веток, отслеживающих удаленные репозитории
git config --global branch.autoSetupMerge remote
Проверка статуса отслеживания
Вы можете проверить, какие ветки отслеживают какие удаленные репозитории:
git for-each-ref --format='%(refname:short) %(upstream:short)' refs/heads/
Это выводит все локальные ветки и их соответствующие ветки отслеживания восходящего потока.
Устранение распространенных проблем
-
“fatal: the upstream branch of ‘master’ does not exist”:
- Это означает, что удаленная ветка не существует. Сначала создайте ее с помощью
git push -u newserver master
- Это означает, что удаленная ветка не существует. Сначала создайте ее с помощью
-
“fatal: no upstream configured for branch ‘master’”:
- Используйте
git branch -u newserver/masterдля установки восходящего потока
- Используйте
-
“fatal: refusing to merge unrelated histories”:
- Если новая удаленная ветка имеет другую историю, используйте
git pull --allow-unrelated-histories
- Если новая удаленная ветка имеет другую историю, используйте
Источники
- Stack Overflow - How to change the remote a branch is tracking?
- GeeksforGeeks - How To Change the Remote a Branch is Tracking in Git
- Git Tower - How can I tell a local branch to track a remote branch?
- Git Documentation - Remote Branches
- Git Memo - Remote tracking branches
- Mincong Huang - Git: Upstream Tracking Understanding
- Graphite - Setting an upstream in Git
- devconnected - How To Set Upstream Branch on Git
- LabEx - How to set upstream for Git branch
- LinuxHint - How to Change the Remote Tracking Branch in Git
Заключение
Изменение удаленной ветки, отслеживаемой локальной веткой Git, без ручного редактирования файла конфигурации является простым с использованием встроенных команд Git. Основные методы:
git branch --set-upstream-to=<удаленный-репозиторий>/<ветка>— наиболее прямой подходgit branch -u <удаленный-репозиторий>/<ветка>— удобная сокращенная версияgit push --set-upstream <удаленный-репозиторий> <ветка>— объединяет отправку и настройку восходящего потока
В вашей конкретной ситуации с переносом на новый сервер просто выполните git branch --set-upstream-to=newserver/master master после добавления нового удаленного репозитория и получения данных из него. Это решит проблему, когда git pull сообщает “актуально”, несмотря на то, что новый удаленный репозиторий содержит дополнительные коммиты.
Всегда получайте данные из нового удаленного репозитория перед изменением конфигурации отслеживания, и проверяйте изменения с помощью git branch -vv, чтобы убедиться, что отношение отслеживания было установлено правильно.