2010-04-19 8 views
28

Насколько я вижу, git pull someRemote master пытается объединить удаленную ветку в шахту.Могу ли я сказать git pull для перезаписывания вместо слияния?

Есть ли способ сказать: «Полностью отбросьте мои вещи, просто сделайте мне еще один клон пульта», используя git pull? Я все еще хочу сохранить свой собственный репозиторий и сохранить его в истории, но после этой команды я хочу получить 1: 1 копию основной ветки someRemote.

Чтобы уточнить, представьте, что есть 2 хранилища, RM и MY. Числа совершаются, и это предполагает только одну ветвь (мастер).

 
RM1 --- RM2 --- RM3 --- RM4 --- RM5 --- RM6 ... 
|      | 
+-> MY1 --- MY2 --- MY3 -+-> MY4 --- MY5 --- MY6 ... 

Поэтому я начинаю свой собственный репозиторий как клон RM1. Затем я развиваюсь счастливо, и RM развивается счастливо, но мы никогда не разделяем нашу работу. После MY3 я понимаю, что моя ветка не так уж полезна, но RM4 довольно хорош. Поэтому я хочу, чтобы git pull RM4 в MY. Тем не менее, я не хочу, чтобы мои изменения в MY1-3 сохранялись, я хочу, чтобы MY4 был 1: 1 копией RM4.

Однако я хочу сохранить свою историю, в идеале я хотел бы иметь набор изменений между MY3 и RM4 или между MY3 и RM2-4.

Он все равно должен оставаться моим хранилищем.

Возможно ли это?

(Это для проектов GitHub, где я могу разветвить проект, немного экспериментировать, оставить его в покое на несколько недель, но затем обновить его, не сохраняя изменений. В настоящий момент я удаляю свою вилку и перекрики , что не является наилучшим подходом.)

ответ

34

Во-первых, переименовать мастер ветку к чему-то еще:

git branch -m master my_old_master 

Затем создайте нового хозяина:

git checkout -b master someRemote 

Большая вещь об именах филиалов Git является то, что они не являются сами по себе реальным местам, они просто указатели на места (где «место» является SHA1 фиксацией идентификатора).

+0

В основном я должен наносить урон моей ветке? Есть ли способ, чтобы git magically объединил изменения, чтобы он выглядел как новая ревизия? Я хотел бы сохранить свою ветку и ее историю, я просто хочу, чтобы текущая ревизия была копией текущей версии пульта 1: 1. Или это все еще будет работать, и новый мастер делится историей со старым мастером? –

+4

@ Майкл: Ваши изменения не исчезнут; они все еще существуют в ветке 'my_old_master'. Ваши цели «1: 1 копия удаленного» и «сохранить мою историю» несовместимы, если вы хотите только одну ветку. Поскольку ревизия SHA1 включает SHA1 всей истории, ветвь не совпадает с другой ветвью, если только * all * история не идентична в обеих ветвях. –

+0

, чтобы заставить это работать, мне пришлось сначала получить удаленный филиал. –

4

Похоже, вы после git checkout, который отменит ваши локальные изменения на пути.

Вы можете вернуть свои изменения, используя проверку:

git checkout myfile.h 

восстановит myfile.h из индекса

http://git-scm.com/docs/git-checkout

+0

Я думал проверку только сбрасывает свою локальную рабочую копию последнего пересмотра в моем репо. Работает ли он с пультом дистанционного управления? –

+1

Да, 'git checkout' берет аргумент, так что возможно« git checkout origin/foo bar.baz ». – Bombe

2

Если вы хотите сохранить текущую главную ветвь, но зарегистрировать новую версию (зеркальное отображение удаленной ветви), вы можете;

  • зарегистрировать драйвер объединения фильтра (только для этого слияния: a keepTheir one)
  • сделать чек git pull --no-commit
  • если нет дополнительных файлов, которые должны быть удалены (файлы вашего мастера, которые не присутствовали в удаленном филиале)
  • совершают
Смежные вопросы