#git
Вопрос:
У меня довольно странная просьба к мерзавцу. Вот часть моей истории git:
-----2----- master / / 3--- new dev --1 old dev
- 1 получено из удаленной ветви разработки
- 2 — это слияние удаленной ветви dev с master
- 3 — это новая ветвь разработки, полученная от master
Я хотел бы подключить 3 к 1, как это:
-----2----- master / ---1---3--- dev
Старая разработка и новая ветвь теперь являются одной и той же разработкой ветви.
Есть ли способ достичь этого ?
Спасибо тем, кто ответит.
Изменить: Остальная часть моего репо выглядит так:
-2------5----7--- master / / 3--4----6----- dev
Так что, когда я сделаю, как сказал Чепнер, я закончу с этим:
-----2------5----7--------- master / / ---1---3--4----6----------- dev 3'-------4'--5'--6' newdev
Я хочу, чтобы у ветви newdev была та же история моей ветви dev с изменениями истории, внесенными командой чепнера.
Надеюсь, на этот раз все достаточно ясно.
Комментарии:
1. Главы филиалов-это просто специальные имена для коммитов. Хэш фиксации можно использовать так же легко, как имя ветви для перебазирования.
2. Кстати, зачем? old_dev и new_dev уже имеют общую историю. значение old_dev равно 1, а значение new_dev равно 1-2-3 (а значение master равно 1-2).
3. Вы правы, это абсолютно не влияет на мой проект. Это просто для того, чтобы иметь более красивый график истории и тренироваться в издании истории git.
4. обновите свои обновленные графики: old_dev уже содержится в истории new_dev, так что это уже «та же ветвь»: 1(old_dev)-2-3-4-6(new_dev). Кроме того, 3 и 4 не будут дублироваться после перебазирования, они уже содержатся в истории; и 5 никогда не был в ветке (new_)dev. Таким образом, перебазирование только скопировало бы/переместило фиксацию 6
5. Я начал писать ответ, но чем больше я старался, тем меньше я мог понять, чего вы пытаетесь достичь. В вашем вопросе, похоже, нет ни одной диаграммы, которая показывала бы текущее или желаемое состояние, все они показывают часть изображения.
Ответ №1:
Ветви в Git-это просто «метки», и активная метка перемещается с каждой новой фиксацией в этой ветви. То, что ветвь old_dev была удалена, здесь не имеет значения, фиксация была объединена и, таким образом, является частью истории главной ветви.
Решение вашей просьбы довольно тривиально:
git rebase --onto 1 2 new_dev
Он возьмет все коммиты из 2..new_dev (исключает 2, включает 3) и поместит их в коммит 1.
Комментарии:
1. Спасибо за ответ. Все сработало, как ты и сказал. Но я понял, что выразился недостаточно ясно. Я продолжил объединять свою ветвь разработки в master после той части истории, которую я вам показал. Поэтому, когда я делаю, как вы сказали, я получаю две новые ветви разработки. Я отредактирую свой пост, чтобы было понятнее.