Какой командой Git можно применить изменения из конкретного коммита в текущую ветку?

Ответ

Основная команда: git cherry-pick <commit-hash> — применяет изменения, внесенные указанным коммитом, к текущей ветке, создавая новый коммит.

Типичный сценарий использования: Вы хотите взять исправление бага из ветки develop и перенести его в ветку production, не сливая всю develop.

Пошаговый пример:

# 1. Находим хэш нужного коммита в истории (например, abc123)
git log --oneline develop

# 2. Переключаемся на целевую ветку
git checkout production

# 3. Применяем ("вишнёво выбираем") коммит
git cherry-pick abc123

Ключевые особенности и опции:

  • Создает новый коммит: Хэш нового коммита будет отличаться от исходного, хотя изменения идентичны.
  • Диапазон коммитов: Можно применить несколько коммитов подряд.
    git cherry-pick abc123^..def456 # Применяет все коммиты от abc123 (включительно) до def456
  • Разрешение конфликтов: Если изменения конфликтуют с текущим кодом, Git остановит процесс. Нужно:
    1. Разрешить конфликты вручную в файлах.
    2. Добавить исправленные файлы: git add <file>.
    3. Продолжить: git cherry-pick --continue.
  • Отмена операции:
    • git cherry-pick --abort — полностью отменить операцию и вернуть ветку в исходное состояние.
    • git cherry-pick --quit — прервать операцию, но оставить уже разрешенные конфликты и индекс.

Альтернативы и когда их использовать:

  • git merge — для интеграции всей истории ветки.
  • git rebase — для перебазирования серии коммитов (изменяет историю).

cherry-pick идеален для точечного переноса отдельных исправлений или фич между ветками.

Ответ 18+ 🔞

А, слушай-ка, вот тебе про эту магию — git cherry-pick. Представь, что у тебя в ветке develop есть один-единственный коммит, который чинит какую-то дичь, а в production всё горит синим пламенем. И тащить всю ветку develop с её экспериментами тебе нахуй не сдалось. Вот тут-то наш вишнёвый пикер и выручает, блядь.

Что он делает, этот волшебник? Берёт изменения из конкретного коммита (по его хэшу, этому вот abc123) и аккуратно, как хирург, накладывает их на то место, где ты сейчас стоишь (на текущую ветку). Создаётся новый коммит, изменения те же, но отпечаток (хэш) — другой. Это как скопировать кусок кода, а не перетащить его с историей болезней.

Как этим пользоваться, не обосравшись? Смотри, вот живой пример:

# 1. Сначала ищешь того самого виновника торжества в ветке develop
git log --oneline develop
# Видишь строчку: abc123 Пофиксил баг с отправкой денег на счёт мамки

# 2. Перебегаешь туда, где пожар — в ветку production
git checkout production

# 3. И говоришь гиту: "Дай-ка мне именно ЭТОТ коммит, ёпта!"
git cherry-pick abc123

Всё, если звёзды сошлись и конфликтов нет, изменения применены. Новый коммит появится в production.

А если пошло по пизде и вылез конфликт? Не паникуй, такое бывает. Гит остановится и скажет: "Чувак, тут у меня волнение ебать, сам разбирайся".

  1. Идешь в файлы, видишь эти ебучие <<<<<<< HEAD. Разгребаешь руками, что оставить.
  2. Говоришь гиту: "Смотри, я всё порешал, забирай": git add <имя_файла>.
  3. Продолжаешь операцию: git cherry-pick --continue.

А если передумал на середине?

  • git cherry-pick --abort — это полный откат, как будто ничего и не было. Ветка — девственно чиста.
  • git cherry-pick --quit — бросил на полпути, но всякая хуйня, которую уже поправил, останется в индексе. Осторожно с этим.

Можно несколько коммитов сразу? Можно, да! Укажи диапазон.

git cherry-pick abc123^..def456

Это возьмёт все коммиты, начиная с abc123 и заканчивая def456 включительно. Главное — не переборщить, а то получишь не вишнёвый пикинг, а вишнёвый ад.

Чем это лучше или хуже других команд?

  • git merge — это когда ты сливаешь всю ветку целиком, со всей её историей. Иногда это овердохуища лишнего.
  • git rebase — это когда ты переписываешь историю, пересаживая целую цепочку коммитов. Мощно, но опасно, если работаешь не один.

cherry-pick — это инструмент снайпера. Точечный выстрел. Нужен один конкретный фикс из одной ветки в другую? Вот он, твой выбор. Просто помни: если ты начинаешь пикать десятки коммитов подряд, может, тебе просто merge или rebase сделать, а не извращаться? Э, бошка, думай!