2012-09-21 6 views
1

Я, кажется, испортил мой git-репо, возможно, совершив грех «Не перебивайте коммиты, которые вы нажали в общедоступный репозиторий».Проблема с переустановкой Git - следует ли мне «push -force origin»

Сценарий таков:

  • отслеживать изменения из вышестоящего хранилища в моей главной ветви, я держу свои собственные изменения в ветке под названием разви.
  • Когда есть изменение в восходящем репозитории, я втягиваю его в главную ветвь.
  • Затем я оформляю оформление и делаю rebase master на нем, чтобы получить собственные изменения поверх главной ветки. Это создает вызывают конфликты, давая следующее сообщение об ошибке, чтобы придумать в несколько фиксациях (я включаю только один из них ниже в качестве примера):

отступая по прошивке базы и 3-полосные слияний. .. Автоматическое слияние public/scala/qscript/org/broadinstitute/sting/queue/qscripts/AlignWithBWA.scala КОНФЛИКТ (содержимое): конфликт слияния в public/scala/qscript/org/broadinstitute/sting/queue/qscripts /AlignWithBWA.scala Не удалось объединить изменения. Патч не удался в 0038 Добавлена ​​проверка для индексных файлов.

Когда вы решите эту проблему, запустите «git rebase -continue». Если вы предпочли бы пропустить этот патч, вместо этого запустите «git rebase -skip». Чтобы проверить исходную ветку и остановить перезагрузку «git rebase --abort».

  • Затем я использую git rebase --skip пропустить совершающее вызывающие проблемы, и, наконец, я в конечном итоге с кодом я хочу.

Теперь проблема, каждый раз, когда я хочу перебазироваться я должен пройти эту процедуру. Есть ли способ избежать того, чтобы избежать конфликтов в будущем? Моя идея состоит в том, чтобы использовать push --force origin devel, чтобы перезаписать историю в удаленном репо с помощью коммитов, которые вызывают конфликты. Это путь? Или есть другой способ решить эту проблему?

ответ

1

Предполагая, что восходящий поток не переписывает общедоступную историю, вы должны корректировать свои фиксации для работы поверх последнего кода от мастера. Вместо этого вы пропускаете коммиты, которые конфликтуют. Вам необходимо вместо этого разрешить конфликты, а затем пометить их, используя git add, а затем git rebase --continue (не --skip).

Причина, по которой конфликты сохраняются, заключается в том, что вы пропускаете их каждый раз.

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

1

Нажимная сила должна выполняться только в самых тяжелых условиях.

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

Итак, вы лучше всего разрешаете конфликты вручную.

Если код имеет изменения в тех же строках, вам необходимо будет их разрешить вручную. Использование силы - это не способ «разрешить» их.

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

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

1

Не думаю, что git push --force - хорошая идея здесь. В любом случае перед использованием git push --force вы должны сделать что-то вроде git fetch и git diff devel origin/master, чтобы узнать, что вы добавляете и удаляете с помощью push и имейте в виду, что после --force другие разработчики получат предупреждения и, вероятно, потребуется переустановить и повторно нажать их изменения ,

  1. Я ожидаю, что с git rebase --skip вы пропустите свои замыслы своего девела, а не извлеченные магические;
  2. После того, как «rebase» должно быть в состоянии проталкивать без «--force» (если новые коммиты не приходят туда достаточно быстро, чтобы потребовать еще один цикл извлечения/переустановки).

Некоторые примечания:

  • Если вы не хотите, чтобы разрешить те же конфликты снова и вы можете использовать «GIT rerere»
  • Git автоматически отражает удаленное содержимое как «происхождения/мастер », вы можете использовать« git fetch »для его обновления. Затем вы можете использовать «git rebase origin/master» в своем devel без необходимости переключения взад-вперед в/из ветви «master».
Смежные вопросы