Как переустановить один репозиторий 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".