Как перенести один или несколько коммитов из одной ветки Git в другую

Ответ

Для переноса коммитов из одной ветки в другую используется команда git cherry-pick. Она применяет изменения, внесенные выбранным коммитом, создавая новый коммит в целевой ветке с тем же сообщением и автором.

Пошаговый процесс:

  1. Убедитесь, что ваша целевая ветка обновлена, и переключитесь на нее:

    # Переключаемся на ветку, куда нужно перенести коммит
    git checkout main
    git pull origin main
  2. Найдите хеш коммита, который хотите перенести (например, с помощью git log в исходной ветке).

  3. Выполните cherry-pick, указав хеш коммита:

    # abc1234 - это хеш коммита из другой ветки
    git cherry-pick abc1234

Важные сценарии и опции:

  • Перенос нескольких коммитов: Можно указать диапазон. Команда перенесет коммиты, начиная с commit_A (не включая его) и до commit_B (включительно).

    # Перенести все коммиты от commit_A до commit_B
    git cherry-pick <commit_A_hash>..<commit_B_hash>
  • Разрешение конфликтов: Если Git не может автоматически применить изменения, возникнет конфликт.

    1. Отредактируйте конфликтные файлы вручную.
    2. Добавьте их в индекс: git add <file_name>.
    3. Продолжите операцию: git cherry-pick --continue.
    4. Для отмены: git cherry-pick --abort.
  • Перенос без создания коммита: Опция -n или --no-commit применит изменения к рабочей директории, но не создаст коммит. Это полезно, если вы хотите объединить несколько cherry-pick в один коммит.

    git cherry-pick -n abc1234
    git cherry-pick -n def5678
    # Теперь можно сделать один коммит
    git commit -m "Feature from two commits"

cherry-pick — мощный инструмент для точечного переноса исправлений (например, hotfix из main в develop) или отдельных фич, но его следует использовать с осторожностью, чтобы не нарушать логику истории коммитов.

Ответ 18+ 🔞

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

Как это делается, по шагам:

  1. Сначала убедись, что ветка, куда ты собрался тащить коммит, у тебя свежая, а то конфликты на ровном месте вылезут. Переключись на неё и подтяни изменения:

    # Переходим на ветку, куда будем впихивать коммит
    git checkout main
    git pull origin main
  2. Теперь найди тот самый заветный хеш коммита, который тебе приспичило перенести. Полез в лог исходной ветки (git log) и высматривай, как ястреб.

  3. Ну а дальше — магия. Выполняешь cherry-pick с этим хешом:

    # abc1234 — это тот самый волшебный хеш из другой ветки
    git cherry-pick abc1234

А теперь про важные нюансы, чтобы не обосраться:

  • Тащить несколько коммитов сразу? Легко! Можно указать диапазон. Команда скопирует коммиты, начиная после commit_A и включая commit_B. Главное — порядок не перепутай, а то получишь пиздопроебибну.

    # Перенести кучу коммитов от commit_A до commit_B
    git cherry-pick <commit_A_hash>..<commit_B_hash>
  • Конфликты? Ну, а куда без них, блядь. Если Git не смог сам разобраться, кто тут прав, он тебе вежливо намекнёт, что пора поработать руками.

    1. Лезешь в файлы, правишь эти ебаные конфликтные участки.
    2. Говоришь Гиту, что файлы готовы: git add <file_name>.
    3. Продолжаешь операцию: git cherry-pick --continue.
    4. Если всё пошло по пизде и ты передумал — отменяй: git cherry-pick --abort.
  • Хочешь перенести изменения, но не создавать коммит сразу? Есть опция -n (или --no-commit). Она применит изменения к твоим файлам, но не зафиксирует их. Идеально, если ты с нескольких коммитов хочешь слепить один красивый.

    git cherry-pick -n abc1234
    git cherry-pick -n def5678
    # А теперь сам делаешь один общий коммит
    git commit -m "Фича, собранная из двух коммитов"

В общем, cherry-pick — инструмент овердохуищной силы. Идеален для точечных исправлений, когда нужно, например, hotfix из main запихнуть в develop. Но, чувак, пользуй с умом, а то историю проекта можно так изгадить, что потом сам от себя охуеешь.