我有一个带有一些提交的本地仓库。由于我想将其公开给其他人,我需要将其推送到 Github 上新创建的远程仓库。新创建的远程仓库使用许可文件初始化(因为本地仓库没有许可文件)。
由于在远程仓库中添加了文件,因此推送git push -u origin main
(我的本地分支也使用main
而不是master
作为主分支)会产生错误。license
C:\test>git push -u origin main
To https://github.com/pstricks-fans/test.git
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'https://github.com/pstricks-fans/test.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
我按照以下提示进行拉动。
C:\test>git pull origin main
From https://github.com/pstricks-fans/test
* branch main -> FETCH_HEAD
fatal: refusing to merge unrelated histories
合并是不可能的。
有人告诉我,我必须使用以下内容重新设置基础。
C:\test>git pull origin main --rebase
From https://github.com/pstricks-fans/test
* branch main -> FETCH_HEAD
Successfully rebased and updated refs/heads/main.
问题
有没有其他没有变基的解决方案(出于学习目的)?不建议对公共 repo 进行变基(如 git 文档所述)。
您的最终历史记录有三个选项。
您的本地提交保持不变,而且您还有一个包含许可证文件的本地提交。一种方法是使用
git cherry-pick origin/master
将公共提交变基到本地分支,然后git push --force-with-lease
用您的分支覆盖公共分支。虽然覆盖公共分支通常是不可取的,但如果没有其他人实际克隆它,这不是问题。如您所知,您可以重新定位本地提交,因此它们的历史现在遵循许可证文件提交的历史。
您合并了本地和远程分支,但由于它们没有共同的祖先,Git 担心您可能会犯错误,因此您需要使用 来确认它,正如Stack Overflow 问题
git pull origin main --allow-unrelated-histories
中所讨论的那样。如果您想让许可证文件显示在所有现有提交中,那么变基(或其他形式的历史重写)是唯一的选择。如果不更改提交 ID,则无法将文件添加到现有提交中。
(合并本地和 GitHub 初始化的历史,虽然完全有可能,但实际上并不能实现这一点 - GitHub 提供的文件只会出现在“合并”提交中及以后,但合并不会更改存储库过去的内容。 )
如果您只希望许可证文件显示在新提交上(这可能很好),那么通常只需将其添加+提交到您的本地存储库,然后
git push --force
到 GitHub,丢弃它初始化的任何内容。GitHub 的“Initialize with...”功能仅适用于全新的存储库——在发布现有存储库时它是无用的。