Как добавить заголовок из одного репозитория поверх существующего заголовка?

#git

#git

Вопрос:

У меня есть два репозитория repo1 и repo2, где repo2 в какой-то момент был клонирован из repo1. Теперь мне нужно заменить главную ветвь из repo2 на главную ветвь из repo1. Я хочу сохранить историю в repo2 нетронутой и просто добавить все, что есть в главной ветке repo1, в качестве коммита в repo2.

Итак, это будет что-то вроде этого:

Repo2

                      D------E-----F (branch to keep)
                    /
init----A----B----C------G-----Head(h2) (master)
  

Repo1

 init----A----B-....-Z-----Head(h1) (master)
  

Чего я хочу

                      D------E-----F (branch to keep)
                    /
init----A----B----C------G-----h2----HEAD(h1) (master)
  

после этой операции основная ветвь в обоих репозиториях должна быть идентичной.

Это правильный способ сделать это? (Я не могу рисковать, сначала попробовав, а потом поняв, что это неправильно !!)

  1. git clone repo2.git repo2 amp;amp; cd $_
  2. git remote добавляет исходящее repo1.git
  3. git fetch upstream
  4. git перебазирует upstream / master
  5. git нажимает origin master —force

Ответ №1:

Во-первых, даже если вы покажете «h1» в обоих репозиториях, когда закончите, поймите, что идентификаторы фиксации будут разными…

Я чувствую, что самый простой способ выполнить то, о чем вы просите, — это проверить master в обоих репозиториях, а затем просто скопировать файлы из repo1 в repo2. Затем передайте его в master на repo2.

С учетом сказанного, это кажется странным поступком. Интересно, почему вы хотите сохранить историю master в repo2, если вы хотите, чтобы файловая система фактически не отражала ни одно из этих изменений? Как только вы «заменяете» master в repo2 на master из repo1, вы отменяете любые изменения, для которых вы хотите отслеживать историю. Кроме того, с разными идентификаторами для одних и тех же файлов ваши репозитории всегда будут не синхронизированы. Интересно, было бы лучше просто отменить изменения на master, затем объединить обратно в master, а затем синхронизировать два репозитория с фиксацией слияния на месте. Таким образом, ваша история по-прежнему сохраняется, и оба репозитория одинаковы, на случай, если вы захотите сделать это снова в будущем.

Комментарии:

1. Это правда, что SHA наверняка будут отличаться, я просто хотел визуально указать, что они в основном представляют собой один и тот же снимок. Что касается истории, я думаю, что что-нибудь еще сделало бы возврат к истории более сложным. Таким образом, у меня есть история обоих репозиториев (repo1, который станет неактивным, и repo2). И копирование / вставка изменений и простая фиксация их на самом деле не кажутся такими уж плохими ( 1) (Это репозиторий Terraform, поэтому файлов не так много). Не уверен, что это лучший способ.

2. @mok ОК. Поскольку вам нужны файлы из repo1, кажется, что имело бы смысл сохранить историю коммитов, из-за которых вы туда попали, но, похоже, вы хотите выбросить эту историю и вместо этого сохранить историю repo2, хотя вы, по сути, отменяете эти изменения. 🙂

3. Я понимаю, что вы говорите об истории, и согласен с этим, но я не уверен, что удаление истории для master не повлияет на другую ветку, которую я должен сохранить (включая ее историю) в repo2. Вот почему я не хочу с этим возиться.