Как переустановить один репозиторий Git на другой?

У меня был один репозиторий Git (A), который содержит разработку проекта до определенной точки. Затем я потерял USB-накопитель, этот репо A был включен. К счастью, у меня была резервная копия последней фиксации, поэтому я мог создать новый репозиторий (B) позже, где я импортировал последнее состояние проекта и продолжал разработку. Теперь я восстановил потерянный USB-накопитель, поэтому у меня есть два хранилища Git.

Я думаю, что мне просто нужно переустанавливать репо B на repo. Как-то, но я понятия не имею, как это сделать, возможно, используя fetch/pull и rebase?

Ответ 1

Если A и B не являются тем же самым репо (вы создали B, используя последнюю рабочую копию, которую вы имели), вы должны использовать graft, чтобы притворяться, что у них общая история.

Предположим, что вы добавили A в качестве пульта для B в соответствии с ответом VonCs, и репо выглядит следующим образом: 1:

~/B$ git tnylog 
* 6506232 (HEAD, master) Latest work on B
* 799d6ae Imported backup from USB stick
~/B$ git tnylog A/master
* 33b5b16 (A/master) Head of A
* 6092517 Initial commit

Создайте трансплантат, сообщающий корню B, что его родитель является главой A:

echo '799d6aeb41095a8469d0a12167de8b45db02459c 33b5b16dde3af6f5592c2ca6a1a51d2e97357060' \
 >> .git/info/grafts

Теперь две истории, приведенные выше, будут отображаться как одна, когда вы запрашиваете историю для B. Создание перфорации является простым git filter-branch без аргументов. После ветки фильтра, однако, вы arent на любой ветке, поэтому вы должны git branch -D master; git checkout -b master.


1git tnylog= git log --oneline --graph --decorate

Ответ 2

Если A и B являются одним и тем же репо (первый SHA1 является общим), вы можете:

  • объявить A как удаленный для B: git remote add A /path/to/A
  • git fetch A to обновить все удаленные ветки A на репо
  • git checkout dev (на B, где вы разрабатываете)
  • git rebase A/devBranch, чтобы воспроизвести B (т.е. то, что вы разрабатываете или перерабатываете из своей резервной копии) поверх A/devBranch (потерянная вами разработка). Немного похоже на вопрос SO.

На последнем шаге вы можете синхронизировать своего разработчика с тем, который вы потеряли.
Но на самом деле, как только вы получите из A, вы закончите: B теперь содержит "всю" историю (ту, что вы потеряли, и текущую работу)

Ответ 3

Прежде всего, начните с создания рабочего клона репо A.

Затем просто втяните его из B и слейте. Вы можете предпочесть создать новую ветку, на нее нанести, а затем объединить две ветки. Вам также может потребоваться форсирующий флаг; Я делал такие вещи в Mercurial (вместе с двумя несвязанными друг с другом репозиториями), и ему нужно "-f".