git clone 是拉取远程仓库代码的唯一正确起点,它完整复制历史、分支、标签和配置;跳过此步直接 git pull 会因缺少 .git 目录而报错 fatal: not a git repository。

git clone 是拉取远程仓库代码的唯一正确起点
如果你本地还没有这个仓库,git clone 不是“一种方式”,而是唯一合法入口。它会完整复制远程仓库的历史、分支、标签和配置(除敏感凭证外)。跳过这步直接 git pull 会报错 fatal: not a git repository —— 因为连 .git 目录都不存在。
实操建议:
- 用
git clone <url></url>,不要手动建目录再git init再git remote add,多此一举且易漏配 upstream - 如果只想克隆最新提交(节省带宽和时间),加
--depth 1参数,但会丢失历史,后续无法git checkout旧 commit 或切换未 fetch 的分支 - 克隆后自动进入主分支(通常是
main或master),但远程其他分支不会自动出现在本地,需用git branch -r查看,再git switch -c <local-branch> --track origin/<remote-branch></remote-branch></local-branch>同步
git pull 适用于已有本地仓库的增量更新
git pull 本质是 git fetch + git merge 的组合命令,只在已存在本地仓库且已配置好 remote 的前提下有效。常见误操作是:克隆后改了 remote 地址,却没运行 git remote set-url origin <new-url></new-url>,导致 git pull 仍连向旧地址,报错 Permission denied (publickey) 或 403。
实操建议:
- 执行前先确认 remote 是否正确:
git remote -v - 避免默认 merge 导致意外提交,推荐用
git pull --rebase,让本地新提交“重放”在远程更新之后,保持线性历史 - 如果本地有未提交修改,
git pull可能触发冲突;此时可先git stash,pull 完再git stash pop
遇到 fatal: refusing to merge unrelated histories 怎么办
这是 Git 2.9+ 加入的安全机制,当本地仓库和远程仓库完全没有共同 commit(即历史不相交)时触发。典型场景:你用 git init 新建了空仓库,又错误地 git remote add origin <existing-repo></existing-repo>,然后 git pull —— Git 拒绝把两个独立世界强行合并。
批量替换指定目录下所有 Git 仓库的远程地址(remote URL)。 当用户需要将 Git 仓库从一个服务器迁移到另一个服务器时使用。 触发词:git remote 替换、git url 批量修改、git 仓库迁移、更换 git 地址、批量修改 remote url。
实操建议:
- 最稳妥做法:删掉当前目录,重新
git clone - 若坚持保留本地文件(如未跟踪的配置或文档),先
git pull origin <branch> --allow-unrelated-histories</branch>,再手动处理合并结果(通常需git rm -r .再git checkout origin/<branch> -- .</branch>覆盖,慎用) - 该错误不会出现在正常
git clone后的git pull中,一旦出现,基本说明初始化流程已被人为破坏
SSH 和 HTTPS 协议选择影响认证方式与稳定性
URL 协议决定你如何通过身份验证:git@github.com:user/repo.git(SSH)依赖本地 ssh key;https://github.com/user/repo.git(HTTPS)默认弹出用户名密码,或依赖凭据管理器(如 macOS Keychain、Git Credential Manager)。选错协议会导致反复认证失败,比如 SSH URL 却没配 key,报错 Permission denied (publickey)。
实操建议:
- 优先用 SSH:一次配置(
ssh-keygen+ssh-add+ GitHub/GitLab 添加公钥),长期免密 - HTTPS 更适合 CI/CD 环境或受限网络(某些企业防火墙屏蔽 SSH 端口),但需配置凭据缓存:
git config --global credential.helper store(明文存硬盘)或cache(内存暂存) - 切勿混用:同一 remote 不要一会儿用 SSH URL,一会儿换 HTTPS URL,否则
git remote set-url后可能残留旧凭据干扰
实际项目中,最常被忽略的是 remote 的命名一致性(是否真叫 origin)和分支跟踪关系是否建立。一个 git branch -vv 就能看出本地分支有没有正确关联到远程对应分支 —— 没有箭头和 origin/xxx 字样的,git pull 就不会按预期工作。










