LINUX.ORG.RU

Линеаризация истории

 ,


2

3

Здравствуйте!

Есть репозиторий git (кусок истории):

...
* 8
* 7 merge
|\  
| * 6
| * 5
| * 4
* | 3
|/  
* 2
* 1
...

Как слить это раздвоение в одну ветку, чтобы получилось так:

...
* 8
* 6
* 5
* 4
* 3
* 2
* 1
...

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

В коммите 3 изменения очень незначительные, буквально пять строк изменено (всего в файле 800).

Тот-же вопрос и по mercurial.

★★★★★

Цитата с нельзя-здесь-упоминать:

Предположим, имеется две ветки, master и топик, в каждой из которых было совершенно несколько коммитов начиная с момента ветвления. Команда git rebase берет коммиты из ветки topic и накладывает их на последний коммит ветки master:

git-rebase master topic — вариант, в котором явно указывается, что и куда прикладывается. git-rebase master — на master накладывается активная в настоящий момент ветка.

После использования команды история становится линейной. При возникновении конфликтов при поочередном накладывании коммитов работа команды будет останавливаться, а в проблемные местах файлов появятся соответствующие метки. После редактирования — разрешения конфликтов — файлы следует внести в индекс командой git add и продолжить наложение следующих коммитов командой git rebase --continue. Альтернативными выходами будут команды git rebase --skip (пропустить наложение коммита и перейти к следующему) или git rebase --abort (отмена работы команды и всех внесенных изменений).

С ключом -i (--interactive) команда будет работать в интерактивном режиме. Пользователю будет предоставлена возможность определить порядок внесения изменений, автоматически будет вызывать редактор для разрешения конфликтов и так далее.

Помогло?

eagleivg ★★★★★
()
Ответ на: комментарий от xorik

git rebase 2 6 --onto master

First, rewinding head to replay your work on top of it...
Fast-forwarded 6 to master.

История не изменилась.

Puzan ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

hg rebase -s 4 -d 3; hg rebase -s 8 -d tip

Заставляет руками мержить один и тот-же файл девять раз. В итоге, коммиты 5, 6, 7 исчезли из истории.

Puzan ★★★★★
() автор топика
Ответ на: комментарий от Puzan

Заставляет руками мержить один и тот-же файл девять раз

девять раз

Ты чего-то недоговариваешь.

коммиты 5, 6, 7 исчезли из истории.

И этого не должно было случиться, потому что... ?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Ты чего-то недоговариваешь.

Да нет, всё так и есть. Может из-за того, что до и после этого куска еще сотни коммитов?

И этого не должно было случиться, потому что... ?

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

Puzan ★★★★★
() автор топика
Ответ на: комментарий от Puzan

Может из-за того, что до и после этого куска еще сотни коммитов?

Ну, если топология не такая, как ты нарисовал, то ХЗ.

потому что я не просил меркуриал слить три коммита в один

Возможно, они оказались пустыми - не помню, как ведет себя rebase в этом случае.

tailgunner ★★★★★
()

просто git rebase 2

и нужно понимать, что новая ветка будет с другим хедом и, соответственно, без форса не запушится.

mashina ★★★★★
()
Последнее исправление: mashina (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Ну, если топология не такая, как ты нарисовал, то ХЗ.

До этого участка идет одна линейная ветка. После - много разветвлений и слияний.

Возможно, они оказались пустыми - не помню, как ведет себя rebase в этом случае.

Коммиты не пустые.

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

Puzan ★★★★★
() автор топика
Ответ на: комментарий от Puzan

Возможно, они оказались пустыми - не помню, как ведет себя rebase в этом случае.

Коммиты не пустые.

Ты хочешь сказать, что hg тупо выбросил данные? O_o Или он схлопнул несколько коммитов в один?

tailgunner ★★★★★
()
Ответ на: комментарий от mashina

просто git rebase 2

Непонятное что-то получилась. Коммиты с 4-го и выше продублировались в отдельной ветке. Правда, ветка линейная и 3-й коммит туда включен.

Puzan ★★★★★
() автор топика
Ответ на: комментарий от Puzan

Коммиты с 4-го и выше продублировались в отдельной ветке.

Правда, ветка линейная

это как так?

не заметил, что сверху у тебя многоточние. Задуманное можно сделать, если выше многоточия нет больше раздвоений и мержей. Иначе будет гемор

mashina ★★★★★
()
Последнее исправление: mashina (всего исправлений: 1)
Ответ на: комментарий от mashina

Вау, сработало! Убрал все лишние ветки и для каждой из оставшихся сделал git rebase 2. Удивительным образом почти не пришлось мержить.

Надо получше изучить этот rebase.

Puzan ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

Такое впечатление, что ты указал --collapse

Точно не указывал.

Puzan ★★★★★
() автор топика
Ответ на: комментарий от Puzan

Убрал все лишние ветки и для каждой из оставшихся сделал git rebase 2.

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

mashina ★★★★★
()

Есть теория, что любую гитопроблему можно решить с rebase -i

dmitry_malikov ★★
()
Ответ на: комментарий от mashina

Испортил историю?
Историю нельзя испортить, можно просто однажды утерять коммиты, по которым пробежится gc, если на них не указывают никакие бранчи

dmitry_malikov ★★
()
Ответ на: комментарий от mashina

Уголовную ответственность за некорректное резольвирование конфликтов у нас пока не ввели.

dmitry_malikov ★★
()
Ответ на: комментарий от mashina

Если выше многоточий отходят несколько веток и в каждой их них сделал rebase 2, то считай что размножил все комиты и испортил историю.

Да, именно так и получилось. Но это меня устраивает.

Puzan ★★★★★
() автор топика
Ответ на: комментарий от kvap

А зачем вообще нужно выпрямлять историю?

Да в общем я уже засомневался, нужно ли. В любом случае, присутствует академический интерес.

Puzan ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.