Я использую Stacked Pull-Requests, чтобы помогать членам моей команды в разработке функций.
Однако тем временем какой-то другой разработчик объединил свои изменения в разработке, поэтому мне пришлось выполнить перебазировку.
Это было до перебазирования:
F3.1
/
F2.1-F2.2-F2.3
/
F1.1
/
DEV_1-DEV_2
У моей функции было три ветки: F1, F2 и F3. Мой коллега нажал DEV_2. Я хотел этого:
F3.1
/
F2.1-F2.2-F2.3
/
F1.1
/
DEV_1-DEV_2
Но после бега
$ git checkout F3.1
$ git rebase --update-refs develop
Я разошелся, поэтому использовал
$ git push --force
из F3.1
И теперь у меня есть
F2.1-F2.2-F2.3
/
F1.1 F1.1-F2.1-F2.2-F2.3-F3.1
/ /
DEV_1-DEV_2
Я уже восстановил предыдущую структуру, так что проблема не в этом. Но, похоже, я неправильно понял --update-refs. Я думал, что он позаботится именно об этом, обновив каждую ссылку из других веток?!
У меня есть 3 ветки F1
(1 фиксация F1,1
), F2
(2 фиксации F2.1
, F2.2
) и F3
(1 фиксация F3.1
). Так что да, вы правы
Только что воссоздал ваш сценарий с той же структурой, и в моем случае все F1, F2 и F3 были обновлены.
Все ли F1, F2 и F3 извлечены локально или это просто ветки удаленного отслеживания, например, origin/F1
?
Что именно вы делали и в каком порядке? @joanis
оформить заказ dev1, создать f1 и сделать фиксацию, создать f2 и сделать 3 фиксации, создать f3 и сделать фиксацию, вернуться в dev, чтобы создать фиксацию dev2, вернуться к f3 и выполнить перебазировку с помощью --update-refs
.
Вопрос о том, локальная F1
или удаленная origin/F1
у вас есть, важен: я почти уверен, что --update-refs
поменяет только локальные ветки, поэтому уточните, какой из этих двух вариантов у вас есть.
Как бы то ни было, если вы это сделаете git rebase -i --update-refs <target>
, вы увидите, какие именно ссылки будут обновлены в списке дел, прежде чем что-нибудь произойдет.
Спасибо за вашу помощь. Уточню в понедельник на работе и отпишусь!
Спасибо за помощь @joanis. Я понял, что ошибка действительно отсутствует origin/
Судя по разъяснениям в комментариях, проблема заключалась в том, что обновлялись только локально проверенные ветки F1
, F2
, F3
, а ветки удаленного отслеживания origin/F1
, origin/F2
и origin/F3
не были изменены.
Чтобы обновить удаленные ветки и, следовательно, ветки с удаленным отслеживанием, вам нужно сначала извлечь и обновить локальные ветки, а затем отправить их.
Чтобы команда git rebase --update-refs
работала так, как вы хотели, вам пришлось бы сначала проверить каждую ветку локально.
Например:
git checkout F1
git checkout F2
git checkout F3
git rebase --update-refs develop
даст обновленные локальные ветки F1
, F2
и F3
, которые вы можете принудительно отправить в origin
, со всеми обычными оговорками, что люди, работающие над F1
, F2
и F3
, должны знать, что вы делаете, и знать, как перебазировать свои собственная местная работа по результатам.
Да, и принудительно нажать все три ветки, а не только самую последнюю, т. е. git push origin +F1 +F2 +F3
Просто чтобы убедиться, что я правильно понимаю, у вас была точка ветки F1 для фиксации F1.1 и точка ветки F2 для фиксации F2.3, верно?