2014-12-10 4 views
0

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

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

Моя вторая ветвь называется preparation, я проверил ее в прошлом и сделал некоторые коммиты. К сожалению, я сделал коммиты в подкаталог, который я не хочу публично объявлять.
Однако произошли некоторые изменения, которые имели бы смысл втянуть в мастера. Эти изменения относятся только к подкаталогу ветви preparation.

Вот фотография истории фиксации. Я в основном сделал ошибку, чтобы зафиксировать изменения в подкаталоге ветки preparation, которые я сейчас не хочу иметь в master или удаленном репозитории вообще.

Что я могу сделать, чтобы иметь коммита историю, но не фальшивый совершить?

Спасибо!

+0

Если вы достигнете всех, у кого может быть плохое совершение, легко, и у них не было шанса получить слишком много инвестиций, просто «git checkout -B подготовить»:/Добавлена ​​дата '', сделайте коммиты, которые вы должны иметь сделанный, принудительный толчок и все обновления. – jthill

+0

Трудно разобрать то, что вы просите. Не уверен, что вы подразумеваете поддиректорией ветки, так как ветка не является каталогом, подобным CVS/SVN. Вы хотите, чтобы изменения в одной ветви добавлялись в другое место в другой ветке? Являются ли хорошие изменения в том же, что и плохие изменения? Возможно, вам понадобится интерактивная вишня, если это так. –

ответ

2

Я не уверен, но, возможно, вам просто нужно удалить один коммит, обозначенный как «Новый разговор» из истории, которую вы планируете объединить.

Если это так, вы можете использовать интерактивную перезагрузку. Чтобы пропустить одно коммит во время интерактивного перезагрузки, просто удалите его из списка фиксации.

Я предполагаю, что фиксация «Новый разговор» является фиксацией числа пять при запуске git log. Я также предполагаю, что ваше репо чистое.

Вот процедура.

Сначала создайте новую ветвь под названием new-preparation (только в случае, если что-то пойдет не так):

git checkout -b new-preparation preparation 

Теперь запустите интерактивное перебазирование:

git rebase -i HEAD~5 

Git должен начать ВЬЕТ с пяти последними ревизиями, показываемых (тот, который вы хотите устранить, должен находиться на самом верху):

pick SHA-1 - oldest of five commits - the one labelled "New talk" 
pick SHA-1 
pick SHA-1 
pick SHA-1 
pick SHA-1 - newest of five commits 

Удалить первую строку. Содержание vim должно выглядеть так:

pick SHA-1 
pick SHA-1 
pick SHA-1 
pick SHA-1 - newest of five commits 

сохранить файл и выйти.

Git должен переустанавливать четыре оставшихся фиксации.

Теперь вы должны иметь свою ветку без фиксации «Новый разговор».

1

Я не думаю, что вы понимаете, как работает git. И это ужасно помутняет то, что вы описываете.

Вы не можете вносить изменения в каталог или подкаталог. Скажите это со мной: изменения привязаны к филиалам.

Ошибка, которую вы сделали, заключается в смешении использования ветви для коммитов, которые не были связаны. Филиалы в git дешевы. Лучшей практикой является создание branch для каждой отдельной функции, над которой вы работаете.

Это в стороне, скажем, вам нужно, чтобы предыдущая работа присутствовала до того, как вы обнаружили необходимость внести это изменение и хотели, чтобы она была исправлена ​​в обоих местах.

Это довольно распространенный вопрос и ответили разными способами. Вам нужно будет выполнить фиксацию на основе переадресации. Взгляните на книжной документации мерзавца для rebases: http://git-scm.com/book/ch3-6.html

Короче говоря, вы хотите взять фиксации с некоторой точкой вперед, но пропуская кучу фиксаций между общим предком вашей отрасли и местом, которое вы хотите объединить в ,

В этом случае при условии, что это только один совершить вы собираетесь нужно сделать что-то вроде этого: git rebase --onto origin/master HEAD~ preparation

То есть, я предлагаю читать материал первым и получить понимание того, что вы делаете.

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