ответвление перебазы мерзавцев со всеми небольшими филиалами

действительно ли возможно повторно основывать ответвление со всем, что это - небольшие филиалы в мерзавце?

я часто использую ответвления в качестве быстрых/изменяемых тегов для маркировки определенных фиксаций.

* master
*
* featureA-finished
*
* origin/master

теперь я хочу rebase -i master на origin/master, измениться/перефразировать фиксацию featureA-finished^

после git rebase -i --onto origin/master origin/master master, я в основном хочу, чтобы история была:

* master
*
* featureA-finished
* (changed/reworded)
* origin/master

но то, что я получаю:

* master
*
* (same changeset as featureA-finished)
* (changed/reworded)
| * featureA-finished
|.* (original commit i wanted to edit)
* origin/master

существует ли путь вокруг этого или застревает я с воссозданием ответвлений по новым переоснованным фиксациям?

17
задан knittl 28 April 2010 в 15:27
поделиться

3 ответа

Я не знаю, как именно вы туда попали, но:

git branch -f (same changeset as featureA-finished)

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

2
ответ дан 30 November 2019 в 14:36
поделиться

Что я бы посоветовал, так это сначала перебазировать featureA-finished на origin/master. Затем выполните этап переписывания. После этого пересоздайте master на featureA-finished. В результате вы получите желаемый конечный результат.

Обратите внимание, что вам нужно будет использовать -i на обоих ребазах, и, возможно, придётся удалить все коммиты из оригинальной featureA-finshed при втором ребазе. При желании можно написать сценарий, который устранит эту проблему, сохраняя промежуточную ветвь и используя её в качестве базы для ребаза --onto новой версии. Он даже может обрабатывать последовательность таких "субветвей", если вы напишете его правильно. Если вам нужна помощь, я могу попытаться сделать это.

1
ответ дан 30 November 2019 в 14:36
поделиться

Согласно объектной модели git , если вы изменяете только метаданные фиксации (т. Е. Сообщение фиксации), но не содержащиеся в нем базовые данные («дерево (я)»), то это хэш дерева. останется без изменений.

Помимо редактирования сообщения о фиксации, вы также выполняете перебазирование, которое изменяет хэши дерева каждой фиксации в вашей истории, потому что любые изменения, извлеченные из origin / master , повлияют на файлы в вашем переписанная история: это означает, что некоторые файлы (капли), на которые указывает ваша фиксация, были изменены.

Так что не существует надежного способа делать то, что вы хотите.

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

Вам нужно будет написать скрипт, который записывает все точки начала ветки по этому идентификатору «timestamp: author» перед выполнением перебазирования, а затем находит переписанные коммиты с тем же идентификатором «timestamp: author» и перебазирует ветку. в теме.

К сожалению, у меня сейчас нет времени самому писать этот сценарий, поэтому я могу только пожелать вам удачи!

Изменить : Вы можете получить адрес электронной почты автора и временную метку, используя:

$ git log --graph --all --pretty=format:"%h %ae:%ci"
* 53ca31a robert.meerman@gmail.com:2010-06-16 13:50:12 +0100
* 03dda75 robert.meerman@gmail.com:2010-06-16 13:50:11 +0100
| * a8bb03a robert.meerman@gmail.com:2010-06-16 13:49:46 +0100
| * b93e59d robert.meerman@gmail.com:2010-06-16 13:49:44 +0100
|/
* d4214a2 robert.meerman@gmail.com:2010-06-16 13:49:41 +0100

И вы можете получить список ветвей для каждой из них на основе их хэша фиксации:

$ git branch --contains 03dda75
* testbranch

Следите за несколькими ветвями на фиксацию общий предок d4214a2 принадлежит обеим ветвям!

5
ответ дан 30 November 2019 в 14:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: