Объединение нескольких коммитов в один до нажатия - PullRequest
118 голосов
/ 19 апреля 2011

Этот вопрос касается не только того, как выполнить эту задачу, но и того, является ли это хорошей или плохой практикой с Git.

Учтите, что локально я больше всего работаю над веткой master, но я создал тематическую ветку, которую я назову "topical_xFeature". В процессе работы над "topical_xFeature" и переключения туда и обратно для выполнения другой работы в основной ветви получается, что я сделал более одного коммита в ветви "topical_xFeature", но между каждым коммитом я не делал тужиться.

Сначала , вы бы посчитали это плохой практикой? Разве не было бы разумнее придерживаться одного коммита на ветку за пуш? В каких случаях было бы хорошо иметь несколько коммитов на ветке до того, как будет сделан push?

Секунда , как мне лучше всего перенести множественные коммиты из ветви topical_xFeature в ветку master для push? Является ли неприятностью не беспокоиться об этом и просто делать толчок, когда выдвигаются несколько коммитов, или это менее раздражает, как-то объединять коммиты в один, а затем толкать? Опять же, как это сделать?

Ответы [ 6 ]

127 голосов
/ 19 апреля 2011

Что касается вашего первого вопроса, нет, нет ничего плохого в одновременном нажатии нескольких коммитов. Много раз вы можете разбить свою работу на несколько небольших логических коммитов, но подтолкнуть их только тогда, когда почувствуете, что вся серия готова. Или вы можете сделать несколько коммитов локально, когда отключены, и вы нажимаете их все, как только вы снова подключаетесь. Нет причин ограничивать себя одним коммитом за пуш.

Как правило, я считаю хорошей идеей, чтобы каждый коммит содержал одно логическое, связное изменение, включающее в себя все, что ему нужно для работы (поэтому он не оставляет ваш код в поврежденном состоянии). Если у вас есть два коммита, но они повредят код, если вы примените только первый, было бы неплохо вставить второй коммит в первый. Но если у вас есть два коммита, каждый из которых вносит разумные изменения, выдвигать их как отдельные коммиты - это нормально.

Если вы хотите объединить несколько коммитов вместе, вы можете использовать git rebase -i. Если вы находитесь на ветке topical_xFeature, вы запустите git rebase -i master. Это откроет окно редактора, с кучей коммитов в списке с префиксом pick. Вы можете изменить все, кроме первого, на squash, что скажет Git оставить все эти изменения, но раздавить их в первом коммите. После того, как вы это сделаете, проверьте master и объедините в своей ветви функций:

git checkout topical_xFeature
git rebase -i master
git checkout master
git merge topical_xFeature

В качестве альтернативы, если вы просто хотите раздавить все в topical_xFeature в master, вы можете просто сделать следующее:

git checkout master
git merge --squash topical_xFeature
git commit

Какой из них вы выбираете, зависит от вас. В общем, я бы не беспокоился о наличии нескольких небольших коммитов, но иногда вам не хочется беспокоиться о дополнительных второстепенных коммитах, поэтому вы просто раздавите их в один.

62 голосов
/ 28 ноября 2012

Я обычно придерживаюсь того, чтобы объединить несколько коммитов в один коммит, прежде чем нажимать код.

Чтобы достичь этого, я предлагаю вам использовать концепцию ' squash ', предоставленную GIT.

Выполните следующие шаги.

1) git rebase -i master (вместо master вы также можете использовать определенный коммит)

откройте интерактивный редактор rebase, где он покажет все ваши коммиты. В основном, там, где вам нужно идентифицировать коммиты, которые вы хотите объединить в один коммит.

Представьте, что это ваши коммиты и что-то подобное показано в редакторе.

pick f7f3f6d changed my name a bit    
pick 310154e updated README formatting and added blame   
pick a5f4a0d added cat-file  

Важно отметить, что эти коммиты перечислены в обратном порядке, чем вы обычно видите их с помощью команды log. Значит, старый коммит будет показан первым.

2) Измените 'pick' на 'squash' для последних совершенных изменений. что-то вроде показано ниже. При этом ваши последние 2 коммита будут объединены с первым.

pick f7f3f6d changed my name a bit         
squash 310154e updated README formatting and added blame   
squash a5f4a0d added cat-file

Вы также можете использовать короткую форму, если у вас есть много коммитов для объединения:

p f7f3f6d changed my name a bit         
s 310154e updated README formatting and added blame   
s a5f4a0d added cat-file

для редактирования используйте 'i', он включит редактор для вставки. Имейте в виду, что большинство (самых старых) коммитов не могут быть раздавлены, так как нет предыдущего коммита, с которым можно было бы объединиться Так что это должно быть выбрано или «р». Используйте «Esc» для выхода из режима вставки.

3) Теперь сохраните редактор с помощью следующей команды. : WQ

Когда вы сохраняете это, у вас есть один коммит, который вводит изменения всех трех предыдущих коммитов.

Надеюсь, это поможет вам.

11 голосов
/ 19 апреля 2011

Первый : ничто не говорит о том, что на каждую ветвь приходится только один коммит: push - это механизм публикации, позволяющий публиковать локальную историю (т. Е. Набор коммитов) в удаленном репо. 1003 *

Секунда : git merge --no-ff topical_xFeature будет записывать на мастере как один коммит вашу работу темы, прежде чем нажать master.
(Таким образом, вы сохраняете topical_xFeature для дальнейшего развития, которое вы можете записать на master как один новый коммит при следующем слиянии --no-ff.
Если цель - избавиться от topical_xFeature, то правильный выбор - git merge --squash, как описано в Brian Campbell answer .)

8 голосов
/ 25 июля 2016

Переключитесь на главную ветку и убедитесь, что вы в курсе.

git checkout master

git fetch это может быть необходимо (в зависимости от вашей конфигурации git) для получения обновлений об источнике / master

git pull

Объединить ветвь объектов в основную ветвь.

git merge feature_branch

Сбросить основную ветвь до исходного состояния.

git reset origin/master

Git теперь рассматривает все изменения как неизмененные.Мы можем добавить эти изменения как один коммит.Добавлениетакже добавит неотслеживаемые файлы.

git add --all

git commit

Ссылка: https://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit

3 голосов
/ 16 ноября 2018

1) Сначала выберите, какой коммит вы хотите, чтобы после него было все.

git reflog
5976f2b HEAD@{0}: commit: Fix conflicts
80e85a1 HEAD@{1}: commit: Add feature
b860ddb HEAD@{2}: commit: Add something

2) Сброс на выбранную вами голову (я выбрал HEAD @ {2})

git reset b860ddb --soft

3) git status (чтобы быть уверенным)

4) Добавить свой новый коммит

git commit -m "Add new commit"

Примечание: HEAD@{0} & HEAD@{1} Теперь объединены в 1 коммит, это можетсделать также для нескольких коммитов.

git reflog снова должен отобразить:

git reflog
5976f2b HEAD@{0}: commit: Add new commit
b860ddb HEAD@{1}: commit: Add something
0 голосов
/ 17 июля 2019

Если вы новичок, как я, и не представляете, что слияние принесет на вашу тарелку, вот простейшее объяснение

Простейшее описание о том, как сквошить в Git

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