git:追溯介绍几个合并

时间:2010-10-28 04:10:42

标签: git

我正在尝试通过将它(追溯)应用到我已经跟踪远程代码库一段时间的项目来学习git。 当我把所有内容都放到git中时,我只为所有外部版本创建了一个remote分支,并将我的版本放在master上,所以目前我的存储库看起来像这样:

master: A0---A1.0--A1.1--A2.0--A2.1-....
          \                
remote:    B1----------B2-----------....

我的问题是:我如何追溯告诉git发生的合并,使存储库看起来像这样(不应该更改代码):

master: A0---A1.0--A1.1--A2.0--A2.1-....
          \ /           / 
remote:    B1----------B2-----------....

标准git免责声明:以上操作不会影响已发布的历史记录:)

编辑:以下是我如何使用凯文建议的移植物做到这一点:

首先,我手动创建.git / info / grafts如下(所有条目都是sha1):

A1.0 A0 B1
A2.0 A1.1 B2

然后,在检查事情看起来不错(gitx)后,我运行git filter-branch没有参数。

Filter-branch会使移植物永久化,并将引用存储在refs/originals/...中的原始提交中,以允许您通过git reset --hard refs/originals/refs/heads/master退出。由于一切都很好,我删除了所有剩菜,如下所示:

rm .git/info/grafts
rm .git/refs/originals

如果您收集了垃圾,则需要执行git update-ref -d refs/originals/refs/heads/master

3 个答案:

答案 0 :(得分:3)

听起来像你想要grafts。您可以为所需的新合并创建移植(请记住在移植中包含原始父项!),当一切看起来都很好时,使用git filter-branch(阅读联机帮助页!)将其整合在一起。

答案 1 :(得分:2)

您可以通过执行交互式rebase完全伪造这一点,指定您要编辑所有这些提交,并使用merge commit修改它们:

git rebase -i A0 master
# change the lines for A1.0 and A2.0 to "edit"
# git stops at A1.0
git merge --no-commit --strategy=ours B1     # the SHA1 of B1, of course
git commit --amend
git rebase --continue
# git stops at A2.0
git merge --no-commit --strategy=ours B2
git commit --amend
git rebase --continue

每次停止时,您都在技术上合并,但采用ours策略,该策略保留当前提交的所有内容。 --no-commit告诉git在提交之前停止。然后,您可以使用合并修改当前提交(这基本上意味着替换),而不是像往常那样使合并成为单独的提交。田田! A1.0已被替换为具有相同树的新提交,但是另外一个父。 commit --amend让您有机会编辑邮件;你可能想这样做,留下你已经完成的事情的记录。

答案 2 :(得分:2)

我知道这是一个老问题,但有更新的方式执行此操作(从Git 1.6.5开始)。

{{1}}

其中<>是SHA哈希

相关问题