Согласно руководство, git dcommit
«будет создавать ревизию в SVN для каждой фиксации в git». Но есть ли способ избежать нескольких ревизий Subversion? То есть, чтобы git объединял все изменения до выполнения svn commit
?
Возможный дубликат Объедините локальные коммиты Git в одну фиксацию для git-svn
Если вы работаете над веткой в git, вы можете git-merge --squash
, который делает это внутри git. Затем вы можете отправить эту сжатую фиксацию в SVN.
Конечно, много мелких коммитов - это хорошо, так зачем вам их раздавить?
Спасибо! (Обычно мне нужно много небольших коммитов, но это касается клиентского проекта, в котором мне и моему партнеру нужно часто передавать изменения друг другу, и часто даже изменения, которые могут нарушить основную систему.)
Я использую множество небольших коммитов, чтобы упростить отслеживание изменений; когда я делаю коммит на svn-сервере, мы генерируем электронное письмо для каждого коммита SVN. Я бы предпочел выполнить дополнительную работу по слиянию с мастером с помощью squash для коммитов «логической единицы» и сохранить всем несколько писем.
В вашей частной ветке можно делать много мелких коммитов. Но практически нет смысла продвигать весь этот шум вверх по течению («добавить бла», «забыл добавить ядда, от которого зависит бла», «на самом деле добавление ядра», «черт, исправление опечатки», «хорошо, СЕЙЧАС это должно работа "," хм, правда? ").
Множество мелких коммитов - это хорошо, но сопровождающий апстрима считает их плохими и настаивает, чтобы я так не делал. Я бы хотел, чтобы он делал много мелких коммитов, чтобы мне было легче следить за тем, что он делает.
Что делать с git-svn-id
? Должен ли я удалить их из полученного сообщения коммита, чтобы не запутать git-svn?
Команда git rebase -i
может сделать это и многое другое. Эта команда очень мощная, так что с ней хорошо подружиться.
Синтаксис: git rebase -i <commit ID>
. Откроется ваш текстовый редактор с параметрами (и инструкциями) для изменения всех коммитов до (не включая) данного идентификатора.
Например, чтобы изменить предыдущие 5 коммитов, вы можете сделать это:
git rebase -i HEAD~5
Или, если ваша ветка SVN называется "svn / trunk", то этот синтаксис тоже хорош:
git rebase -i svn/trunk
Затем появится окно текстового редактора. Чтобы раздавить все, измените первое слово каждой строки после первой с «выбрать» на «сквош» (если это звучит сбивающе с толку, это будет иметь больше смысла, когда вы это увидите). Затем сохраните и закройте редактор. Затем у вас будет возможность отредактировать сообщение фиксации для сжатой фиксации.
Среди прочего, вы можете делать с git rebase -i
, переупорядочивать коммиты, раздавливать коммиты разными способами и удалять коммиты.
Я использую эту команду постоянно; это убийственная особенность Git.
Райан Томайко немного написал о git rebase -i
, который сказал:
…[it's] a bit like git commit --amend hopped up on acid and holding a chainsaw – completely insane and quite dangerous but capable of exposing entirely new states of mind. Here you can edit, squash, reorder, tease apart, and annotate existing commits in a way that’s easier and more intuitive than it ought to be.
У меня есть тенденция часто делать коммиты в git, но я не обязательно хочу dcommit каждый коммит в svn, и раздавить всю мою работу так же мало смысла. Сейчас я пытаюсь переупорядочить и объединить несколько в более логичные единицы фиксации.
У меня такая же проблема. Представьте, что вы клонируете репозиторий svn в git в качестве своего мастера, вы делаете 3 коммита с разными сообщениями, а затем используете git svn dcommit. Можно ли «объединить» эти 3 коммита в один? Как это сделать? Вы можете привести пример? Спасибо!