Другое

Как изменить отслеживаемую удаленную ветку в 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:

bash
git branch --set-upstream-to=<удаленный-репозиторий>/<ветка> <локальная-ветка>

В вашем конкретном случае, если вы хотите изменить ветку master для отслеживания нового удаленного репозитория:

bash
git branch --set-upstream-to=newserver/master master

Сокращенная версия: git branch -u

Git предоставляет удобную сокращенную версию для опции --set-upstream-to:

bash
git branch -u <удаленный-репозиторий>/<ветка>

Эта команда устанавливает восходящий поток для текущей ветки (той, на которой вы находитесь):

bash
# Переключитесь на ветку, которую нужно перенастроить
git checkout master
# Установите новый восходящий поток
git branch -u newserver/master

Альтернативный метод: git push --set-upstream

Если вы также отправляете свои изменения в новый удаленный репозиторий, вы можете объединить настройку восходящего потока с операцией отправки:

bash
git push --set-upstream newserver master

Эта команда отправляет вашу ветку master в newserver/master и устанавливает отношение отслеживания за один шаг.


Пошаговые инструкции

Метод 1: Использование git branch --set-upstream-to

  1. Убедитесь, что новый удаленный репозиторий добавлен:

    bash
    git remote -v
    # Должен показать URL вашего нового сервера
    
  2. Получите последние изменения из нового удаленного репозитория:

    bash
    git fetch newserver
    
  3. Установите новое отслеживание восходящего потока:

    bash
    git branch --set-upstream-to=newserver/master master
    
  4. Проверьте изменения:

    bash
    git branch -vv
    # Должен показать новую информацию об отслеживании удаленного репозитория
    

Метод 2: Использование git branch -u (сокращенная версия)

  1. Переключитесь на ветку, которую нужно перенастроить:

    bash
    git checkout master
    
  2. Установите восходящий поток с помощью сокращенной версии:

    bash
    git branch -u newserver/master
    
  3. Проверьте конфигурацию:

    bash
    git pull
    # Теперь должно получать данные из нового удаленного репозитория
    

Метод 3: Использование git push --set-upstream

  1. Отправьте вашу ветку в новый удаленный репозиторий:

    bash
    git push --set-upstream newserver master
    
  2. Эта команда автоматически устанавливает отношение отслеживания во время отправки


Проверка конфигурации отслеживания

После изменения конфигурации восходящего потока вы должны проверить, что изменения были применены правильно:

Проверка информации об отслеживании ветки

Используйте команду git branch с флагом -vv (подробный режим) для просмотра подробной информации об отслеживании:

bash
git branch -vv

Вывод должен выглядеть примерно так:

* master    abc1234 [newserver/master: ahead 1] Ваш недавний коммит

Проверка деталей текущей ветки

Вы также можете проверить конфигурацию восходящего потока для текущей ветки:

bash
git rev-parse --abbrev-ref @{u}
# или
git rev-parse --abbrev-ref --symbolic-full-name @{upstream}

Это выведет ветку отслеживания удаленного репозитория (например, newserver/master).

Проверка конфигурации Git

Хотя мы избегаем ручного редактирования конфигурации, вы можете проверить текущую конфигурацию с помощью:

bash
git config --get branch.master.remote
git config --get branch.master.merge

Эти команды теперь должны показывать newserver и refs/heads/master соответственно.


Распространенные сценарии и решения

Сценарий 1: Требуется перенастройка нескольких веток

Если у вас есть несколько веток, которые должны отслеживать новый удаленный репозиторий, вы можете использовать скрипт:

bash
#!/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: Отслеживание ветки с другим именем

Если имя вашей локальной ветки отличается от имени удаленной ветки:

bash
git branch --set-upstream-to=newserver/имя-удаленной-ветки имя-локальной-ветки

Сценарий 3: Удаление отношения отслеживания

Если вы хотите удалить все отношения отслеживания для ветки:

bash
git branch --unset-upstream master

Сценарий 4: Установка удаленного репозитория по умолчанию для всех веток

Вы можете настроить удаленный репозиторий по умолчанию для всех веток:

bash
git config remote.pushdefault newserver

Это переопределяет настройку branch.<имя>.remote для всех веток.


Дополнительные параметры конфигурации

Автоматическая настройка восходящего потока

Git может автоматически настраивать отслеживание восходящего потока для новых веток. Вы можете настроить это поведение:

bash
# Включить автоматическую настройку восходящего потока для всех веток
git config --global branch.autoSetupMerge true

# Включить автоматическую настройку восходящего потока только для веток, отслеживающих удаленные репозитории
git config --global branch.autoSetupMerge remote

Проверка статуса отслеживания

Вы можете проверить, какие ветки отслеживают какие удаленные репозитории:

bash
git for-each-ref --format='%(refname:short) %(upstream:short)' refs/heads/

Это выводит все локальные ветки и их соответствующие ветки отслеживания восходящего потока.

Устранение распространенных проблем

  1. “fatal: the upstream branch of ‘master’ does not exist”:

    • Это означает, что удаленная ветка не существует. Сначала создайте ее с помощью git push -u newserver master
  2. “fatal: no upstream configured for branch ‘master’”:

    • Используйте git branch -u newserver/master для установки восходящего потока
  3. “fatal: refusing to merge unrelated histories”:

    • Если новая удаленная ветка имеет другую историю, используйте git pull --allow-unrelated-histories

Источники

  1. Stack Overflow - How to change the remote a branch is tracking?
  2. GeeksforGeeks - How To Change the Remote a Branch is Tracking in Git
  3. Git Tower - How can I tell a local branch to track a remote branch?
  4. Git Documentation - Remote Branches
  5. Git Memo - Remote tracking branches
  6. Mincong Huang - Git: Upstream Tracking Understanding
  7. Graphite - Setting an upstream in Git
  8. devconnected - How To Set Upstream Branch on Git
  9. LabEx - How to set upstream for Git branch
  10. 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, чтобы убедиться, что отношение отслеживания было установлено правильно.

Авторы
Проверено модерацией
Модерация