2010-11-04 3 views
5

Я не знаю, Git все это хорошо и для одного из наших репозиториев я допустил ошибку.Git ветвление от старой версии и откат текущей ветви

Я совершил и нажал изменения в ветку с именем «ядро». Но потом я понял, что моих изменений не должно быть - я должен был создать новую ветку с несколькими ревизиями назад, скажем, «core-experimental».

Чтобы объяснить, у меня есть:

A---B---C---D---E  "core" 

Но теперь я хочу, чтобы изменить его

A---B    "core" 
    \ 
    C---D---E  "core-experimental" 

никто в моей команде вытащил мои изменения еще, так что все возвращается я не должен не причинять боль никому.

Возможно ли это для Git?

ответ

9

Остальные два ответа работают нормально, но вы можете избежать того, чтобы сделать что-нибудь в вашей работе дерева:

# create core-experimental using core as starting point 
git branch core-experimental core 
# move core 
git branch -f core <SHA1 of B> 

Таким образом, вы можете сделать даже если у вас есть локальные модификации в дереве работ и без обновления связки временных меток во время проверки/сбрасывания, которые заставят вас перестроить (если это скомпилированный проект).

+0

Приятный, это немного лишний, который полирует мой git-fu. – Benjol

+0

Я использую Ruby/Python/non-compiled, поэтому я играю в loy-goosey w/file timestamps; это предложение лучше. –

+0

@ Адам: Да, я не уверен. Иногда «reset -hard» свободен, иногда в большом компилированном проекте, сброс/проверка занимает 20 секунд и заставляет составлять 10-минутную компиляцию. Еще одно отличие: 'reset' поместит в reflogs« : обновление HEAD », в то время как' branch -f' поставит «ветвь: сброс до ». – Cascabel

6
git checkout core 
git branch core-experimental 
git reset --hard <SHA of B> 
git push -f <remote> core 

Или более описательно ...

  1. Checkout ядро ​​
  2. Создать экспериментальную ветвь в ГОЛОВЕ сердечника
  3. ГОЛОВА
  4. Сброс сердечника обратно туда, где вы хотите его
  5. Принудительный толчок сердечник обновления
+0

Это сработало хорошо, даже с ядром, отодвинутым в исходное положение (которое у меня было, в отличие от вопрошающего). –

1

В основе:

git branch core-experimental 
git reset --hard <revision-B> 

И потом:

git push -f 
Смежные вопросы