2015-01-27 2 views
2

У меня есть центральный (удаленный, исходный) репо моего проекта на BitBucket.org.
Клонирование Живых репо на моем сервере
клонированной Dev репо на моей машинеЧто такое правильный способ для исправлений?

Я разработка на Dev репо. И подтолкнули многие сделки к Центральному репо. Но live-репо находится в том же состоянии, когда оно было клонировано/инициировано.

Я не хочу делать git pull на сервере Live, пока все мои разработки не будут завершены.

Но ... Я нашел ошибку в коде; который я должен был немедленно зафиксировать на сайте Live. Поэтому я пошел на сервер (который несколько коммитов за центральным) и внес изменения в код. Затем я поставил этот единственный файл и совершил его.

Теперь, когда я пытаюсь нажать это обязательство Центральной репо (так что я могу затем потянуть на Dev репо), я получаю следующее:

# git push -u origin master 
Password: 
To https://[email protected]/xxx/xxx.git 
! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to 'https://[email protected]/xxx/xxx.git' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes before pushing again. See the 'Note about 
fast-forwards' section of 'git push --help' for details. 

Я знаю, что есть вопросы по SO о быстрой перемотки вперед. Но, я думаю, я сделал это неправильно. Как я могу правильно обрабатывать такой сценарий? И как мне оправиться от этого сейчас?

ответ

2

В этой ситуации я бы создал новую ветку в живой версии, добавил исправление к новой ветке, а затем переместил новую ветвь в центральное репо. Это позволит вам вытащить как главный, так и новый ветвь bugfix на вашу машину dev и справиться с конфликтами слияния там.

git checkout -b bugfix 
git add <fix-files> 
git commit 
git push origin bugfix 

В будущем, возможно, стоит сохранить живую версию на своей собственной ветке. Таким образом, вы можете точно контролировать, что работает. Если вам нужны дальнейшие исправления, вы можете сделать их на центральном репо (на ветке выпуска) и просто потянуть их на живой сервер.

Чтобы восстановить здесь использовать

git checkout -b bugfix 

создать новую ветку, то, как сказал Джонатон, используйте

git branch -f master master^ 

сбросить мастер быть синхронизированы с центральным репо

(Благодаря Jonathon для его упрощения)

+1

Вот как избежать проблемы в будущем, но не говорит, как восстановить ситуацию сейчас (когда изменение уже включено в ведущую ветку на реальном сервере) –

+0

@JonathanWakely, добавлено. – Holloway

+0

Спасибо. Что делать, когда, в будущем, я решил принести все файлы dev на live-сервере? В ветке bugfix все равно будет жить. Что делать с этой веткой? Должен ли я объединить его с мастером на dev? –

-1
git push origin master 
To https://github.com/Joey-project/project.git 
! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to 'https://github.com/Joey-project/project.git' 

является часто повторяющейся ошибкой.

Я читал, что это может произойти из-за того, что никто не должен подталкивать свою ветку к обновленной удаленной ветке.

Идея заключается в том, чтобы использовать что-то подобное, как:

git fetch origin; git merge origin/master 

Возможно, эта связь может помочь: git rejected push non-fast-forward. Кажется, это связано.

Я надеюсь, что это полезно, я предлагаю вам проверить его;)

Joey

+1

Не делайте этого в живой версии. Это повлечет за собой все изменения центрального репо на текущую версию, которую OP не хотел. – Holloway

3

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

Если вы не хотите делать git pull (и/или rebase) на реальном сервере, потому что это приведет к другим нежелательным изменениям, лучший способ восстановления - создать ветвь исправления на реальном сервере, которая содержит ваши исправления, а затем нажмите, чтобы:

git checkout -b hotfix-20150127 master 
git push origin hotfix-20150127 

Вы можете извлечь эту ветку на вашем Dev машины и объединить его в master чисто и протестировать его с последней версией разработки. Затем, когда вы в конечном итоге обновите живой сервер до последнего кода, вы знаете, что исправление все равно будет присутствовать.

Вы также должны сбросить master на реальном сервере, так что его master является предком origin/master снова:

git branch -f master master^ 

Это вынуждает мерзавец изменить главу master отрасли быть предыдущей фиксации (прежде чем вы сделаете исправление на реальном сервере). Вы не потеряете фиксацию, потому что она все еще находится на ветке hotfix-20150127 (которая в настоящее время проверена).

Способ избежать этого в будущем, либо для создания исправления ветви до того вы начинаете делать какие-либо изменения (так master ветвь никогда не расходится) или создать исправление ветви на вашем Dev машине (разветвление из той же ревизии, как находится на реальном сервере) и протестируйте его там, затем нажмите на сервер и проверьте его на реальном сервере.

В основном решение состоит в том, чтобы создать ветку из стабильной версии, запущенной на реальном сервере, и применить основные исправления к этой ветке и обеспечить, чтобы все исправления из этой ветви были объединены обратно в основную ветвь развития. Работа над двумя отдельными ветвями позволяет делать исправления с высоким приоритетом для стабильной версии, не мешая разработке на нестабильной ветке. См. Git Flow для немного более сложного, но гораздо более гибкого подхода.

+0

Спасибо за объяснение и спасибо за ссылку Git Flow, долгое необходимое решение. –