Как заменить локальную ветку на удаленную в Git?

У меня есть две ветки:

  1. локальный филиал (тот, с которым я работаю)
  2. удаленная ветка (общедоступная, туда идут только проверенные коммиты)

Недавно я серьезно испортил свой локальный филиал.

Как мне полностью заменить локальную ветку на удаленную, чтобы я мог продолжить свою работу с того места, где сейчас находится удаленная ветка?

Я уже искал SO, и проверка на удаленную ветку локально не имеет никакого эффекта.

Ответ 1

  1. Убедитесь, что вы отметили заменяемую ветку (из комментария Золтана).
  2. Предполагая, что master - это локальная ветвь, которую вы заменяете, а "origin/master" - это удаленная ветвь, в которую вы хотите сбросить:

    git reset --hard origin/master
    

Это обновит вашу локальную ветку HEAD, чтобы она стала той же ревизией, что и origin/master, и --hard синхронизирует это изменение с индексом и рабочей --hard.

Ответ 2

Это так же просто, как три шага:

  • Удалите локальную ветвь: git branch -d local_branch
  • Получить последнюю удаленную ветвь: git fetch origin remote_branch
  • Восстановить локальную ветвь на основе удаленного: git checkout -b local_branch origin/remote_branch

Ответ 3

git branch -D <branch-name>
git fetch <remote> <branch-name>
git checkout -b <branch-name> --track <remote>/<branch-name>

Ответ 4

Заменить все удаленной ветвью; но, только из того же фиксации, что локальная ветка включена:

git reset --hard origin/some-branch

ИЛИ, получите последнюю из удаленной ветки и замените все:

git fetch origin some-branch
git reset --hard FETCH_HEAD

В качестве альтернативы, если необходимо, вы можете уничтожить неискоренированные файлы и каталоги, которые вы еще не сделали:

git clean -fd

Ответ 5

Самый безопасный и наиболее полный способ заменить текущую локальную ветку удаленной:

git stash
git merge --abort
git rebase --abort
git branch -M yourBranch replaced_yourBranch
git fetch origin yourBranch:yourBranch
git checkout yourBranch

Линия stash сохраняет изменения, которые вы не зафиксировали. Линия branch перемещает вашу ветку под другим именем, освобождая оригинальное имя. Строка fetch извлекает самую последнюю копию пульта. Строка checkout воссоздает исходную ветвь как отслеживающую ветвь.

Или как функция bash:

replaceWithRemote() {
    yourBranch=${1:-'git rev-parse --abbrev-ref HEAD'}
    git stash
    git merge --abort
    git rebase --abort
    git branch -M ${yourBranch} replaced_${yourBranch}_'git rev-parse --short HEAD'
    git fetch origin ${yourBranch}:${yourBranch}
    git checkout ${yourBranch}
}

который переименовывает текущую ветку во что-то вроде replace_master_98d258f.

Ответ 6

Вы можете сделать так, как сказал @Hugo @Laurent, или вы можете использовать git rebase для удаления коммитов, которые хотите избавиться, если вы знаете, какие из них. Я обычно использую git rebase -i head~N (где N - число, позволяющее вам манипулировать последними N коммитами) для такого рода операций.

Ответ 7

выбранный ответ абсолютно правильный, однако он не оставил меня с последними фиксациями/нажатиями...

Итак, для меня:

git reset --hard dev/jobmanager-tools
git pull  ( did not work as git was not sure what branch i wanted)

Так как я знаю, что хочу временно установить свою ветвь вверх по течению на несколько недель на определенную ветку (то же самое, что и тот, который я раньше переключил на/извлечен и сделал жесткий reset)

Итак ПОСЛЕ reset

git branch --set-upstream-to=origin/dev/jobmanager-tools
git pull
git status    ( says--> on branch  dev/jobmanager-tools 

Ответ 8

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

git fetch -f origin rbranch:lbranch

Ответ 9

Как указано в выбранном объяснении, хороший git reset. Но в настоящее время мы часто используем подмодули: репозитории внутри репозиториев. Например, если вы используете ZF3 и jQuery в своем проекте, вы, скорее всего, хотите, чтобы их клонировали из исходных репозиториев. В таком случае git reset недостаточно. Нам нужно обновить подмодули до той точной версии, которые определены в нашем репозитории:

git checkout master
git fetch origin master
git reset --hard origin/master
git pull

git submodule foreach git submodule update

git status

это то же самое, что вы придете (cd) рекурсивно в рабочий каталог каждого подмодуля и запустите:

git submodule update

И это очень отличается от

git checkout master
git pull

потому что подмодули указывают не на ветвь, а на фиксацию.

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

git submodule foreach git pull

Ответ 10

git reset --hard
git clean -fd

Это сработало для меня - очистка показала все файлы, которые она удалила тоже. Если он говорит вам, что вы потеряете изменения, вам нужно спрятать.

Ответ 11

Это может быть сделано несколькими способами, продолжая редактировать этот ответ для распространения лучшего знания перспективы.

1) Сбросить сильно

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

git reset --hard origin/develop

2) Удалить текущую ветку и снова оформить заказ из удаленного хранилища.

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

git branch -D develop
git checkout -b develop origin/develop

3) Прервать слияние

Если вы находитесь в промежутке между неудачным слиянием (ошибочно сделанным с неправильной ветвью) и хотите избежать слияния, вернитесь к последней ветке, как показано ниже:

git merge --abort

4) Отменить ребаз

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

git rebase --abort

Ответ 12

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