Cherry-picking коммитов
Тема дорожной карты · Изучи Git
Cherry-picking — это процесс применения отдельного коммита из одной ветки в другую, создавая новый коммит с теми же изменениями. Эта функция особенно полезна для бэкпорта фиксов или функций из одной ветки в другую, например, из основной ветки main в релизную ветку. Это позволяет быстро внести изменения без необходимости переноса всей ветки.
Как это работает
git cherry-pick <sha> берёт дифф существующего коммита и применяет его поверх текущей ветки как новый коммит (с новым SHA). Это позволяет избежать внесения ненужных изменений, которые могут быть частью другой ветки. Визуализировать историю коммитов можно с помощью команды git log --oneline --graph --all. Команда git blame <file> позволяет определить, кто последний вносил изменения в конкретную строку файла. Если вам нужно найти коммит, который внес баг, можно использовать git bisect, который автоматизирует бинарный поиск по коммитам. Для статистики контрибьюторов используется команда git shortlog -sn.
Когда применять
Cherry-pick особенно полезен для бэкпорта фиксов с основной ветки main на релизную ветку. Это позволяет быстро внести изменения в релизную ветку без необходимости переноса всей основной ветки. Команда git bisect используется, когда вы знаете, что функция работала на коммите X и сломалась на коммите Y. Она автоматизирует процесс поиска коммита, который внес баг, за логарифмическое количество шагов. Команда git blame используется для нахождения PR, который внёс конкретную строку кода, что позволяет быстро найти контекст изменения.
Типичные ошибки
Типичные ошибки при cherry-picking включают попытку применить cherry-pick и затем выполнить merge, что приводит к дублированию изменений в истории. Для предотвращения этого следует использовать параметр -x при cherry-picking, который добавляет пометку «(cherry picked from ...)» для отслеживаемости. Также ошибкой является использование git bisect без чёткой границы между "good" и "bad" коммитами, что может привести к неправильным результатам. Еще одной распространенной ошибкой является использование git blame на коммите, который является частью рефакторинга, вместо оригинального коммита. Для корректного отслеживания перемещённых файлов следует использовать команду git log --follow <file>.