我正在尝试通过将它(追溯)应用到我已经跟踪远程代码库一段时间的项目来学习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
。
答案 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哈希