2012-01-31 5 views
32

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

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

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

Сегодня они толкнули в первый раз. Пять коммитов, все они у мастера. Я пытаюсь понять, как переместить свои коммиты от мастера в TheOutsourcedBranch, не теряя при этом работу, которую они сделали (хотя, по внешнему виду, нам все равно придется выбросить ее).

Visual Reference -- Orange dots are their commits, gray are mine.

Оранжевые точки являются их фиксаций, серые точки мои.

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

Заранее благодарен!


Edit: я, возможно, нашел то, что я ищу: Move the most recent commit(s) to a new branch with Git

Я хотел бы проверить свое понимание, хотя. Локально я создаю ветку от мастера (TheOutsourcedBranch), который будет содержать все A-H. Затем я возвращаю мастер обратно к C. Мастер теперь будет содержать A-C.

Предполагая, что это правильно, это было бы хорошо для меня (локально). Но что мне нужно сделать, чтобы «заставить» удаленный репозиторий (GitHub) принять мое локальное представление о том, как все происходит и отбрасывает свою версию истории?

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

ответ

39

Получение ветви легко:

git branch their-branch master 
git reset --hard master $SHA1_OF_C 
git push --force $SHARED_REPO_REMOTE 

Это будет переписать историю; он создает новую ветвь, которая эквивалентна текущей главной ветви с именем their-branch, а затем сбрасывает ваш локальный мастер, чтобы указать на случайный SHA1 (... или ветвь, или тег или что-то еще), и, наконец, принудительно обновляет ветвь удаленного репозитория до соответствие вашему местному филиалу.

То, что поставляет ровно ситуации, которую вы хотите.

Предостережения: это перепишет историю и может испортить всех, кто построил старого хозяина. Следите за проблемами слияния.

Нет необходимости в переустановке или требуется.

(В качестве стороннего предложения я предлагаю вам либо предоставить им промежуточное хранилище, либо использовать их git send-email, либо использовать запросы на извлечение GitHub или иным образом препятствовать им нажимать на мастер, пока они не поправят его. резюме, может быть, некоторое время.)

+3

Просто хотел поделиться тем, что это решило ту же проблему для меня - но мне пришлось изменить второй шаг на 'git reset --hard $ SHA1_OF_C' (удаление ссылки на master); до этого я становился «фатальным: не могу выполнить жесткий сброс с помощью путей». Возможно, это изменение в недавней версии git? –

+0

После того, как я перезагрузился - мой локальный репозиторий позади, и из-за этого из-за отказа от git. – vanowm

+0

Никогда не используйте 'push -force', это плохая идея. Это серьезно повредит истории другим пользователям, которые уже потянули. Хуже того, если у вас есть ваш журнал Git, интегрированный в другие системы, такие как Redmine, Jira и т. Д., То он может серьезно повредить базы данных и быть довольно сложным для очистки. – Adam

-1

Попросите их отделить каждую битку от одной и той же начальной точки за каждый билет, на котором они работают. Попросите их объединить работу с веткой RC. Вы можете объединить свою работу с ветвью RC. Это позволит вам часто тестировать. См рабочий процесс, мы имеем здесь:

https://plus.google.com/109096274754593704906/posts/R4qkeyRadLR

Позвольте мне знать, если у вас есть какие-либо вопросы по этому поводу. Это хорошо работает для нас.

+0

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

+0

Без принудительного нажатия вы можете заставить их использовать другое название ветки. Филиалы просто указывают на фиксации. –