首页 > 解决方案 > 如何将旧项目文件中途添加到主分支

问题描述

我找到了一个文件的 4 个旧版本,我想将它们添加到 Git 存储库中。

最初,有一个single-ref主开发线,如下:

[ROOT] A - B - C - D - I - J - K - L - M [MAIN]

目前,我已将旧文件添加到过去有 4 次提交的孤立分支中,导致:

[ROOT] E - F - G - H [ORPHAN]

由于这些提交的日期,在日志(显示所有分支)中,这些分支现在显示为:

[ROOT] E - F - G - H [ORPHAN]   A - B - C - D - I - J - K - L - M [MAIN]

(注意缺少-)

我想要的结果如下:

[ROOT] A - B - C - D - I - J - K - L - M [MAIN]
                     /
[ROOT] E - F - G - H

我应该如何执行此合并?实际上,我唯一要更改的是它也I成为H父级,因此所有文件都I保持不变。

注意事项:

我尝试过的是:

(main) $ git checkout I
(I) $ git merge H --allow-unrelated-histories --strategy ours

说它合并了,但是当我再次结帐时,什么都没有改变。从下面的评论中,我了解到这是因为 HEAD 分离。所以我尝试了别的东西:

(main) $ git merge H I --allow-unrelated-histories

但是后来这个合并提交是在今天M作为父级的。我如何在过去的旧提交上提交I

标签: gitgit-rewrite-history

解决方案


这是可能的,有几点说明。

尽管希望保留单个提交I仍然是可能的,但建议在 commitI和 commit之间引入新的单独合并提交J,这是默认的 Git 合并行为。

您可以使用交互式 rebase 执行这种类型的重写历史记录。但在此之前,由于您希望作者日期和提交者日期都在过去,因此您必须准备合并提交。正如您已经知道的那样,合并提交将在当前,但是稍后使用变基,您将更改提交的顺序。

请注意,所有提交的 SHA 都将被更改。(阅读:当有人拉取存储库时不要这样做。)

$ git checkout main
$ git merge Orphan I --no-commit --allow-unrelated-histories
$ GIT_AUTHOR_DATE='2001-01-31T13:41:20' GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE git commit -m 'Lost and found'
$ git rebase -i A --rebase-merges --committer-date-is-author-date

这将呈现一个所谓的待办事项列表,例如:

label onto

# Orphan branch
reset [new root]
pick 947c76a Message commit E
pick a324ed5 Message commit F
pick 336313f Message commit G
pick 5c52b9d Message commit H
label Message_commit_H

reset onto
pick 9a8f81d Message commit B
pick 4442137 Message commit C
pick 0c84d8f Message commit D
pick 9151031 Message commit I
pick 94ba177 Message commit J
pick 01f54e4 Message commit K
pick e8366f9 Message commit L
pick 22dab36 Message commit M
merge -C 2271f49 Message_commit_H # Lost and found

将此文件更改为:

label onto

# Orphan branch
reset [new root]
pick 947c76a Message commit E
pick a324ed5 Message commit F
pick 336313f Message commit G
pick 5c52b9d Message commit H
label Message_commit_H

reset onto
pick 9a8f81d Message commit B
pick 4442137 Message commit C
pick 0c84d8f Message commit D
pick 9151031 Message commit I
merge -C 2271f49 Message_commit_H # Lost and found
pick 94ba177 Message commit J
pick 01f54e4 Message commit K
pick e8366f9 Message commit L
pick 22dab36 Message commit M

关闭编辑器并让 rebase 更改提交的顺序。可能存在需要手动处理的合并冲突,在这种情况下,rebase 程序会告诉您确切的操作。

成功。


推荐阅读