将历史记录添加到git存储库或合并git存储库

时间:2013-08-16 09:25:04

标签: git merge

每个人都了解不同的东西"合并git存储库",所以这是我的情况。我们有一个TFS存储库,我们已经在一个时间点检查了源代码并进行了初始git提交。然后我们在git(分支,合并等)中进行了正常的开发。问题是在新的存储库中我们没有git存储库中的历史记录,我们想解决这个问题。因此,我已将整个TFS存储库转换为git存储库,现在我需要将转换后的TFS存储库与当前的git存储库合并。

从上面的描述中可以明显看出,存储库独立于git立场,但从逻辑的角度来看,它们有一个共同的提交(提交成为当前git存储库的初始提交)。

如何在不丢失任何历史记录的情况下合并这些回购?我可以将转换后的TFS repo作为基础,然后从当前仓库的master中选择更改,但这不会导入在当前仓库中创建的所有分支。

2 个答案:

答案 0 :(得分:3)

编辑:我之前的回答并没有带来什么好处。 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

我们是开始的时候:主分公司还可以,但是新的回购中的其他分支怎么样? 好吧,你不再需要你的旧回购,所以

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

相关问题