2013-06-27 3 views
0

Я ленился и положил все свои поручения в ветвь мастера. Теперь я хочу структурировать свои репозитории git, как в этом руководстве: http://nvie.com/posts/a-successful-git-branching-model/Как очистить свои репозитории git

Теперь я хочу переместить все мои коммиты в мастер на новую ветку, называемую мастер-очисткой. Затем я захочу объединить мастер-очистку с мастером, чтобы у меня было только одно комманда в master. Причина, почему я хочу сделать это, состоит в том, что все коммиты в master занимают много места, и если я переведу все коммиты в ветку очистки, я предполагаю, что я могу на своем локальном компьютере удалить эту ветку и разместить ее только на сервер. Таким образом, когда я проверяю свою основную ветку, я буду загружать последнюю фиксацию, а не всю историю, правильно?

Я попытался сделать это, сначала создав новую ветку, а затем сбрось мастер к первому фиксации. После этого я сливаться с мастер-очистки с не-фф:

git branch master-cleanup 
git reset --hard 4f8d90cc225288bf889090f80103cfa0887a4742 
git merge --no-ff master-cleanup 

Я думал, что это будет переместить все мои фиксаций на новый мастер-очищающей отрасли, но когда я выполнить слияние Я также импортировать все коммиты. Я думал, что -no-ff предотвратит это и заставит слияние стать новой отдельной фиксацией для мастера? Теперь я git весь журнал фиксации плюс новое слияние ...

Любые идеи о том, как решить, что я хочу сделать?

ответ

1

--no-ff средства нет перемотка вперед. Это гарантирует, что вы получите 2-родительское слияние, даже если объединенная ветка напрямую следует за вашей вершиной. Без вас бы просто получить линейную историю без намека на то, что объединенная куча коммитов принадлежит вместе.

Чтобы скомпилировать команду, вы используете merge -- squash или, если она уже есть, вы можете использовать rebase -i и спросить о сквоше. Или reset --soft нижнюю точку, и зафиксируйте индекс.


Что касается другой части вопроса, история действительно занимает какое-то место, но ее редко стоит упомянуть в размерах для источников. И если вы просто не заинтересованы в работе с прошлым, оставьте репо таким, какой оно есть. Просто сделайте мелкий клон этого. Читайте дальше на git clone --depth 1. Даже если вы не используете его для практики, вы можете сделать такой клон, чтобы увидеть разницу в размерах и решить, что это не стоит возиться.

+0

--squash, похоже, делает то, что я хочу, но я не уверен, хочу ли я это сделать больше :). Мой репо довольно большой, потому что у меня много мультимедиа в моем проекте (фильмы, pdf и т. Д.), Поэтому всякий раз один элемент мультимедиа меняется. У меня есть история всех версий, так что git repo groves быстро. Если бы я начинал с нуля и работал так, как это было описано в ссылке с мастером, разработчиками и ветвями функций. Будет ли главная ветвь содержать журнал всех коммитов, даже те, которые возникли в ветви функции? Значит, хозяин нахально будет просто большой? –

+0

Итак, если бы я хотел бы сохранить ветвь мастера и ветвь развития небольшой, мне всегда приходилось сливаться с -squash, а не с флагом -no-ff? Какие-то недостатки в работе? Я не вижу реального использования всей истории ветвей признаков в ветке разработки и мастера? Я всегда буду держать ветви функций на сервере за историю, если захочу вернуться. –

+0

сквош-слияние функций считается честной игрой, особенно если вы определяете функцию с хорошей детализацией (AKA small). В зависимости от того, как медиафайлы используются в проекте, было бы лучше сохранить их в другом репо, возможно, связанным как подмодуль –

0

Необходимо указать --squash для git merge. См. this и this ответ для получения дополнительной информации.

0

Нет необходимости создавать новую ветку. Есть много способов сделать это. Позвольте мне понять это прямо. Вы хотите объединить все, что вы совершаете, в одну фиксацию. Это ваша проблема.

Попробуйте эти команды

git log --oneline //Show all your commits. (Note down the SHA of your first commit) 
git rebase --interactive 22dacee where 22dacee is the SHA you noted in above step. 

Теперь редактор будет всплывающее окно и покажет вам что-то вроде этого

pick aasad23 X 
pick a434fsa Y 
... a long list follows. 

# Rebase adrtec..ds3452 onto adrtec 
# 
# Commands: 
# p, pick = use commit 
# r, reword = use commit, but edit the commit message 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# f, fixup = like "squash", but discard this commit's log message 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# However, if you remove everything, the rebase will be aborted. 

Теперь, просто заменить все pick слова s за исключением первого. И сохраните файл. Новый редактор снова появится и покажет, какие из коммитов будут объединены. Просто перепроверьте его один раз и сохраните снова. Вы увидите, что теперь будет только одна фиксация.