Как я могу сделать ребаз как один коммит используя Git

Моя история выглядит примерно так, но раз 10:

                i - j - e'- k - h'- l - m  feature-branch
              /
    a - b - c - d - e - f - g - h  master

(апострофы означают вишневые кирки) Я хочу повторить это:

                                  i - j - k - l - m  feature-branch
                                 / 
    a - b - c - d - e - f - g - h  master

Я не возражаю, если функция будет раздавлена ​​в 1 коммит. Основная проблема с регулярным перебазированием состоит в том, что он пытается перебазировать один коммит за раз, и мне приходится снова и снова исправлять и исправлять подобные конфликты.

Все, что я хочу, это взять разницу между кончиком моей ветви и кончиком мастера и применить их поверх мастер.

2 ответа

Решение

На самом деле это довольно просто.

  1. сливаться master в feature-branch, Вы решите все свои конфликты слияния здесь сразу. (Я настоятельно рекомендую остановиться здесь.)

                i - j - e'- k - h'- l - m - n    feature-branch
              /                           /
    a - b - c - d - e - f - g - h --------       master
    
  2. Затем, git reset --soft master, Это сделает так, что feature-branch указывает на master, но он сохранит все ваши изменения в индексе, готовые к принятию.

                i - j - e'- k - h'- l - m - n    (orphaned)
              /                           /
    a - b - c - d - e - f - g - h --------       master, feature-branch
                                  \
                                    (index)
    
  3. git commit

                i - j - e'- k - h'- l - m - n    (orphaned)
              /                           /
    a - b - c - d - e - f - g - h --------       master
                                  \
                                    n'           feature-branch
    

Единственная цель № 2 и № 3 - уничтожить историю feature-branch, Если вы уверены, что эта история вам никогда не понадобится, это нормально. Но это кажется пустой тратой на все эти дополнительные проблемы, чтобы просто удалить точную запись того, что на самом деле произошло.

Я предполагаю, что e' а также h' вишневые косточки e а также hсоответственно. Я также предполагаю, что конфликты появляются, когда Git пытается применить e' а также h', но не любой другой коммит. Пожалуйста, поправьте меня, если я ошибаюсь.

У вас есть несколько вариантов:

  • когда git rebase падает до подсказки, говоря, что это не может применяться e' или же h', бежать git rebase --skip сказать Git пропустить этот коммит.

    Как только ребаз завершен, если вы хотите объединить коммиты в один:

    git reset --soft master
    git commit
    
  • Сделайте интерактивную перебазировку и скажите Git не применять e' а также h':

    git checkout feature-branch
    git rebase -i master
    # Git will launch an editor containing an interactive rebase recipe:
    #   1. Delete the e' and h' lines.
    #   2. Optionally change the j through m lines to 'squash' if you
    #      want to squash all of those commits into one.
    #   3. Save the recipe and exit.
    
  • git rebase это простой способ сделать серию git cherry-pick команды. Вы можете сделать эти команды вручную самостоятельно:

    git checkout -b temp-branch master
    git cherry-pick i j k l m
    # optionally, if you want to squash i through m into a single commit:
    #   git reset --soft master
    #   git commit
    git checkout feature-branch
    git reset --hard temp-branch
    git branch -D temp-branch
    
Другие вопросы по тегам