У меня есть 2 ветки: feature1
и feature2
, которые основаны на ветке develop
. feature1
основан на более старой фиксации, а feature2
— на более новой.
Я хочу получить только те коммиты из feature2
, которые не находятся в разработке, в feature1
.
Я попробовал git rebase --onto feature1 develop feature2
, как предложено в этом ответе, но я вижу, что коммиты от разработки все еще применяются к feature1
. Что мне здесь не хватает?
Обновление: оказалось, что локальная ветка develop
не была обновлена по сравнению с удаленной develop
веткой, в то время как feature2
была основана на более позднем коммите на удаленной develop
. Вот почему коммиты с удаленного develop
менялись.
«Обновление: оказалось, что локальная ветка разработки не была обновлена вместе с удаленной разработкой. Это причина, по которой команда не работала раньше. Теперь она работает». - так что «не воспроизводимо или вызвано опечаткой». Если вы хотите переустановить удаленную разработку, вы должны использовать origin/develop
. Я голосую за закрытие, команда (rebase --onto feature1 develop feature2
) работает отлично (как указано OP).
Как упоминает knittl в комментариях, git rebase --onto A B C
всегда берёт диапазон коммитов B..C
(т.е. ^B C
)
Это означает, что он должен ориентироваться на коммиты от D
(исключено) до f2
HEAD (ни один из этих коммитов не должен быть от develop
, достижимым из develop
):
f2--f2 (feature2)
/
--d--d--D--d (develop)
\
f1--f1 (feature1)
git rebase --onto feature1 develop feature2
--d--d--D--d (develop)
\
f1--f1 (feature1)
\
f2'--f2' (feature2)
feature1
был объединен сfeature2
ранее без удаления веткиfeature1
.
Так:
f1--f1--f1--f1 (feature1)
/ \
/ f2--f2--f2 (feature2)
/ /
--d--d--d--d--d (develop)
Однако ОП добавляет:
Моя локальная ветка
develop
не была обновлена с удаленной разработкой, в то время как другие ветки были обновлены.
Вот почему коммиты из удаленной разработки перебазировались.
Так:
gi fetch
git switch feature1
git rebase --onto feature1 origin/develop feature2
Команда OP будет работать с этим графиком коммитов так же хорошо, нет необходимости в merge-base
. git rebase --onto feature1 develop feature2
будет выполнять только коммиты перебазирования f2
и f3
@knittl Интуитивно я подумал, что это сработает, только если функция 2 будет основана на разработке HEAD, а не на разработке прошлой фиксации.
git rebase --onto A B C
всегда принимает диапазон фиксации B..C
(т.е. ^B C
). Какой другой диапазон имел бы смысл?
@knittl Итак, история графика не должна быть той, которую я описал.
Почему-то это не работает, у меня та же проблема, что и раньше
@Abhilash можешь показать результат git log --decorate --oneline --graph --all --branches
?
@VonC Я не могу поделиться этой информацией здесь, я полагал, что ситуация такая, как вы описали, но я думаю, что это неправда. Не могли бы вы подсказать, что мне искать?
@Abhilash Проверьте характер коммита, который, по вашему мнению, исходит из develop
после перебазирования: как уже упоминалось, ни один из коммитов с перебазированием не должен быть из develop
.
@Abhilash Увидев ваше редактирование, я попробовал новую схему истории Git: будет ли она представлять вашу текущую ситуацию?
@VonC Ваша новая схема верна, но я выяснил причину проблемы. Моя локальная ветка develop
не была обновлена до удаленной develop
ветки, в то время как другие ветки были обновлены. Вот почему коммиты с удаленного develop
менялись.
@Abhilash Хороший улов: я включил ваш комментарий в ответ для большей наглядности.
Эта команда должна быть в порядке. Как выглядит график истории ваших коммитов?