Объединяем несколько коммитов Git в один

Материал из Rosalab Wiki
Перейти к: навигация, поиск

Нередко нам поступают Pull Request'ы типа такого: https://abf.io/import/flacon/pull_requests/3

Для разработчиказдесь все хорошо, кроме истории Git-изменений:

  • комментарии типа "Updated flacon.spec" не очень информативны - по ним невозможно понять, что именно изменилось. Конечно, об этом написано в заголовке и описании Pull Request'а, однако это описание в Git никак не попадает
  • коммитов много, а хотелось бы объединить их все в один - который бы просто обновлял версию пакета.

Ниже мы покажем, как это можно сделать - объединить несколько коммитов в один и дать ему разумное имя. Делать это надо на локальной машине в клонированном репозитории; объединять коммиты рекомендуется до того, как делать "git push", но можно и после:)

Итак, склонируем проект drxank/flacon, ветку rosa2014.1:

$ abf get drxank/flacon -b rosa2014

Посмотрим на коммиты:

$ git log --pretty="%H - %s"
0daafc634cc589d1c873f6edae0fe21502d75594 - Updated flacon.spec
9e47bed614eacf1a1861936d7c18ab8e7f65bab4 - Updated flacon.spec
b1083c0c6f5c5e80260c5f1dfc3aea15fbb69ef6 - Updated flacon.spec
a800744f44b7cb10b3a03a2c97d0fe67c71a2992 - Updated flacon.spec
8d76a8f9322445f8a85b19d24ae6930bd14150c9 - Updated flacon.spec
7ace05fd871b5bde3aeefeac5bc4407ddfb9f04a - Updated flacon.spec
f4814908d3d8fb0e17cea6cce44c82d90d1d3124 - Updated flacon.spec
81e7d1c97ca58747e24855f5a41285a93699842b - Updated .abf.yml
e6f6db1e4eea0bd152a13845fb10afa75606a6d5 - Updated to 2.0.1
558e40eb6f548b63b8b4f029b5682a3aae67da02 - Updated to release 1.2.0 and added means to optionally build against QT5
c418829888ab1aa563a5453281147939451693ad - Updated to 1.0.1
6573986febf60d4cf5ff041bf83038178556c974 - MassBuild#464: Increase release tag
0de5f6058e14f49a971223401ddb0a59033609a8 - Log: Update to 0.9.4
4be631b55b44b1fa889e6fa41e1a9a8122f2b30c - Merge pull request #1 from symbianflo/flacon:rosa2012.1  Symbianflo
da1fa9f156b85a070d8597c2ad8fcf59c164474b - Log update to 0.9.2, spec clean, fix buildreq, suggested restricted stuff, instead of required
e7a176408a6f240549179d7f34dd193ffa6bed70 - Log update to 0.9.2, spec clean, fix buildreq
14cdfb66e339b5d07fc125ad008646881f44624c - Log update to 0.9.2, spec clean
3f703af118b51ae39e18b8a0c47bd1a3b0303905 - Updated to version 0.8.0
1d86128c11c086784734bcb2f04fa63e616bcef6 - Drop debug package
bd4679a420d825cbf1e14d3793ddddfb1ef683d2 - Fix wavpack req to work on 64bit system
dc8ccf7bf1ecaf5a0af076c4d86b46babe070a79 - Automatic import for version 0.6.1
79a243063006274f258c0e78932e9e0ca912c921 - Automatic import for version 0.6.0

Из это истории мы хотим объединить все коммиты вплоть до 81e7d1c97ca58747e24855f5a41285a93699842b - Updated .abf.yml.

Для этого делаем rebase на коммит перед "Updated .abf.yml" (это коммит e6f6db1e4eea0bd152a13845fb10afa75606a6d5 - Updated to 2.0.1)

$ git rebase -i e6f6db1e4eea0bd152a13845fb10afa75606a6d5 

-i включает интерактивный режим - перед вами откроется редактор, где вы увидите следующую информацию:

pick 81e7d1c Updated .abf.yml
pick f481490 Updated flacon.spec
pick 7ace05f Updated flacon.spec
pick 8d76a8f Updated flacon.spec
pick a800744 Updated flacon.spec
pick b1083c0 Updated flacon.spec
pick 9e47bed Updated flacon.spec
pick 0daafc6 Updated flacon.spec

Мы хотим слить все эти коммиты в один - в терминах Git это означает, что мы берем первый из них (хронологически) и "затаскиваем" ("squash") в него остальные. Для этого необходимо слово "pick" перед каждым "затаскиваемым" коммитом поменять на "s" (или на "squash", если не лень писать): Так что отредактируйте текст, чтобы он выглядел следующим образом:

pick 81e7d1c Updated .abf.yml
s f481490 Updated flacon.spec
s 7ace05f Updated flacon.spec
s 8d76a8f Updated flacon.spec
s a800744 Updated flacon.spec
s b1083c0 Updated flacon.spec
s 9e47bed Updated flacon.spec
s 0daafc6 Updated flacon.spec

После чего можно сохраняться и выходить.

Далее вам предложат отредактироввать описание коммита - по умолчанию это будет объединение описаний всех коммитов:

# This is a combination of 9 commits.
# The first commit's message is:
Updated to 2.0.1
# This is the 2nd commit message:
Updated .abf.yml
# This is the 3rd commit message:
Updated flacon.spec
# This is the 4th commit message:
Updated flacon.spec
# This is the 5th commit message:
Updated flacon.spec
# This is the 6th commit message:
Updated flacon.spec
# This is the 7th commit message:
Updated flacon.spec
# This is the 8th commit message:
Updated flacon.spec
# This is the 9th commit message:
Updated flacon.spec


Все это смело удаляем и заменяем на одну фразу, отражающую суть:

Updated to 2.1.0

Сохраняемся и выходим.

Если вы уже сделали "git push" и изменения находятся на сервере, но необходимо проделать следующую операцию, чтобы закинуть на сервер объединенные коммиты:

$ git push origin +rosa2014.1


[ Хронологический вид ]Комментарии

(нет элементов)

Войдите, чтобы комментировать.