После работы в течение нескольких недель с полдюжиной различными ответвлениями и слияниями, на обоих моих ноутбуках и работе и моем рабочем столе дома, моя история стала немного замысловатой. Например, я просто сделал выборку, затем объединенное ведущее устройство с источником/ведущим устройством. Теперь, когда я делаю выставочные ответвления мерзавца, вывод похож на это:
! [login] Changed domain name. ! [master] Merge remote branch 'origin/master' ! [migrate-1.9] Migrating to 1.9.1 on Heroku ! [rebase-master] Merge remote branch 'origin/master' ---- - - [master] Merge remote branch 'origin/master' + + [master^2] A bit of re-arranging and cleanup. - - [master^2^] Merge branch 'rpx-login' + + [master^2^^2] Commented out some debug logging. + + [master^2^^2^] Monkey-patched Rack::Request#ip + + [master^2^^2~2] dump each request to log ....
Я хотел бы очистить это с перебазой мерзавцев. Я создал новое ответвление, переосновное ведущее устройство, с этой целью, и на этом ответвлении попробовало перебазу мерзавцев <общий предок>. Однако я должен разрешить много конфликтов, и конечный результат на переосновном ведущем устройстве ответвления больше не соответствует соответствующей версии на ведущем устройстве, которое было уже протестировано и работы!
Я думал, что видел решение этого где-нибудь, но не могу больше находить его. Кто-либо знает, как сделать это? Или будут они замысловатые касательно имен уходят, когда я начинаю удалять ненужные ответвления, с которыми я уже объединился?
Я - единственный разработчик на этом проекте, таким образом, нет никого больше, кто будет затронут.
Обычный процесс для репозиториев, где вы можете принудительно проталкивать ветку (заменяя удалённую историю новой, созданной локально с помощью rebase), заключается в следующем:
git rebase --interactive
Но опять же, это действительно только в том случае, если вы единственный, кто тянет из вашего репозитория, и даже тогда вам придётся переинициализировать некоторые из ваших локальных веток на новые удалённые ветки, которые были переписаны.
Из сессии rebase вы можете обрезать Git-коммиты и squash history, чтобы получить ту историю, которая вам нужна.
Лучший способ очистить запутанную историю - сохранить ее линейной. Вы делаете это, избегая любого слияния, кроме быстрой перемотки вперед.
Рабочий процесс выглядит следующим образом.
$ git checkout -b foobranch
<do stuff>
$ git commit
<do stuff>
$ git commit
...
Когда пришло время интегрировать ветку в мастер, не объединяйте ее. Вместо этого переустановите эту ветку относительно мастера. Это сделает ветку больше не похожей на ветку, а просто больше роста на вершине дерева. Вы разрешаете любые конфликты слияния во время перебазирования.
$ git fetch origin
$ git rebase origin/master
Теперь слейте ветку с мастером. Это будет быстрое слияние.
$ git checkout master
$ git merge foobranch
А теперь продвиньте работу вверх по течению.
$ git push