Как объединить код из двух репозиториев git с одинаковым кодом в ветке, но с разной историей? - PullRequest
2 голосов
/ 12 июня 2019

У меня есть два проекта. Одним из них является оригинальный проект OSS. Другой, который мы будем некорректно называть «форком», является копией ветви исходного проекта.

Код в форке был импортирован из исходного архива из Github. (Я очень хорошо осознаю тот факт, что это не то, как вы делаете вещи, но команда до меня сделала это, и теперь мне приходится иметь дело с последствиями. , но это то, что есть, и это нужно исправить сейчас).

Проблема:

  • Код в форке содержит код оригинального проекта для тега 1.2.0. Код в форке это master.

  • Вилка имеет модификации, которые не являются частью исходного проекта.

  • Как и следовало ожидать, оригинальный проект также продолжил свою жизнь, и теперь он достиг версии 1.6.0.

Я бы хотел начать все сначала и сделать следующее:

  • (Действительно) Форк первоначального проекта (вместе со всей его историей).

  • Создать ветку 1.2.0-modified, основанную на оригинальном 1.2.0.

  • Извлеките изменения из репозитория с изменениями и примените их к 1.2.0-modified. (Я попытался перебазировать, после некоторых изменений вручную во время слияния я смог получить код для сборки).

  • Теперь я хотел бы знать, каков наилучший ход действий, если бы я хотел продвинуться вперед и вернуться к 1.6.0.

Пожалуйста, имейте в виду, что произошли изменения как в первоначальном проекте, так и в "форке", поэтому я хотел бы сохранить историю с обеих сторон.

Как правильно это сделать?

Очевидно, я добавил оба пульта в новый форк для модификаций и извлек их обоих.

Проблема в том, что после перебазирования изменений из 1.2.0 вилки, в то время как я получил его для разрешения конфликтов и правильной сборки, при попытке перебазировать на 1.6.0, кажется, снова применяется все те же исправления, которые, как мне кажется, объясняются тем, что исходные ветви не были основаны на 1.2.0-modified.

Есть ли разумный и простой способ обойти это?

Ответы [ 2 ]

3 голосов
/ 12 июня 2019

У вас есть такая ситуация (время течет слева направо):

--o--2--o--3--o--o     original

       X--o--o--o      fork

Если вы знаете, что первый коммит X в вашей разветвленной истории совпадает (точно или в основном) с коммитом 2 (предположим, он помечен v1.2.0), вы можете сшить истории вместе с

git replace --graft X v1.2.0

Это создает фальшивую историю:

--o--2--o--3--o--o     original
      \
       X--o--o--o      fork

Теперь вы можете легко использовать git rebase, чтобы привязать ваши изменения к исходной истории. Вы получаете:

--o--2--o--3--o--o     original
                  \
                   o--o--o   fork

Теперь вы можете удалить трансплантат с помощью git replace -d (хотя я не уверен, как использовать эту версию).


Редактировать: пометить некоторый коммит в original с помощью 3 (предположим, что он помечен v1.3.0) для адресации комментария.

2 голосов
/ 12 июня 2019

Код в форке содержит код исходного проекта для тега 1.2.0. Код в форке находится в его хозяине.

Если в вашем «плохом форке» первоначальный коммит действительно точно такой же, как у тега 1.2.0, а затем ПОСЛЕ , они начали строить на нем и создавать коммиты, тогда он должен быть слишком сложно, и вам нужно только сделать:

git rebase <hash_of_root_commit> 1.2.0-modified --onto 1.2.0

он будет отменять только ваши коммиты, и у вас не должно быть конфликтов.

После этого у вас должна быть ветка, которую вы могли бы «легко» перенести на 1.6.0 (с конфликтами, я думаю ...)

Если затем не выполнить первоначальный коммит без их изменений, вам придется поиграть с функцией git replace --graft

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...