Как восстановить старую фиксацию в удаленной ветке?

#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 после той части истории, которую я вам показал. Поэтому, когда я делаю, как вы сказали, я получаю две новые ветви разработки. Я отредактирую свой пост, чтобы было понятнее.