как использовать git rebase для очистки запутанной истории - PullRequest
8 голосов
/ 12 июня 2010

После нескольких недель работы с полдюжины разных веток и слияний на моем ноутбуке, на работе и на моем домашнем компьютере моя история стала немного запутанной.Например, я только что сделал выборку, затем слил master с origin / master.Теперь, когда я делаю git show-branch, вывод выглядит так:

! [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
....

Я бы хотел убрать это с помощью git rebase.Для этого я создал новую ветку rebase-master и в этой ветке попробовал git rebase,Однако мне приходится разрешать многие конфликты, и конечный результат на ветке rebase-master больше не соответствует соответствующей версии на master, которая уже была протестирована и работает!

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

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

Ответы [ 2 ]

12 голосов
/ 10 июля 2010

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

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

$ git fetch origin
$ git rebase origin/master

Теперь объедините ветвь с мастером.Это будет ускоренное слияние.

$ git checkout master
$ git merge foobranch

А теперь продвиньте работу вверх по течению.

$ git push
6 голосов
/ 12 июня 2010

Обычный процесс для репозиториев, в котором вы можете принудительно выдвинуть ветку (заменив удаленную историю новой, созданной локально с помощью rebase), должен сделать:

git rebase --interactive

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

В сеансе перебазирования вы можете обрезать коммиты Git и историю сквоша , чтобы получить необходимую вам историю.

...