Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
External Systems
Server Admin
Guides
- gitattributes
- Command-line interface conventions
- Everyday Git
- Frequently Asked Questions (FAQ)
- Glossary
- Hooks
- gitignore
- gitmodules
- Revisions
- Submodules
- Tutorial
- Workflows
- All guides...
Administration
Plumbing Commands
- 2.1.4 → 2.48.1 no changes
- 2.0.5 12/17/14
ОПИСАНИЕ
Определить, есть ли в вышестоящей ветке (а именно в диапазоне <редакция>..<вышестоящая-ветка>
) коммиты эквивалентные тем, что находятся в «локальном» диапазоне <ограничение>..<голова>
.
Тест на эквивалентность основан на сравнении списков различий (diff), после удаления из них пробелов и номеров строк. Так что git-cherry
выявляет те коммиты, которые были «скопированы» с помощью команд git-cherry-pick[1], git-am[1] или git-rebase[1].
В результате эта команда выводит SHA1 каждого коммита в диапазоне <ограничение>..<голова>
, с префиксом минус (-
) для коммитов, которые имеют эквивалент в <вышестоящей-ветке>, и плюс (+
) — для тех, что не имеют.
ПАРАМЕТРЫ
- -v
-
Выводить заголовки коммитов (их первую строку) после их SHA1.
- <вышестоящая-ветка>
-
Вышестоящая ветка в которой нужно искать эквивалентны коммитов. По умолчанию используется ветка, являющаяся вышестоящей для текущей.
- <голова>
-
Рабочая ветка; По умолчанию: HEAD.
- <ограничение>
-
Не сообщать о коммитах до (и включая) указанный ограничивающий коммит.
ПРИМЕРЫ
Рабочие процессы на основе патчей
git-cherry
часто используется при работе с проектами, в которых рабочий процесс, основан на патчах (см. gitworkflows[7]), чтобы определять, была ли серия патчей уже применена в вышестоящем репозитории. В подобном рабочем процессе вы можете создать и отправить ваши изменения из тематической ветки topic
следующим образом:
$ git checkout -b topic origin/master # выполните работу и сделайте несколько коммитов $ git format-patch origin/master $ git send-email ... 00*
Позже вы можете проверить, были ли ваши изменения применены, выполнив (все ещё находясь на своей ветке topic
):
$ git fetch # обновить информацию о origin/master $ git cherry -v
Конкретный пример
В ситуации, когда ветка topic
состоит из трёх коммитов, а в вышестоящем репозитории применили только два из них, это может выглядеть следующим образом:
$ git log --graph --oneline --decorate --boundary origin/master...topic * 7654321 (origin/master) коммит на верхушке вышестоящей ветки [... вырезаны некоторые другие коммиты ...] * cccc111 cherry-pick коммита В * aaaa111 cherry-pick коммита А [... вырезано много-чего ещё ...] | * cccc000 (topic) коммит В | * bbbb000 коммит Б | * aaaa000 коммит А |/ o 1234567 точка ветвления
В таких случаях git-cherry
может показывать сжатое резюме того, что ещё не было применено:
$ git cherry origin/master topic - cccc000... коммит В + bbbb000... коммит Б - aaaa000... коммит А
Здесь мы видим, что коммиты А и В (отмеченные минусом, -
) можно удалить из вашей ветки topic
, когда вы переместите её (с помощью rebase
) на верхушку origin/master
, в то время как коммит Б (отмеченный плюсом, +
), напротив, всё ещё нужно сохранить, чтобы отправить его для применения в origin/master
.
Использование аргумента «ограничение»
Необязательный аргумент <ограничение> полезен в тех случаях, когда ваша ветка topic
основана на некоторой другой работе, которая пока не опубликована. Расширяя предыдущий пример, это может выглядеть следующим образом:
$ git log --graph --oneline --decorate --boundary origin/master...topic * 7654321 (origin/master) коммит на верхушке вышестоящей ветки [... вырезаны некоторые другие коммиты ...] * cccc111 cherry-pick коммита В * aaaa111 cherry-pick коммита А [... вырезано много-чего ещё ...] | * cccc000 (topic) коммит В | * bbbb000 коммит Б | * aaaa000 коммит А | * 0000fff (base) неопубликованные изменения Г [... вырезано ...] | * 0000aaa неопубликованные изменения A |/ o 1234567 общая база между вышестоящей веткой и topic
Если в качестве ограничивающего коммита вы укажите base
, то вы сможете избежать перечисления в выводе всех коммитов между base
и topic
:
$ git cherry origin/master topic base - cccc000... коммит В + bbbb000... коммит Б - aaaa000... коммит А
GIT
Является частью пакета git[1]