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

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

Я думаю, что просто должен повторно основывать repo B на repo так или иначе, но я понятия не имею, как сделать это, возможно, с помощью выборки/получения по запросу и переосновы?

55
задан Elnur Abdurrakhimov 2 December 2013 в 07:26
поделиться

3 ответа

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

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


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

62
ответ дан 7 November 2019 в 07:21
поделиться

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

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

2
ответ дан 7 November 2019 в 07:21
поделиться

Если 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 (разработка, которую вы потеряли). Немного похоже на этот SO вопрос.

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

30
ответ дан 7 November 2019 в 07:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: