Восстановите git репозитой историю и добавьте ее в существующую - PullRequest
2 голосов
/ 16 апреля 2020

Моя текущая ситуация такова:

  • У меня был репозиторий ( repo1 ), оригинал
  • Новый пустой хранилище ( repo2 ) было создано
  • Все содержимое из repo1 было скопировано в repo2 , но не git history
  • Много изменений было внесено и передано в repo2

Вопрос:

Как можно Я восстанавливаю всю потерянную историю из repo1 и добавляю ее в repo2 ?

Мне в основном нужен весь мой код history в repo2 .

1 Ответ

2 голосов
/ 16 апреля 2020

Получение всего содержимого в repo2 - самая простая часть. Более важный вопрос заключается в том, насколько важно для вас (или других пользователей repo2), чтобы результирующая история была бесшовной.

Из repo2 вы можете добавить repo1 в качестве удаленного и извлечь историю.

$ cd path/to/repo2
$ git remote add old-history path/to/repo1
$ git fetch old-history

В упрощенном мире, где у каждого репо была только ветка master, это дало бы вам что-то вроде

O -- x -- x -- x <--(old-history/master)

O2 -- x -- x <--(master)

, поэтому история есть и ее можно запрашивать, но у вас есть на go с вашего пути, чтобы увидеть это. (Если в каждом репо есть несколько веток, картина более сложная, но в основном такая же.)

Предполагая, что old-history/master имеет коммит с тем же содержимым, что и O2, вы можете использовать git replace в отдельный клон, чтобы сделать историю более или менее цельной. (Вы всегда можете добавить такой коммит к old-history/master, если его нет.) Есть некоторые причуды с git replace, поэтому, если вы хотите go по этому маршруту, обратитесь к документации по https://git-scm.com/docs/git-replace

Вы также можете сделать переписывание истории, чтобы навсегда объединить историю. Это более крайняя мера и требует некоторой координации с любыми другими пользователями, которые совместно используют repo2, но это решение «сделай один раз, и все готово» (в отличие от replace, который затрагивает только один локальный клон).

Чтобы переписать историю, вы можете использовать --parent-filter из git filter-branch (см. https://git-scm.com/docs/git-filter-branch), или предположительно вы можете использовать git filter-repo (хотя я не знаю много об этой команде). Есть предостережения, чтобы сделать переписывание любого вида. Вы можете найти в SO многочисленные прошлые обсуждения этой процедуры или обратиться к git документам для получения информации о перезаписи общих историй.

...