Как заменить локальную ветку на удаленную в Git? - PullRequest
656 голосов
/ 09 февраля 2012

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

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

Недавно я серьезно испортил свою локальную ветвь.

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

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

Ответы [ 11 ]

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

    git reset --hard origin/master
    

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

192 голосов
/ 09 февраля 2012

Это всего лишь три шага:

  1. Удалить локальную ветвь: git branch -d local_branch
  2. Получить последнюю удаленную ветку: git fetch origin remote_branch
  3. Восстановитьлокальный филиал на основе удаленного: git checkout -b local_branch origin/remote_branch
38 голосов
/ 09 февраля 2012
git branch -D <branch-name>
git fetch <remote> <branch-name>
git checkout -b <branch-name> --track <remote>/<branch-name>
13 голосов
/ 20 июня 2017

Заменить все на удаленную ветку; , но , только из того же коммита, в котором находится ваша локальная ветка:

git reset --hard origin/some-branch

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

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

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

git clean -fd
7 голосов
/ 20 марта 2017

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

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.

2 голосов
/ 20 октября 2016

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

Так что для меня:

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

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

Итак ПОСЛЕ сброса

git branch --set-upstream-to=origin/dev/jobmanager-tools
git pull
git status    ( says--> on branch  dev/jobmanager-tools 
2 голосов
/ 09 февраля 2012

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

1 голос
/ 14 марта 2017

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

git fetch -f origin rbranch:lbranch
0 голосов
/ 23 апреля 2019
git reset --hard
git clean -fd

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

0 голосов
/ 18 августа 2017

Как указано в выбранном объяснении, 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

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

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

git submodule foreach git pull
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...