2012-02-09 2 views
445

У меня есть две ветвей:Заменить местное отделение с удаленным филиалом полностью

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

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

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

(я уже искал SO и проверить на удаленной ветви локально не имеет никакого эффекта)

ответ

753
  1. Убедитесь, что вы проверили ответвление, которое вы заменяете (от Zoltán's comment).
  2. Предполагая, что мастер является местным отделением вы заменяете, и что «происхождение/мастер» является удаленным филиалом вы хотите восстановить:

    git reset --hard origin/master 
    

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

+3

Спасибо за ваше предложение, я просто так «испугался» использования --hard и -force уже, поэтому я просто выбрал решение, которое не использует их. – YemSalat

+10

@ KonstantinLevin: да, назначение этих опций довольно раздражает. 'git reset' по умолчанию будет переназначать вашу текущую ветку и синхронизировать индекс. '--soft' пропустит обновление индекса,' --hard' также синхронизирует рабочее пространство. Мой собственный опыт использует '--hard' большую часть времени, за исключением случаев, когда я хочу отменить последнюю фиксацию (это просто« git reset HEAD^») – araqnid

+0

@ KonstantinLevin, жесткий или сильный, страшный, но не« branch -d " (Удалить)? Мне нравится это решение, простое и прямолинейное. – km1

-5

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

+8

Или просто удалить ветку и проверить его снова. –

+0

Да, я думаю, это то, что я собираюсь делать, если я не найду, как это сделать менее «уродливым» способом. – YemSalat

+0

Уродство иногда полезно знать. Я бы хотел, чтобы люди не делали ничего хуже, потому что они не были обычным способом: должна быть более разумная причина для downvoting ... и это должно быть дано. Git - вещь, которая достигает результатов. Это не какой-то священный текст. –

2

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

+0

На самом деле это была команда «git rebase», которая испортила все это, затем некоторые принудительные слияния и жесткие сбрасывания. В любом случае, то, что я искал, - это просто простой способ вытащить все репо с удаленного сервера без слияния. – YemSalat

26
git branch -D <branch-name> 
git fetch <remote> <branch-name> 
git checkout -b <branch-name> --track <remote>/<branch-name> 
+0

Что делает часть -track? – eonist

+2

@GitSync, это то, что говорит '' git help branch ''--track'. 'При создании новой ветки настройте ветвь. .ремонт и ветка. . Записи конфигурации для отметки ветви начальной точки как «вверх по течению» из новой ветки. Эта конфигурация покажет git, чтобы показать связь между двумя ветвями в статусе git и git branch -v. Кроме того, он направляет git pull без аргументов, чтобы вытащить из восходящего потока, когда новая ветка проверена. ' Я исправил эту команду в ответе. Спасибо, что подняли точку. – Sailesh

+0

Итак, в условиях неспециалиста: он добавляет удаленный URL-адрес в новую ветку. Таким образом, они синхронизированы навсегда. Так сказать. – eonist

149

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

  1. Удалить местное отделение: git branch -d local_branch
  2. Fetch последней удаленной ветви: git fetch origin remote_branch
  3. Перестроить местное отделение на основе удалённый: git checkout -b local_branch origin/remote_branch
+6

На самом деле то, что сказал @araqnid, является правильным и более кратким. Я протестировал его, и вы тоже можете попробовать. – adamsmith

+2

@ Ответ araqnid ниже должен получить галочку –

+0

Wow, git checkout -b local_branch origin/remote_branch это здорово! Я всегда делал это в двух отдельных командах. благодаря! – kendepelchin

2

s избранный ответ абсолютно правильный, однако он не оставил меня с последними фиксациями/нажатиями ...

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

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 
+0

Хмм, это сработало для меня. Мне не пришлось тянуть. –

0

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

git fetch -f origin rbranch:lbranch 
2

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

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 воссоздает исходную ветвь как ветвь отслеживания.

Или как функция Баш:

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.

+0

Может захотеть включить 'git stash pop' в этот рабочий процесс. Если вы хотите повторно применить сохраненные файлы. – eonist

3

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

git reset --hard origin/some-branch 

ИЛИ, получить последнюю от удаленного филиала и заменить все:

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

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

git clean -fd 
0

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

потому, что суб-модули указывают не расшириться, но к фиксации.

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

git submodule foreach git pull 
+0

Просьба дать объяснение, особенно при ответе на вопросы этого старого. Ваш ответ не помогает. –

+0

В принятом ответе уже предлагается «git reset --hard». Это добавляет мало значения. – florisla

Смежные вопросы