2013-06-27 5 views
19

Обычный рабочий процесс разработки для нас - это ветка проверки b, поручить ей кучу, а затем скворовать все эти коммиты в один (все еще на b).Git squash все фиксируется в ветке без конфликтов

Однако в процессе rebase -i для сквоша всех коммитов часто возникают конфликты с несколькими шагами.

я принципиально хочу, чтобы изменить отрасль в один коммит, который представляет состояние хранилища в момент окончательное обязательство по b

Я сделал некоторые поиски, но я не нашел именно то, что Я ищу. Я не хочу merge --squash, потому что мы хотели бы протестировать срезанную ветвь функции перед слиянием.

+0

возможно дубликат [В git, в чем разница между слиянием --squash и rebase?] (http://stackoverflow.com/questions/2427238/in-git-what-is-the-difference-between-merge-squash- и-Reba se) –

+0

Из этого вопроса - я не хочу, чтобы 'G' был в' stable', я хочу, чтобы он все еще находился в ветви функции. Не уверен, что я что-то упустил. –

+0

Не могли бы вы просто выбрать «G»? –

ответ

40

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

Чтобы найти фиксации для сброса:

git merge-base HEAD BRANCH_YOU_BRANCHED_FROM 

Тогда

git reset --soft COMMIT_HASH 

Затем повторно обработать фиксации, возможно:

git commit -am 'This is the new re-created one commit' 
+0

умный! Мне нравится –

+0

Это так здорово. –

5

Это simlar в ответ от Расмус, но разбитый на три этапа, которые должны всегда работать:

$ git merge feature1 
$ git reset --soft [email protected]{1} 
$ git commit -c feature1 

Пояснение:

  1. слияния и разрешение конфликтов
  2. сохранить изменения в постановке, но устанавливаемые в старую голове
  3. совершать все изменения, используя сообщение фиксации и автор из художественного отделения последнего коммита
Смежные вопросы