2012-01-13 3 views
3

Я все еще прихожу к скорости с некоторыми более продвинутыми функциями Git ...Как я могу объединить ветку git, чтобы теги стали сиротами?

Учитывая следующую историю, как я могу очистить ветвь темы, она появляется в истории как единое целое?

[master] - - - - - - - C - - - 
    \ 
    [feature] - A - - B - - D - 

В идеале, я хотел бы перебазирование [особенности] с [мастером] в D, а затем объединить [особенность] в [мастер], в результате чего А и В осиротевшем.

Я думал, что я мог бы сделать это просто:

$ git rebase master # on feature branch 
$ git co master 
$ git merge --no-ff feature 

, а затем очистить осиротевшие фиксации с

$ git gc --prune=now --aggressive 

Это все еще оставляет А и В в истории, хотя - я-то отсутствую ?

ответ

1

Если вы хотите «сплавить» A, B и D, вы можете использовать интерактивную переустановку.

Если ваш филиал feature находится на вершине master (что это будет после того, как вы оформили git rebase master в этой ветке), сделайте следующее:

git rebase -i master 

Затем в файл, который будет открыт в редакторе, замените pick на совершении A и B с squash. Затем Git сквозит A и B в D, и редактор выдает сообщения фиксации для всех раздавленных коммитов.

+0

Это то, что я искал - спасибо! – bodacious

0

Зачем ему удалять A и B?

git rebase master сделает функцию разветвленной от кончика мастера, и когда вы зафиксируете, все фиксации от функции придут к освоению. Таким образом, вы увидите A и B (фактически A 'и B')

И git gc не имеет ничего общего с тем, что вы видите в истории. Он удаляет оборванные коммиты (которые могут быть A и B, но у вас теперь есть A и B).

Если вы хотите, чтобы они были как единое целое, попробуйте вариант --no-commit или посмотрите на другие варианты, например git rebase -i (и сквош)

3

Если я перерисовывать свои диаграммы, чтобы поместить маркеры ветви на кончике ветви (что отражает фактическое представление ветвей) исходная ситуация:

o --- C (master) 
\ 
    --- A --- B --- D (feature) 

И после перебазирования и слияния с --no-ff, как вы описать, теперь у вас есть:

o --- C ------------------ M (master) 
\  \    /
    \  A' --- B' --- D' (feature) 
    \ 
    --- A --- B --- D 

Как я понимаю, вы теперь хотите, чтобы убедиться, что A, B и D исчезают из вашего хранилища. Во-первых, я бы сказал, что настоятельно рекомендую вам не беспокоиться об этих коммитах.

Однако, если вы действительно хотите избавиться от них, вам нужно будет убедиться, что они действительно недоступны, или git gc --prune=now --aggressive не удалит их. Как бы то ни было, они по-прежнему будут указывать (по крайней мере) на reflog для feature.Существуют различные способы истечения записей из reflog, например. с:

git reflog expire --expire=now feature 

... или более безопасный вариант должен быть установлен the config variablegc.reflogexpireunreachable в now и истекает в reflog:

git config gc.reflogexpireunreachable 
git reflog expire feature 

В любом случае, то тогда нужно будет запускать git gc --prune=now --aggressive потом снова.

Однако, чтобы повторить то, что я сказал выше, я бы этого не сделал - эти коммиты не причиняют вреда никому, а reflog является ценной сетью безопасности при использовании git.

+0

Спасибо за совет и объяснение – bodacious

1

Если вы хотите, чтобы свернуть эффект ветви в одну фиксацию, то от мастера сделать:

git merge --squash feature 
git commit 

хотя ИМХО быть в состоянии держать лицо, совершающее на ветке неповрежденной на самом деле хорошая особенность наиболее времени.

В качестве альтернативы вы можете использовать git rebase -i на ветке и сообщить ей, чтобы сквоить все коммиты вместе, а затем слить сжатый результат на главный.

+0

Пожалуйста, удалите один из ответов. Они тоже так же! –

+0

oops, редактирование как-то было сохранено как новый ответ. – araqnid

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