Сводка
Используя Git из командной строки, вы можете перебазировать feature
на master
:
git rebase master feature
# Now force push the changes to your remote
git push <remote> feature --force
Предупреждение : не делайте неосторожных принудительных изменений (переписанных) коммитов / ветвей push , если вы делитесь этими коммитами / ветками с другими людьми, потому что вы будете вызывать конфликты с любыми изменениями, основанными на более старых версиях коммитов/ветви.Можно работать таким образом в (очень) небольших командах, но требуется хорошая координация.
Вы также можете использовать флаг --onto
, чтобы указать диапазон где <start commit>
является эксклюзивным началом диапазона:
git rebase --onto master <start commit> feature
Наконец, cherry-pick
может фактически принимать диапазон аргументов.С извлеченной веткой master
:
# Cherry-pick all commits from `<start commit>`
# exclusive, not included) to feature:
git cherry-pick <start commit>..feature
Подробное объяснение
Моя первоначальная цель состояла в том, чтобы иметь возможность синхронизировать мою ветку feature
с изменениями, внесенными в master
,но я не хотел просто объединяться в master
, потому что это вызвало слишком много конфликтов, которые должны были быть разрешены одновременно.Мне просто хотелось иметь возможность постепенно объединять изменения, чтобы я мог разрешать конфликты небольшими, более управляемыми частями.
Введите git rebase
Лучший способ сделать это -факт git rebase
.Это на самом деле идеально.Все, что я сделал в feature
и , сделает копии этих коммитов в том же порядке, за исключением того, что он рекомендует их поверх последней версии целевой ветви , которая в моем случае была master
.
Это важно по двум причинам:
Это эквивалентно объединению master
в feature
.Зачем?Поскольку feature
в основном воссоздан поверх самых последних ревизий master
... все коммиты master
теперь существуют в истории feature
, включая коммиты в master
, которые feature
didn 'пока нет.
Git повторно применяет коммиты по одному по порядку, поэтому, если возникают конфликты, онивведены в процесс несколькими небольшими, более управляемыми частями, по одной за раз, и это именно то, что я надеялся сделать!
Вот так это выглядит визуально (примеры адаптированы из официальная документация по Linux Kernel Git ):
A---B---C feature
/
D---E---F---G master
В приведенном выше примере коммиты F
и G
сделаны на master
, так как я разветвил feature
от него,Я хочу синхронизировать эти изменения с feature
:
git rebase master feature
Теперь мои ветви выглядят так:
A'--B'--C' feature
/
D---E---F---G master
\
A---B---C (no branch)
Коммиты A
через C
воссозданыот A'
до C'
поверх последней версии master
.Старые коммиты все еще существуют в репозитории Git, но, поскольку на них нет указателя ветки, который ссылается на них, Git в конечном итоге соберет мусор.