Как я могу сделать ребаз как один коммит используя 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 ответа
На самом деле это довольно просто.
сливаться
master
вfeature-branch
, Вы решите все свои конфликты слияния здесь сразу. (Я настоятельно рекомендую остановиться здесь.)i - j - e'- k - h'- l - m - n feature-branch / / a - b - c - d - e - f - g - h -------- master
Затем,
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)
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