每个人对“merge git 存储库”的理解都不一样,所以这是我的例子。我们有一个 TFS 存储库,我们已经在某个时间点检查了源代码并进行了初始 git 提交。然后我们在git中进行正常的开发(分支、 merge 等)。问题是在新的存储库中,我们没有 git 存储库中的历史记录,我们想修复它。因此,我已将整个 TFS 存储库转换为 git 存储库,现在我需要将转换后的 TFS 存储库与当前的 git 存储库 merge 。
从上面的描述中可以明显看出,存储库独立于 git 的观点,但从逻辑的角度来看,它们有一个共同的提交(成为当前 git 存储库的初始提交的提交)。
如何在不丢失任何历史记录的情况下 merge 这些存储库?我可以将转换后的 TFS 存储库作为基础,然后从当前存储库的 master 中挑选更改,但这不会导入在当前存储库中创建的所有分支。
最佳答案
编辑:我之前的回答并没有带来任何好处。 git rebase 并不是要这样做的。 然而,stackoverflow 上已经发生了类似的事情:Merging two git repositories to obtain linear history
你可以试试这个程序:
git init combined
cd combined
git remote add old url:/to/old
git remote add new url:/to/new
git remote update
您将拥有一个新的存储库,其中引用了两个存储库。然后
git reset --hard old/master
这将使主分支指向旧仓库的主分支。 您现在可以从新仓库的主分支中挑选所有提交
git cherry-pick <sha-1 of first commit on new repo>..new/master
我们是这样开始的:master 分支没问题,但是新仓库中的其他分支呢? 好吧,你不再需要你的旧仓库了,所以
git remote rm old
然后,假设您在新存储库中有一个名为“branch1”的分支。
git checkout branch1
git rebase master
这应该会更改 branch1 的历史记录,使其从 master(组合的 master,包含来自导入的 repo 的历史记录)开始,并且应该在没有冲突的情况下进行 rebase 。 检查历史与gitk一致,然后你可以强制推送
git push -f new master
git push -f new branch1
在强制推送之前你必须确保历史是好的,因为这会改变上游的历史(如果需要的话,保留新旧仓库的备份以恢复)
关于git - 将历史添加到 git 存储库或 merge git 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18270041/