Как полностью заменить локальную ветку удаленной веткой в Git?
У меня есть две ветви:
- локальная ветка (та, с которой я работаю)
- удаленная ветка (публичные, только хорошо протестированные коммиты идут туда)
недавно я серьезно испортил свой местный филиал (думаю, каждый git-Новичок был на моем месте в какой-то момент времени)
Как полностью заменить локальную ветвь удаленной, чтобы я мог продолжить свою работу с того места, где находится удаленная ветвь?
(Я уже искал Так что и выезд на удаленную ветку локально не имеет никакого эффекта)
10 ответов
- убедитесь, что вы проверили ветку, которую вы заменяете (от Золтана комментарий).
-
предполагая, что master-это локальная ветвь, которую вы заменяете, и что "origin / master" - это удаленная ветвь, которую вы хотите сбросить:
git reset --hard origin/master
это обновляет вашу локальную головную ветвь, чтобы быть такой же редакцией, как 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 yourBranch
на stash
линия сохраняет изменения, которые вы не совершали. The branch
линия перемещает вашу ветку на другое имя, освобождая исходное имя. The fetch
строка извлекает последнюю копию пульта дистанционного управления. The checkout
line воссоздает исходную ветвь как ветвь отслеживания.
или как функция 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 коммитами) для такого рода операций.
на выбранный ответ абсолютно правильный, однако он не оставил у меня последний коммит/пуш ...
для меня так:
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 - это хорошо. Но в настоящее время мы часто используем субмодули: репозитории внутри репозиториев. Например, если вы используете ZF3 и jQuery в вашем проекте, вы скорее всего хотите, чтобы они были клонированы из исходного хранилища. В таком случае сброс git не хватает. Нам нужно обновить подмодули до той точной версии, которая определена в нашем репозитории:
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