Git - Перемещение выдвинутых коммитов в другую ветку - PullRequest
37 голосов
/ 01 февраля 2012

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

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

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

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

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

Оранжевые точки - это их коммиты, серые - мои.

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

Заранее спасибо!


Edit: Возможно, я нашел то, что искал: Переместите самые последние коммиты в новую ветку с помощью Git

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

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

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

Ответы [ 2 ]

47 голосов
/ 01 февраля 2012

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

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 pull-запросы или иным образом не позволяйте им подталкивать к мастеру, пока они не получат его правильно. Что, основываясь на вашем резюме, может занять некоторое время.)

0 голосов
/ 01 февраля 2012

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

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

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

...