переопределить последовательность небольших коммитов в коммит логической единицы - PullRequest
3 голосов
/ 07 августа 2010

В некоторых настройках я привык использовать git локально, а затем экспортировать diff, который затем отправляется с подробным описанием. Таким образом, когда я развиваюсь локально, я делаю коммиты постоянно и не беспокоюсь о значимых сообщениях коммитов или идеальном тестировании перед фиксацией.

Однако, при использовании git для публикации кода на github, я бы предпочел стереть историю этих маленьких коммитов и создать только один коммит, представляющий логически проверенные изменения.

Каков наилучший способ добиться этого, не меняя локальный рабочий процесс фиксации всякий раз, когда я чувствую, что исследовал небольшой путь (хотя и не доказанный)?

Ответы [ 2 ]

5 голосов
/ 07 августа 2010

Если вы посмотрите на « Обрезка GIT Checkins / Squashing GIT History », вы можете:

  • git rebase --interactive --fixup для сжатия коммита, который вы бы вручную переупорядочили в коммитередактировать список rebase --interactive, , игнорируя второе сообщение коммита , что ускорит редактирование сообщения (вы можете просто сохранить его: сжатый коммит будет иметь только первое сообщение коммита)
  • git rebase --interactive --autosquash для для вас автоматически выполняется процесс изменения порядка коммитов .

Именно поэтому мне нравится выбирать стандартный комментарий для всех микрокоммитов, которые я делаю,за действие.
Первый микро-коммит будет содержать «мое действие».
Все остальные будут содержать «squash! my activity»

Несколько действий (набор микро-коммитов) могут быть переплетены вэтот процесс.

Все, что вам осталось, это git rebase --interactive --autosquash для всех этих микро-коммитов, которые нужно переупорядочить, а затем раздавить.


OP namin упоминает сообщение в блоге Наш рабочий процесс Git: Private Development, Public Releases в качестве хорошей иллюстрации, основанный на git merge --squash:

(см. также:

)

alt text

Мы поддерживаем 3 ветви для каждой из наших клиентских библиотек:

  • master - В этой ветке происходит активная разработка.
  • release - Разработка для исправления ошибок происходит здесь.Мы также поднимаем версии и обновляем журнал изменений в этой ветке.
  • github_master - Мы разбиваем коммиты из ветки релиза на отдельные коммита «release» в этой ветке, а также помечаем тегамирелизы.Эта ветка отслеживает github/master.

Теперь мы готовы перейти к ветви github_master.

git checkout github_master

Мы хотим объединитьизменения из релиза в ветку github_master, но мы не хотим видеть каждый отдельный коммит .
Git помогает нам с командой git merge --squash.Это объединит все изменения от конкретного реферата, объединит их в единый набор изменений и оставит изменения поэтапно.Мы фиксируем поэтапные изменения с сообщением «1.0.0» и помечаем коммит.

git merge --squash release
git commit -m "1.0.0"
git tag 1.0.0 -m "1.0.0"

С коммитами, сжатыми и помеченными, пришло время нажать на github.
Мы хотим перенести заголовок текущей ветки в ветку master на github remote.

git push github HEAD:master

И последнее, но не менее важное: нам нужно перенести эти изменения в ветки в начале и объединитьсдавленный коммит возвращается к релизу и мастеру.

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

git push origin github_master

git checkout release
git merge github_master
git push origin release

git checkout master
git merge release
git push origin master
2 голосов
/ 07 августа 2010

Взгляните на интерактивный режим git-rebase .По сути, вы бы продолжили текущий рабочий процесс множества небольших коммитов.Когда дело доходит до продвижения вверх по течению, вы git rebase --interactive возвращаетесь к последнему коммиту, который вы отправили вверх по течению.Затем Git представит вам список ваших коммитов в редакторе, что позволит вам изменить порядок, удалить, объединить, разделить или перефразировать ваши коммиты.

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