действительно ли возможно повторно основывать ответвление со всем, что это - небольшие филиалы в мерзавце?
я часто использую ответвления в качестве быстрых/изменяемых тегов для маркировки определенных фиксаций.
* 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
существует ли путь вокруг этого или застревает я с воссозданием ответвлений по новым переоснованным фиксациям?
Я не знаю, как именно вы туда попали, но:
git branch -f (same changeset as featureA-finished)
должно быть достаточно, чтобы сбросить ветку featureA-finished
с помощью правильная история.
Что я бы посоветовал, так это сначала перебазировать featureA-finished
на origin/master
. Затем выполните этап переписывания. После этого пересоздайте master
на featureA-finished
. В результате вы получите желаемый конечный результат.
Обратите внимание, что вам нужно будет использовать -i
на обоих ребазах, и, возможно, придётся удалить все коммиты из оригинальной featureA-finshed
при втором ребазе. При желании можно написать сценарий, который устранит эту проблему, сохраняя промежуточную ветвь и используя её в качестве базы для ребаза --onto
новой версии. Он даже может обрабатывать последовательность таких "субветвей", если вы напишете его правильно. Если вам нужна помощь, я могу попытаться сделать это.
Согласно объектной модели 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
принадлежит обеим ветвям!