[devel-distro] Глядя на жуть в коммитах m-p-d
Денис Смирнов
mithraen at altlinux.ru
Tue Dec 1 16:54:39 MSK 2009
On Tue, Dec 01, 2009 at 08:03:24PM +0700, REAL wrote:
R> А можно не только над m-p-d? Знаю, что этот rebase существует, но не
R> знаю ни для чего он, ни как использовать. Просто для саморазвития, и
R> для того, чтобы не тратить время на самостоятельное освоение, думаю,
R> не только я с удовольствием послушаю.
Когда над одним проектом работает более одного человека, часто получается
следующая ситуация:
A (начальный коммит) -> B (работа одного человека) \_ merge
-> C (работа второго человека) /
Чем это плохо? Нет последовательности коммитов. Вместо линии получается
граф, и чем больше людей работает над проектом и делают merge друг у друга
-- тем более страшной получается история.
Это делает невозможным нормальное применение таких инструментов как
git-bisect, например. Да и просто разбираться в этой каше -- неудобно.
Теперь представим себе следующее -- ты апстрим, развиваешь активно проект.
Я сделал маленький патчик, базируясь на версии недельной давности. Ты
хочешь его интегрировать.
Путь 1: merge
Путь 2: cherry-pick (по сути это "наложить патч из вон того коммита на
текущий коммит, сохранив заголовки и авторство патча")
Второй путь имеет много преимуществ, правда один недостаток -- нет
гарантии что этот патч будет работать с новой версией :) Нов проекте
удачно разбитом на модули, обычно скорее будет чем нет.
Теперь другой вариант -- я сделал много-много-много изменений. Делать git
cherry-pick ты задолбаешься. Поэтому есть git rebase -- упрощенно это как
раз "сделать git cherry-pick на все патчи из моего дерева, поверх вон того
дерева", но гораздо более умный -- может пропускать уже интегрированные
патчи, и т.д.
Мой подход выглядит так:
# предварительно настроено чтобы его master ко мне импортировался как
# бранч с именем 'boyarsh'
git fetch boyarsh
# надо находится в своем master
git checkout master
# делаем rebase
git rebase boyarsh
# на этом этапе все мои изменения будут наложены поверх самого свежего
# бранча boyarsh
# если возникли конфликты -- правлю, делаю git update-index (все как при
# merge), но вместо git commit даю команду:
git rebase --continue
# если данный патч надо просто проигнорировать, например он был уже
# интегрирован и теперь просто пустой, то:
git rebase --skip
Под конец процедуры все мои патчи наложены поверх последнего бранча
boyarsh.
Теперь остается только сделать повторную сборку, убедиться что все Ok, и
можно делать git push.
На этом этап возникает некоторая сложность -- это не будет commit
наследник того, что было у нас раньше за push'ено. Поэтому git push надо
делать с --force, ну или соответствующим образом .git/config писать ;)
--
С уважением, Денис
http://freesource.info
----------------------------------------------------------------------------
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.altlinux.org/pipermail/devel-distro/attachments/20091201/a65dca41/attachment.bin>
More information about the devel-distro
mailing list