2013-02-14 3 views
7

Итак, скажем, у меня есть главная ветка, мы будем называть «master». Я создал ветку, называемую «новая функция». Я сделал тонну коммитов в этой ветке, чтобы я мог вернуться во времени, но при разработке функции я сделал довольно много назад и вперед, поэтому журнал фиксации довольно грязный.Git branch diff в один новый фиксатор

Если бы я посмотрел git diff master..new-feature например.

Если бы я хотел создать только один новый свежий фиксаж на «хозяине», который включает в себя все изменения между двумя ветвями, что является самым эффективным способом сделать это?

ответ

17
git checkout master 
git merge --squash new-feature 
git commit 

Сообщение фиксации будет начать показывать весь список коммитов будучи присоединяемых/сжато, но вы можете, конечно, редактировать, что быть все, что вы хотите.

+0

Вкусно просто :) – hhh

1

Вы можете использовать интерактивную скидку для этого: git rebase --interactive. Затем просто используйте параметр сквоша. Он использует обновления только от фиксации, но не создает фиксацию.

+0

Это похоже на тонну поиска заменяющего выбрать для игры в сквош , или я что-то упускаю? – hhh

0

Вы можете перенести все в свою ветку функций, а затем объединить в мастер, принимающий «их» для всех изменений.

Вот Stack Overflow вопрос с большим ответом о том, как сделать это: Is there a "theirs" version of "git merge -s ours"?

+0

Хм, это приводит только к одной фиксации, представляющей ветвь функции? – hhh

+0

Было бы, если вы сначала переустановите ветку функций (как говорит Уильям выше), хотя это, возможно, нецелесообразно. Одна из величайших вещей об управлении источником - история того, как вы добрались до своего места. Полагаю, это вопрос предпочтения! Подробнее об интерактивной перебазе [здесь] (http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html). –

+0

Да, мне тоже хотелось бы иметь истории, но разные люди :) – hhh

1

Использование мерзавец перебазироваться --interactive ГОЛОВЫ (~ однако много коммитов хотят сквош). например, git rebase --interactive HEAD ~ 5. Это загрузит ваши последние 5 коммитов и вызовет окно редактора с сообщениями. Каждое сообщение будет иметь «выбрать» в начале. Перейдите к последнему сообщению, измените 'pick' на 'squash' и выйдите. Откроется новое окно с запросом сообщения о фиксации. Это будет новое сообщение о фиксации сквош-коммитов. Выйдите, и он перевернет все коммиты в один новый.

Там пример здесь: https://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one

+0

Похоже, это может создать некоторые проблемы, связанные с тем, что я нахожусь в команде и регулярно нуждаюсь в том, чтобы вносить изменения в другие члены команды. Это, и я бы предпочел не считать :) – hhh

+0

Если вы работаете над ветвью новой функции, я сделал предположение, что вы работаете над этой веткой по своему усмотрению. Если вы этого не сделаете, у вас/других людей, с которыми вы работаете, возможно, есть свои филиалы.Использование rebase обычно плохой идеей, если другие люди уже вытащили ваш код, так как это может вызвать проблемы из-за того, что вы переписываете историю. –

+0

Итак, ~ 5 не будет считаться с фиксацией от мастера, который был сделан мной в, до тех пор, пока я единственный, кто совершает на ветке? «5» означает последние пять уникальных для этой ветви, или последние пять коммитов? – hhh

2

Другим вариантом, который может работать лучше для вас, было бы создание файла исправления с git diff --patch > "patch filename", а затем исправление их в вашей главной ветке с использованием git apply "patch file name".

Man страница для GIT-Diff (особенно "Создание патчей с -p"): http://www.kernel.org/pub/software/scm/git/docs/git-diff.html

Man страница для мерзавца применить: http://www.kernel.org/pub/software/scm/git/docs/git-apply.html

+0

git apply ... interesting :) Полезно знать! – hhh