Как переназначить один Git-репозиторий на другой? - PullRequest
52 голосов
/ 11 марта 2010

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

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

Ответы [ 3 ]

61 голосов
/ 11 марта 2010

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

Предположим, что вы добавили A в качестве пульта для B согласно ответу VonC , и репозиторий выглядит следующим образом 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 без аргументов. Однако после ветви фильтра вы не находитесь ни в одной ветви, поэтому вам следует git branch -D master; git checkout -b master.


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

27 голосов
/ 11 марта 2010

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

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

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

2 голосов
/ 11 марта 2010

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

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

...