如何在主分支中途添加旧项目文件
How to add old project files midway to main branch
我找到了一个文件的 4 个旧版本,我想将其添加到 Git 存储库。
最初单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
中的所有文件都保持不变。
注意事项:
- 所有 SHA 都可以更改,
E
源自 D
,但不是其提交日期,因此出于时间顺序原因,我希望 E
保持孤立状态。
我试过的是:
(main) $ git checkout I
(I) $ git merge H --allow-unrelated-histories --strategy ours
这说它合并了,但是当我再次检查 main 时,没有任何改变。从下面的评论中我了解到这是因为一个分离的 HEAD。所以我尝试了其他方法:
(main) $ git merge H I --allow-unrelated-histories
但是这个合并提交是在今天以 M
作为父项。我如何在过去提交旧提交 I
?
这是可能的,需要注意几点。
虽然保留单个提交 I
的愿望仍然是可能的,但建议在提交 I
和提交 J
之间引入一个新的单独合并提交,这是默认 Git 合并行为。
您可以使用交互式变基来执行这种类型的重写历史记录。但在此之前,由于您希望作者日期和提交者日期都在过去,因此您必须准备合并提交。正如您已经知道的那样,合并提交将在现在进行,但是稍后通过变基,您将更改提交的顺序。
请注意,所有 提交的 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 程序会准确告诉您该怎么做。
成功。
我找到了一个文件的 4 个旧版本,我想将其添加到 Git 存储库。
最初单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
中的所有文件都保持不变。
注意事项:
- 所有 SHA 都可以更改,
E
源自D
,但不是其提交日期,因此出于时间顺序原因,我希望E
保持孤立状态。
我试过的是:
(main) $ git checkout I
(I) $ git merge H --allow-unrelated-histories --strategy ours
这说它合并了,但是当我再次检查 main 时,没有任何改变。从下面的评论中我了解到这是因为一个分离的 HEAD。所以我尝试了其他方法:
(main) $ git merge H I --allow-unrelated-histories
但是这个合并提交是在今天以 M
作为父项。我如何在过去提交旧提交 I
?
这是可能的,需要注意几点。
虽然保留单个提交 I
的愿望仍然是可能的,但建议在提交 I
和提交 J
之间引入一个新的单独合并提交,这是默认 Git 合并行为。
您可以使用交互式变基来执行这种类型的重写历史记录。但在此之前,由于您希望作者日期和提交者日期都在过去,因此您必须准备合并提交。正如您已经知道的那样,合并提交将在现在进行,但是稍后通过变基,您将更改提交的顺序。
请注意,所有 提交的 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 程序会准确告诉您该怎么做。
成功。