我有一个Git存储库(A),它包含项目的开发直到某一点。然后我丢失了这个回购A打开的USB记忆棒。幸运的是,我有一个最新提交的备份,所以我可以稍后创建一个新的存储库(B),我导入最新项目的状态并继续开发。 现在我恢复了丢失的USB记忆棒,所以我有两个Git存储库。
我想我不得不以某种方式将回购B重新命名为回购A,但我不知道怎么做,也许使用fetch / pull和rebase?
答案 0 :(得分:61)
如果A和B不是同一个仓库(您使用最新的工作副本创建了B),则必须使用graft假装他们有共同的历史记录。
假设您已根据VonC’s answer将A添加为B的远程,并且回购看起来像 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
答案 1 :(得分:27)
如果A和B是相同的仓库(第一个SHA1是常见的),您可以:
git remote add A /path/to/A
git fetch A
到update all remote A branches git checkout dev
(在B,您正在开发的地方)git rebase A/devBranch
在A/devBranch
(您丢失的开发)之上重播B(即您从备份中开发或重新开发的内容)。有点像SO question。最后一步允许您将您的开发者与您丢失的开发者同步 但实际上,一旦你从A获取,你就完成了:B现在包含“ all ”历史记录(你丢失的那个和你当前的工作)
答案 2 :(得分:2)
首先,首先制作一个repo A的工作克隆。
然后只需从B中拉入并合并即可。您可能更喜欢创建一个新分支,拉入它,然后合并两个分支。你可能还需要一个强制标志;我在Mercurial中完成了这样的事情(将两个显然不相关的存储库嫁接在一起),它需要“-f”。
答案 3 :(得分:2)
git filter-branch
自 Git 2.24(2019 年第四季度)以来一直是 deprecated。相反,对于 A 和 B 不是同一个 repo 的场景,您可以使用 git replace --graft <commit> <parent>
。
见: