Как я могу объединить ветку git, чтобы коммиты-темы потеряли смысл? - PullRequest
3 голосов
/ 13 января 2012

Я все еще прибегаю к скорости с некоторыми более продвинутыми функциями Git ...

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

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

В идеале, я хотел бы перебазировать [функцию] с помощью [мастера] в точке D, а затем объединить [функцию] с [мастером], оставив A и B без внимания.

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

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

, а затем очистите осиротевшие коммиты с помощью

$ git gc --prune=now --aggressive

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

Ответы [ 4 ]

3 голосов
/ 13 января 2012

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

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

... или более безопасным вариантом является установка переменной конфигурации gc.reflogexpireunreachable в nowи истекает reflog:

git config gc.reflogexpireunreachable
git reflog expire feature

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

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

1 голос
/ 13 января 2012

Если вы хотите свести эффект ветвления в один коммит, то из master сделайте:

git merge --squash feature
git commit

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

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

1 голос
/ 13 января 2012

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

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

git rebase -i master

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

0 голосов
/ 13 января 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...