2015-09-20 1 views
5

Я работаю последние две недели над функцией, и я создал для нее отдельную ветку. Проблема в том, что задача заняла у меня много времени, и я не переустанавливал свою ветвь, чтобы учиться периодически. Я закончил с 100 + коммитами, и теперь, когда я пытаюсь перестроить ветвь, чтобы справиться с использованием git rebase master, она берет навсегда, так как мне нужно проверить конфликт для каждой фиксации, изменить его, git add, а затем git rebase --continue.Есть ли быстрый способ переустановить долгую историю фиксации, чтобы овладеть веткой?

Есть ли более простой способ сделать это?

+0

Не совсем, нет ... нет, если вы не против прямого слияния, чтобы сделать все это за один раз. – Makoto

+0

Я не хочу сливаться, и я хочу использовать rebase, поэтому я могу переписать запись истории. Aw есть ли какое-либо обходное решение, даже если это означает потерять историю моих транзакций для этой ветви? Я просто хочу удостовериться, что последний код для этой ветки был переустановлен? –

+0

Тогда вам придется иметь дело с каждым конфликтом слияния при переустановке. Вы бы скорее не потеряли работу, которую вы сделали. – Makoto

ответ

4

Это частично зависит от того, как вы совершили более 100 коммитов и что происходит в то же время. Четыре стратегии может быть полезна:

Сократите количество фиксаций перебазироваться

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

Однако, начиная с 100 за две недели, я предполагаю, что ваша история фиксации не нравится. Возможно, вы изменили функцию X 5 раз в истории фиксации, и каждый из этих коммитов будет вызывать конфликт. Если бы у вас была одна фиксация, которая изменила функцию X, у вас было бы 20% работы.

Таким образом, ответ здесь заключается в том, чтобы убрать вашу историю фиксации до того, как вы переустановите мастер. Это другое использование для «git rebase». Восстановите его на своей существующей базе, но используйте git rebase -i для интерактивного сквоша вместе и изменения порядка совершения. Убедитесь, что у вас минимальное количество коммитов и что каждый из них делает что-то независимое. Вы можете воспользоваться возможностью также изменить свои журналы фиксации. Ключи резервного копирования ключей (git branch) и git diff для тех, кто после каждой фиксации проверяет, что вы ничего не изменили.

В частности, если у вас есть внутренняя слияния, то сплющивание полезно.

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

Rebase в стадии

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

A --- B --- C --- D --- E --- F -- .... -- X --- Y --- Z (master) 
    \ 
     \----- 1 --- 2 --- 3 --- 4 .... 97 --- 98 --- 99 --- 100 (you) 

То, что вы хотите сделать, в конечном счете, является перебазироваться на Z. Тем не менее, это дает вам нагрузки конфликтов. Предположим, что D и E являются двумя мегакомитами от коллеги, которые реорганизуют то, с чем сталкивается ваш код.Иногда это проще:

  • перебазироваться на C (это не должно быть много работы)
  • Сделайте глубокий вдох и перебазироваться на E
  • перебазироваться на хозяина (это не должно быть много работы)

избежать сложности на стороне «мастер»

Иногда вещи получили действительно сложно на дереве вы пытаетесь слиться. Классический случай состоит в том, что (используя приведенную выше диаграмму), commit G возвращает commit C, затем фиксирует H повторения (или почти повторяет) его, и в то же время происходят слияния (в частности, вещи, которые вы, возможно, тоже объединили) , Спасибо коллеге, это сделано очень легко. Другие вещи, которые вызывают трудности, - это сложные слияния и неприятные переименования. Каждое совершение имеет тенденцию давать вам те же конфликты снова и снова без видимых причин. git rebase Aarrggh.

Один из способов заключается в том, чтобы сгладить копию основного дерева, то есть мастера ветвления (локально), а затем переустановить его, чтобы уничтожить все это в единую фиксацию от А до Я. Вы можете сгладить свои вещи немного сначала (см. выше). Затем переложите на сплющенный мастер. Теперь у вас есть «правильный» набор коммитов, вы можете легко переустановить это на master (ну, на «Z», поскольку мастер может измениться), потому что код точно такой же.

Если все остальное терпит неудачу

Иногда git rebase, кажется, идет в фуга состояние конфликтов, и настало время, чтобы вырваться из git format-patch и git am, чтобы повторно применить его в целом или в битах. Это действительно полезно, если кто-то переименовал файл (так как вы можете исправить имя файла в патче в редакторе) или переименован в общий класс/переменную/независимо (как вы можете найти/заменить в патче).

Учитесь на своих ошибках

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

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

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