У меня был один репозиторий Мерзавца (A), который содержит разработку проекта до определенного момента. Затем я потерял карту с интерфейсом USB, этот repo A шел. К счастью у меня было резервное копирование последней фиксации, таким образом, я мог создать новый репозиторий (B) позже, куда я импортировал состояние последнего проекта, и продолжите разработку. Теперь я восстановился, который потерял карту с интерфейсом USB, таким образом, у меня есть два репозитория Мерзавца.
Я думаю, что просто должен повторно основывать repo B на repo так или иначе, но я понятия не имею, как сделать это, возможно, с помощью выборки/получения по запросу и переосновы?
Если 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
Прежде всего, начните с создания рабочего клона репо A.
Затем просто вставьте его из B и выполните слияние. Вы можете создать новую ветку, потянуть за нее, а затем объединить две ветки. Вам также может понадобиться флаг принуждения; Я делал такие вещи в Mercurial (объединяя два явно несвязанных репозитория вместе), и для этого нужен "-f".
Если A и B - одно и то же репо (первые SHA1 общие), вы можете:
git remote add A /path/to/A
git fetch A
для обновления всех удаленных веток A в репо Bgit checkout dev
(на B, где вы разрабатываете)git rebase A/devBranch
для воспроизведения B (т.е. того, что вы разрабатываете. т.е. то, что вы разрабатываете или повторно разрабатываете из резервной копии) поверх A/devBranch
(разработка, которую вы потеряли). Немного похоже на этот SO вопрос. Последний шаг позволяет синхронизировать вашу разработку с той, которую вы потеряли.
Но на самом деле, как только вы получили фетч из A, вы закончили: B теперь содержит "all" историю (ту, которую вы потеряли, и вашу текущую работу)