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

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

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

недавно я серьезно испортил свой местный филиал (думаю, каждый git-Новичок был на моем месте в какой-то момент времени)

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

(Я уже искал Так что и выезд на удаленную ветку локально не имеет никакого эффекта)

10 ответов


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

    git reset --hard origin/master
    

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


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

  1. удалить локальную ветку: git branch -d local_branch
  2. получить последнюю удаленную ветку:git fetch origin remote_branch
  3. перестроить локальную ветку на основе удаленной: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

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