2013-03-12 2 views
2

СкажемЧто такое зло об объявленной мерзавца толчке -f в то время как все остальные делает Git тянуть --rebase

  • вы раздвоенный проект на GitHub
  • несколько человек (менее 5) работают над этим вилка
  • цель состоит в том, чтобы сделать запрос тянуть с нашими изменениями

После нескольких фиксаций к нашей вилке, теперь мы хотим обновить нашу вилку до последней ГОЛОВЫ от исходного проекта. Поскольку несколько человек работают над этой вилкой, стандартный способ состоит в том, чтобы вытащить исходный проект, а затем выполнить фиксацию слияния, чтобы ввести последний HEAD из исходного проекта.

Нам это не нравится, потому что это делает нашу историю нелинейной и у нас будет много «бесполезных» слияний.

Наша альтернативная идея заключается в следующем:

  1. мерзавец тянуть --rebase сделать местный имеет последнюю раздвоенный ГОЛОВУ
  2. Rebase нашу вилку, чтобы принести в новом последнем источнике HEAD, таким образом, что наши фиксаций являются после источник ГОЛОВА
  3. мерзавец толчок --force
  4. все остальные будут получать последние с мерзавец тянуть --rebase (который мы можем сделать по умолчанию для всех)

История линейная, просто требуется некоторая координация для коммиттеров вилки.

В чем проблема с этим подходом?

ответ

4

Вы начинаете здесь (U вверх по течению, Y за вами):

UB--U1--U2 
\ 
    Y1--Y2 

Теперь вы делаете перебазирования (и push -f):

UB--U1--U2--Y1'--Y2' 

Теперь ваша вторая команда-участник делает pull --rebase:

UB--U1--U2--Y1'--Y2'--Y1''--Y2'' 

Как указано на карте - i f вы должны были разрешить конфликты, git не заметит, что уже есть версии Y1 и Y2 в репо и снова переупорядочиваются (возможно, также приводят некоторые уродливые конфликты).

Я бы рекомендовал делать слияния (вы можете посмотреть свою линейную историю с git log --no-merges). Если вы действительно хотите попробовать перебазирования путь, вот что вы можете сделать:

Вы бежите:

git fetch --all 
git branch rebase_base master 
git push origin rebase_base 
git rebase upstream/master 
git push -f origin master 

Все остальные затем бежит:

git fetch origin 
git rebase --onto origin/master origin/rebase_base master 

Посмотрите на git help rebase, чтобы почему это работает;). В основном вы говорите git до тех пор, пока не зафиксируете, что вы уже сделали rebase (rebase_base), поэтому он не будет пересобирать ненужные вещи.

+0

вместо ветки базы данных базы данных, нельзя было также использовать тег базы базы данных? –

+1

Вид, но тогда это будет работать только один раз или вызвать проблемы самостоятельно, потому что изменение тега тоже не так просто :). – Chronial

+0

Правда. Хотя, если кто-то в какой-то момент решает, что даже rebase_base должен расходиться, у вас будет rebase_base_rebase_base: -7 –

1

Не требуется git push -f. Rebase и merge (через git pull --rebase и git pull соответственно) являются двумя альтернативами, и вы можете следить за ними, чтобы ваша ветка обновлялась вверх по течению.

ли git pull --rebase, разрешать конфликты, если таковые имеются, пользуются «бесполезным» сливаться совершить свободное историю и просто сделать git push

+0

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

1

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

Причина в том, что Git обнаруживает, что фиксация уже применяется, сравнивая фиксации через их идентификатор патча (см. git patch-id). Из-за внесения изменений для разрешения конфликта идентификатор патча может измениться.

Такая работа может потребоваться другим лицам, например. сброса и внесения вишни местных изменений.

1

Проще говоря, нет ничего плохого в git push -f для вашей собственной ветки. Плохая часть происходит, когда вам нужно координировать работу с другими разработчиками. Если только все пользователи не сообщают , то точно что вы делаете силовой удар, это может усложниться. Чтобы избежать осложнений, каждый разработчик должен прекратить выполнять работу, которую они выполняют, чтобы разместить силовой толчок. Это нарушает рабочий процесс и заканчивается тем, что требует ненужного времени и усилий.

Приятная вещь в распределенной системе управления версиями заключается в том, что вам не нужно просить разработчиков прекратить выполнять свою работу, чтобы разместить редактирование! В плохие дни, когда разработчик (а) проверил файл, система VCS получит пессимистическую блокировку файла, а другой разработчик (б) должен будет скремблировать, чтобы найти первого разработчика (а), который проверил файл и попросил разработчика (а) проверить файл, чтобы разработчик (б) смог отредактировать файл. Но я ухожу от темы.

Вернемся к теме, я думаю, вам будет полезно использовать topic branch workflow. Настройте ветвь master в своей вилке, чтобы отследить исходную работу, которую вы отделили. Мастер содержит всю работу из оригинального проекта.

Поскольку ваша команда разрабатывает новые функции, им нужно будет где-то сменять изменения. Это не редкость для создания новой удаленной ветви с именем development или любым другим, что вы выберете, чтобы команда могла нажать и вытащить свои изменения. Этот новый удаленный филиал фактически является филиалом trunk для вашей команды.

Кто-то должен нести ответственность за слияние изменений с master исходного проекта в ветку разветвленного проекта development, но это намного проще, чем попросить всех разместить силовой толчок к багажнику. Вам также необходимо установить политику для ветвей master и development forked.Этот рабочий процесс позволяет разработчикам вытягивать/объединять разветвленный репозиторий, не прерывая их собственный рабочий процесс.

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

  • Нет связанных вопросов^_^