每个人都了解不同的东西"合并git存储库",所以这是我的情况。我们有一个TFS存储库,我们已经在一个时间点检查了源代码并进行了初始git提交。然后我们在git(分支,合并等)中进行了正常的开发。问题是在新的存储库中我们没有git存储库中的历史记录,我们想解决这个问题。因此,我已将整个TFS存储库转换为git存储库,现在我需要将转换后的TFS存储库与当前的git存储库合并。
从上面的描述中可以明显看出,存储库独立于git立场,但从逻辑的角度来看,它们有一个共同的提交(提交成为当前git存储库的初始提交)。
如何在不丢失任何历史记录的情况下合并这些回购?我可以将转换后的TFS repo作为基础,然后从当前仓库的master中选择更改,但这不会导入在当前仓库中创建的所有分支。
答案 0 :(得分:3)
您可以尝试使用此程序:
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
我们是开始的时候:主分公司还可以,但是新的回购中的其他分支怎么样? 好吧,你不再需要你的旧回购,所以
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
在强制推送之前你必须确保历史记录正常,因为这会改变上游的历史记录(如果需要的话,保留新旧回购的备份以便恢复)
答案 1 :(得分:0)
我就是这样做的,不确定这是不是正确的方法,但至少对我有用:
git clone url:/to/new
cd repo
git remote add old url:/to/old
git remote update
git rebase --committer-date-is-author-date old/master
就是这样。现在,如果有其他分支,也许您还需要将它们重新建立在 master 上,这可能不是那么简单。
新存储库的 git 历史变得平坦,但对我来说,在查看 git log -p --graph
主要问题是我成为了新仓库所有提交的提交者。为避免这种情况,您可以查看使用 git filter-branch --parent-filter
而不是 git rebase
的类似问题的答案:
https://stackoverflow.com/a/44078243/4374441