GitLab默认分支缺失引发代码上传问题及Git操作疑问
问题背景
在GitLab创建仓库后,开发人员无法初始化仓库,报错:
A default branch (master) does not yet exist
Ask a project Owner to create a default branch
创建仓库默认README生成master分支后,开发人员本地执行git fetch origin master,尝试git merge origin/master时触发错误:fatal: refusing to merge unrelated histories(本地master有完整工作内容,远程master仅含README)。随后执行git checkout -b newBranch+git rebase origin/master后可推代码,但有两个疑问:
- 执行
git log看不到master分支,查看所有分支时master在origin/master下方,变基提交是复制的,为何master不显示? - 如何理顺状态,让开发人员本地master与仓库master同步?
疑问解答
1. git log看不到master分支的原因
git log默认只展示当前所在分支的提交记录,你当前处于newBranch分支,所以默认只会显示该分支的提交。若要查看master分支的日志,需明确指定:
git log master
而查看所有分支时master在origin/master下方,是因为本地master的提交历史和远程origin/master完全无关(本地是独立初始化的仓库,远程是后来创建的仅含README的仓库),Git会将两段无关历史分开展示。变基操作仅让newBranch的提交基于origin/master重新生成,和本地master的原有独立历史无关联。
2. 同步本地与远程master的方案
方案一:保留本地master提交历史并合并
适用于需要保留本地原有master提交记录的场景:
# 切换到本地master分支 git checkout master # 关联本地master与远程master分支 git branch --set-upstream-to=origin/master master # 拉取远程master并允许合并无关历史 git pull origin master --allow-unrelated-histories # 处理冲突后推送到远程master git push origin master
方案二:用远程master覆盖本地master
适用于本地master提交已在newBranch备份,可舍弃原有本地master历史的场景:
# 切换到本地master分支 git checkout master # 将本地master重置为远程master的状态 git reset --hard origin/master # 强制推送到远程(确保本地与远程master完全同步) git push origin master --force # 把newBranch的提交合并到master并推送 git checkout master git merge newBranch git push origin master
处理完成后,开发人员即可直接在master分支工作,或基于master创建新分支开发。
内容的提问来源于stack exchange,提问作者KansaiRobot

