如何重构GitHub仓库提交历史,保留作者与时间戳并调整Fork结构?
可行的实现方法
完全可以通过Git的提交移植操作实现需求,以下是具体步骤(假设所有仓库默认分支为main,可根据实际分支名替换):
创建目标Fork
在GitHub上直接fork用户1的original仓库到自己账号下,得到你的fork(original)仓库。本地克隆并配置远程仓库
- 克隆刚创建的
fork(original)仓库到本地:git clone git@github.com:你的用户名/original.git cd original - 添加两个远程仓库地址,分别指向用户2的
copy仓库和你原来的fork(copy)仓库:git remote add copy git@github.com:用户2/copy.git git remote add my-old-fork git@github.com:你的用户名/原fork仓库名.git
- 拉取所有远程仓库的提交
拉取copy和原fork仓库的最新提交到本地:
git fetch copy git fetch my-old-fork
- 移植copy仓库的新增提交
先找到original仓库的最新提交哈希值(记为ORIGINAL_LAST),可通过git log original/main --oneline -1获取。然后将copy仓库中在original之后的所有提交移植到当前分支:
git cherry-pick ORIGINAL_LAST..copy/main
此操作会完整保留用户2提交的作者信息、提交时间戳等元数据。如果遇到冲突,解决冲突后执行
git cherry-pick --continue即可继续移植,若要终止操作可执行git cherry-pick --abort。
- 移植自己原fork的新增提交
找到copy仓库的最新提交哈希值(记为COPY_LAST),通过git log copy/main --oneline -1获取。接着将自己原fork中在copy之后的所有提交移植过来:
git cherry-pick COPY_LAST..my-old-fork/main
同样,此操作会保留你自己提交的原始信息,冲突处理方式同上。
- 验证并推送结果
- 查看提交历史,确认结构、作者信息和时间戳是否符合预期:
git log --oneline --pretty=format:"%h %an %ad %s" - 确认无误后,将本地修改推送到自己的
fork(original)仓库:git push origin main
完成后,你的fork(original)仓库就会拥有original的基础提交,接着是用户2copy仓库的所有新增提交,最后是你自己的提交,完全满足需求。
内容的提问来源于stack exchange,提问作者G. Ianni




