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



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




  1. локальный филиал (тот, с которым я работаю)

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


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



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



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

2427   10  
git

10 ответов:

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

    git reset --hard 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

The 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

    Ничего не найдено.