如何将提交从一个 Git 存储库复制到另一个?
- 2024-10-12 10:28:00
- admin 原创
- 79
问题描述:
上周我创建了一个 Github repo,但忘记为该 repo 选择许可证。现在已经有 3 个大型提交。
我曾询问过 3 位贡献者,如果我删除 repo,然后使用相同的名称再次创建它,并在创建 repo 时选择许可证,这样是否可以,他们对此表示同意。
问题
有什么办法可以将提交放入新的 repo(这次第一个提交是 LICENSE 文件)并仍然保留提交元信息?
解决方案 1:
有没有办法将提交放入新的 repo(这次第一个提交是 LICENSE 文件)并仍然保留提交元信息?
是的,通过添加远程并在第一次提交之上挑选提交。
# add the old repo as a remote repository
git remote add oldrepo https://github.com/path/to/oldrepo
# get the old repo commits
git remote update
# examine the whole tree
git log --all --oneline --graph --decorate
# copy (cherry-pick) the commits from the old repo into your new local one
git cherry-pick sha-of-commit-one
git cherry-pick sha-of-commit-two
git cherry-pick sha-of-commit-three
# check your local repo is correct
git log
# send your new tree (repo state) to github
git push origin master
# remove the now-unneeded reference to oldrepo
git remote remove oldrepo
这个答案的其余部分是如果您仍然想将 LICENSE 添加到您之前的 repo 中。
是的。您可以通过 rebase 将 LICENSE 提交设为第一个提交。
变基是 git 重新排列提交顺序的方式,同时保持所有提交作者和提交日期不变。
在处理共享存储库时,除非您的整个团队都精通 git,否则通常不建议这样做。对于那些不熟练使用 git 的人,他们只需克隆存储库的全新副本即可。
以下说明如何将 LICENSE 提交作为第一次提交。
更新并重新设置本地副本
检查您的项目并将 LICENSE 文件放在当前 3 个提交堆栈的顶部的提交中。
#create LICENSE file, edit, add content, save
git add LICENSE
git commit -m 'Initial commit'
然后在主分支上进行交互式变基来重新排列提交。
git rebase -i --root
它将打开一个编辑器。将底行(您的“初始提交”提交,即最近的提交)移至文件顶部。然后保存并退出编辑器。
一旦退出编辑器,git 就会按照您刚刚指定的顺序写入提交。
现在您已经更新了存储库的本地副本。请执行以下操作:
git log
验证。
强制将你的新 repo 状态推送到 github
现在你的副本已更新,你必须强制将其推送到 github。
git push -f origin master
这将告诉 github 将主分支移动到新位置。您只应在极少数情况下强制推送,在这种情况下,使用它的每个人都知道即将发生的更改,否则会让您的合作者感到困惑。
3.将协作者同步到github
最后,所有合作者都必须同步到该存储库。
首先,他们必须有干净的存储库,因为如果有未保存的更改,以下命令可能会造成破坏。
# make sure there are no unsaved changes
git status
# pull the latest version from github
git fetch
# move their master branch pointer to the one you published to github.
git reset --hard origin/master
就这样。现在每个人都应该同步了。
解决方案 2:
我遇到过类似的问题,我忘记将 repo 分叉到我的 github 并添加了几次提交,然后才意识到我的错误。
我发现了一个非常简单的解决方案。
首先删除原始仓库的远程仓库
git remote remove origin
其次,在我的 github 上向新的 fork 添加一个远程仓库
git remote add origin <my repo URL>
然后我推送到 origin master,我的所有提交都出现在我的 github 上。
解决方案 3:
我采用了以下方法:
将源仓库克隆到 /c/SrcRepo 等文件夹
将目标仓库克隆到 /c/DstRepo 等文件夹并切换到目标分支
在目标 repo 的根文件夹中运行以下命令:
git pull /c/SrcRepo srcBranch --allow-unrelated-histories
无需创建额外的远程引用
解决方案 4:
你可以试试这个,它简单又直接。这会将你使用的哈希值之前的所有提交(包括)推送到<last-commit-hash-from-old-repo>
其他存储库:
git clone https://github.com/path/to/new-repo.git new-repo
cd new-repo
git remote add old https://github.com/path/to/old-repo.git
git remote update
git merge --allow-unrelated-histories <last-commit-hash-from-old-repo>
git push origin main
如果有人需要将一个仓库中的所有提交推送到另一个仓库作为单个提交(就像我需要的那样),您可以简单地将--squash添加到合并命令中,如下所示:
git clone https://github.com/path/to/new-repo.git new-repo
cd new-repo
git remote add old https://github.com/path/to/old-repo.git
git remote update
git merge --squash --allow-unrelated-histories <last-commit-hash-from-old-repo>
git push origin main
解决方案 5:
根据@Moocowmoo 的回答,但试图进一步简化它
它的不同之处在于尝试尽可能避免冲突,只是假设遥控器是正确的。
但是它不能很好地处理已删除的文件,因此仍然需要手动操作。
# assuming you are already on the branch you want to be
git remote add oldrepo https://github.com/path/to/oldrepo
git fetch oldrepo
# take all or subset of changes from a branch
git cherry-pick --strategy recursive --strategy-option theirs oldestCommitHash^..latestCommitHash
# or take all changes included in a specific merge commit (easiest)
git cherry-pick --strategy recursive --strategy-option theirs mergeCommitHash^..mergeCommitHash
# handling deleted files/unhandled conflicts
# just keep repeating this section
git mergetool
# either c/m or d based on if you want to keep or delete the files
git cherry-pick --continue
解决方案 6:
目标 Git = UrlD(现有内容无所谓)
SourceGit = UrlS
git clone UrlS
git remote add origin2 UrlD
git push -f origin2 master
现在目标将具有与源相同的数据(您也可以使用 origin 而不是 origin2)
解决方案 7:
就我而言,我需要找出新旧存储库之间的差异。因此,在新存储库中添加了旧存储库。
git remote add old https://gitlab.site.az/old-blog.git
获取所有遥控器
git fetch --all
查找不同的提交
git log --graph --oneline --pretty=format:"%h%x09%an%x09%ad%x09%s" --abbrev-commit --date=relative develop..old/develop
获取您选择的提交
git cherry-pick SHA1 SHA2 SHA4
解决方案 8:
我在这里写这个是因为我正在寻找这样的解决方案:
生成原始提交的差异并将其应用于其他存储库:
cd my_origin_repo
git show COMMIT_ID > /tmp/commit.diff
ce my_target_repo
patch -i /tmp/commit.diff
解决方案 9:
例如,如果它是您的存储库的最新提交,您可以撤消更改,创建补丁并将该补丁导入其他存储库。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件