Как полностью заменить локальную ветку на удаленную ветку в Git?
У меня есть две ветви:
- локальный филиал (тот, с которым я работаю)
- удаленная ветка (публичная, только хорошо протестированные коммиты идут туда)
недавно я серьезно испортил свой местный филиал (думаю, каждый git-Новичок был на моем месте в какой-то момент времени)
Как бы я полностью заменил локальную ветвь на удаленную, чтобы я мог продолжить свою работу с того места, где сейчас находится удаленная ветвь?
(Я уже искал Так что и выезд на удаленную ветку локально не имеет никакого эффекта)
10 ответов:
- убедитесь, что вы проверили филиал вы заменяете (от комментарий).
предполагая, что master-это локальная ветвь, которую вы заменяете, и что "origin / master" - это удаленная ветвь, которую вы хотите сбросить:
git reset --hard origin/masterэтого обновления ваш глава местного филиала той же ревизии как происхождение/Мастер, и
--hardсинхронизирует это изменение с индексом и рабочей областью.
Это так же просто, как три шага:
- удалить локальную ветку:
git branch -d local_branch- получить последнюю удаленную ветку:
git fetch origin remote_branch- перестроить локальную ветку на основе удаленной:
git checkout -b local_branch origin/remote_branch
git branch -D <branch-name> git fetch <remote> <branch-name> git checkout -b <branch-name> --track <remote>/<branch-name>
замените все на удаленную ветку;но, только из той же фиксации ваша локальная ветка включена:
git reset --hard origin/some-branchили, получаем последний из удаленной ветки и заменить все:
git fetch origin some-branch git reset --hard FETCH_HEADв стороне, если это необходимо, вы можете стереть неотслеженные файлы и каталоги, которые вы еще не совершили:
git clean -fd
самый безопасный и наиболее полный способ заменить текущую локальную ветку на удаленную:
git stash git merge --abort git rebase --abort git branch -M yourBranch replaced_yourBranch git fetch origin yourBranch:yourBranch git checkout yourBranchThe
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} }, который переименовывает текущий ответвление на что-то вроде replaced_master_98d258f.
Вы можете сделать, как @Hugo из @Laurent сказал, Или вы можете использовать
git rebaseчтобы удалить коммиты, которые вы хотите избавиться, если вы знаете, какие из них. Я склонен использоватьgit rebase -i head~N(где N-число, позволяющее манипулировать последними N коммитами) для такого рода операций.
The выбранный ответ абсолютно правильный, однако это не оставило меня с последней фиксацией/толчками ...
Так что для меня:
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
Если вы хотите обновить ветку, которая в настоящее время не проверили, вы можете сделать
git fetch -f origin rbranch:lbranch
, как указано в выбранной объяснение, 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
уродливый, но более простой способ: удалите локальную папку и снова клонируйте удаленный репозиторий.
Comments