2008-12-13 3 views
33

Скажем, у меня есть git-репозиторий, и я работал над мастером, могу ли я ретроактивно создать ветку. Например:Можно ли ретроактивно превратить набор коммитов в ветку?

A - B - C - A1 - D - A2 - E

Я хочу, чтобы сделать его выглядеть следующим образом:

A - A1 - A2 
\   \ 
B - C - D - E 

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

По существу это то, что было бы хорошо, как функция или ветвь темы, но не создавалась именно так.

ответ

15

Конечно, вы можете. (С Git там не так много, чем вы не можете сделать в любом случае. :)

git checkout -b new-branch hash-of-A 
git cherry-pick hash-of-A1 
git cherry-pick hash-of-A2 

Это создаст новую ветвь, начиная с фиксации A. После этого вы возвращаетесь к тому же совершить вновь, создавая другую ветвь:

git checkout -b new-branch2 hash-of-A 
git cherry-pick hash-of-B 
git cherry-pick hash-of-C 
git cherry-pick hash-of-D 
git cherry-pick hash-of-E 
git merge new-branch 

Теперь вы просто должны объединить new-branch и new-branch2, чтобы получить структуру, которую вы хотите, и уронить свою старую ветку.

Конечно, по словам Дастина, хэши коммитов будут изменены, поэтому вы должны сделать это только в том случае, если вы еще не опубликовали свои изменения.

+0

Итак, если ветка, в которой я была, была мастером, я должен переместить имя мастера в голову new-branch2? Делает смысл. Спасибо. – Otto 2008-12-14 03:42:22

+2

Путь слишком много работы. См. Мой ответ ниже. – 2011-01-20 20:21:04

+1

Да, с тех пор мои интерактивные навыки буксировки значительно улучшились. :) – Bombe 2011-01-21 11:19:19

6

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

0

Что вы хотите сделать на самом деле переписать История. Идентификаторы коммитов изменились бы, и в некоторых случаях изменения, заданные коммитами, изменились бы. Поэтому, если есть вероятность, что кто-то может основывать работу на старой версии ветки, которую вы хотите изменить, лучше не делать этого. Но если вы не опубликовали эту ветку, не стесняйтесь.

Предположим, что ветвь, которую мы хотим изменить, называется «хозяином», а точка, в которой мы хотим начать новую ветку, называется «A» (в данном примере одним из имен, которые вы можете использовать, является «master ~ 6').

Во-первых, позволяет создать новую ветвь от фиксации «A», давайте назовем его текущим «фиксирует»

$ git checkout -b fixes A 

Это также сделать ветка «фиксирует». Потому что есть только несколько фиксаций, которые мы хотим не-вишневого выбор, мы можем вишневые забрать их на «исправлениях» Отрасли:

$ git cherry-pick A1 
$ git cherry-pick A2 

Затем мы хотим, чтобы удалить коммиты «А1» и «А2» от филиала 'мастер'. Потому что есть только несколько фиксаций мы хотим удалить, и, возможно, многое другое мы хотим сохранить, мы eould использовать «мерзавец перебазироваться --interactive» для этого:

$ git rebase -i fixes master 

Редактор будет разжег со всеми фиксируется в «хозяине» после фиксации «А» (который является общим фиксатором, т. е. объединяет базу ветвей «хозяин» и «исправления» ветки).Этот список будет выглядеть следующим образом:

pick deadbee B 
pick fa1afe1 C 
pick a98d4ba A1 
... 

Удалите строки с коммитов «А1» и «А2», сохраните изменения, закройте редактор (или иначе отправить изменения в inetractive Rebase) и мерзавец будет повторно все коммиты, за исключением тех, которые вам удалены.

Затем вы можете завершить с

$ git merge fixes 

(ГИТ-перебазироваться оставил нас на переписан филиала 'мастер').

84

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

$ git branch fixes  # copies master to new branch 
$ git reset --hard XXX # resets master to XXX 

Это описано в справочной странице GIT для reset под «Отмена фиксации, что делает его тему филиал».

1

Забудьте обо всех вишневых сборах. Просто rebase -i дважды опускаю изменения, каждый раз создавая новую ветку, а затем объединяю 2.

Смежные вопросы