ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Git + 云端仓库实战:安装配置、SSH免密与分支合并全攻略

Git + 云端仓库实战:安装配置、SSH免密与分支合并全攻略 1. 项目安全同步为什么非 Git 不可1.1 你还在用文件夹命名来管理版本吗先问你一个扎心的问题你的项目文件里是不是还有这种东西——项目最终版_v5、项目最终版_真的不改了、项目最终版_最终最终_0321如果有那你现在的处境我太熟悉了。我早年间也这么干过直到有一次客户说上一个版本挺好的改回来吧我翻了半天愣是分不清哪个文件夹才是他说的上一个版本。那一刻我就明白了靠人工维护版本本质上是在赌运气。这种做法的风险远不止分不清哪个是最新版这么简单。你精心写了三天的代码一次误删回收站都救不回来你改了 A 模块结果 B 模块连带出了 bug你却完全回想不起来改动前是什么样你辛辛苦调通的运行环境换台电脑就全废。更别提多人协作的场景了——你传我传谁改了谁的最后只剩下一句别动我那个文件。这些问题的根源是一样的项目缺少一套可追溯、可回滚、可多人协同的管理机制。Git 就是来解决这件事的。它是一个分布式版本控制系统你可以把它理解成给项目装了一台时光机每次提交commit都会拍一张完整的项目快照想回哪个版本就回哪个版本还能看到谁在什么时候改了什么。这个能力在你一个人用的时候是后悔药在团队里用的时候就是协作的基础规则。1.2 Git 云端仓库解决的不只是备份但只有本地的 Git 还不够因为你的电脑随时可能挂掉。硬盘一坏本地那些 commit 记录全没了。所以要把安全两个字真正做到位必须配合云端仓库本地跑的是一份完整的历史云端再存一份同样的历史两边平时通过 push推送和 pull拉取保持同步。这样即使电脑丢了、硬盘废了从云端重新 clone 一份下来项目原地复活。云端仓库带来的第二个价值是任意设备可接入。我在公司用台式机回家用笔记本偶尔在服务器上还要临时看代码——只要这些设备都有 Git 并做好了认证就能随时把最新代码拉到本机继续干活。这种体验用 U 盘拷贝时代没法比用网盘同步也会遇到覆盖错版本的问题而 Git 的机制决定了它永远不会模糊地覆盖你的历史记录。所以说这个组合解决的核心问题就是三件事版本可追溯、数据不丢失、协作有秩序。这篇文章就是要把从零开始的路走一遍——装 Git、配环境、建云端仓库、配 SSH 认证、日常同步、分支合并、踩坑排查全部按我实际操作的顺序来讲你照着做就行。2. 从零安装 Git 并完成基础配置2.1 下载与安装Windows、macOS、Linux 三平台实测先说下载。Windows 用户直接去 Git 官网git-scm.com点 Downloads下载 64-bit 版本就行。官网有时候连得慢你也可以去一些开源软件的镜像站下但注意核对文件名和版本号别下到旧版本或杂牌打包。安装过程基本是下一步到底但有两处我建议你手动改一下默认编辑器建议选 Visual Studio Code 或 Notepad不要用默认的 Vim——你后面真正需要编辑器来写 commit 信息、解决冲突的时候Vim 会把你劝退。安装到 Adjusting your PATH environment 那一步选中间项 Git from the command line and also from 3rd-party software。旧版可能显示为 Git from the command line and also from 3rd-party software新版叫 Git from the command line and also from 3rd-party software总之选带third-party / 3rd-party的那个。这样才能保证你在普通的 cmd / PowerShell / 终端里直接敲git命令。选成 Use Git and optional Unix tools from Command Prompt 也行但会把一些 Unix 命令带进来容易和系统命令冲突新手我不推荐。macOS 用户有两条路。如果你装了 Homebrew一条命令搞定brew install git。没装 Homebrew 的话在终端里敲git --version很多时候系统会弹窗提示安装 Command Line Tools确认安装即可。这条路径装出来的 Git 版本可能不是最新的但日常使用完全够。Linux 用户最省心Debian/Ubuntu 系执行sudo apt install gitCentOS/RHEL/Fedora 系执行sudo dnf install git装完就是全局可用的。装完统一验证一下git --version看到输出git version 2.x.x就说明装好了。如果在 Windows 上提示不是内部或外部命令先检查安装时 PATH 那一步是不是选对了实在不行注销一下系统或者重启终端让环境变量生效。2.2 全局配置与身份验证让 Git 认识你装好之后千万别急着建仓库先把身份信息配置好不然每次提交都会报Please tell me who you are。这里配置的用户名和邮箱会写进每一次 commit 记录里团队协作时队友就是靠这个识别这段代码是谁写的。git config --global user.name 你的名字 git config --global user.email 你的邮箱example.com注意两点建议。第一邮箱最好用你注册云端仓库账号的那个邮箱这样提交记录能正确关联上账号平台会在你的提交旁边显示更丰富的头像和资料信息。第二--global参数表示全局生效它把你的配置写到了用户目录下的~/.gitconfig文件里。如果某个项目需要不同的身份比如给公司项目用公司邮箱可以在项目目录下不带--global再执行一次项目级配置会覆盖全局配置。验证配置是否生效git config --global --listWindows 上如果你想省去每次 push 都输密码的麻烦我建议直接往下一节走用 SSH 方式认证。如果你实在想先用 HTTPS 简单试一把Windows 系统装 Git 时默认会开启 Git Credential Manager第一次输入账号密码后会被记住后面就不用了。这个方案胜在简单但对熟悉 Git 的人来说 SSH 才是更省心、干净的长期方案。2.3 配合 Python 多版本环境时Git 要避开的坑在这个话题里加上 Python 多版本管理是因为很多跟着教程开发 Python 项目的人近期都遇到过同一类问题本机 Python 3.8测试服务器 Python 3.10队友的环境是 3.11项目拉到各自机器上总有依赖装不对。这不是 Git 的问题但如果不处理好会连累 Git 的协作流程。Git 本身只管代码文件它不管你机器上跑的是哪个 Python 版本。出问题的往往是你把本地环境里的垃圾一并提交到了仓库——最常见的就是.venv、venv、__pycache__这些文件夹。一个人开发时问题不大多人协作时只要有人不小心把虚拟环境目录提交进去就会带来一堆平台相关的二进制文件合并时制造大量无意义的冲突。正确做法是所有与 Python 版本相关的锁定信息走配置文件比如requirements.txt、pyproject.toml这些才该进 Git。如果你用 pyenv 或 conda 管理多版本想要锁定项目使用的版本可以把.python-version或 environment.yaml 提交进去队友拉下来即可自动对齐。虚拟环境目录、缓存目录一律通过.gitignore排除细节我在后面专门有一节讲。所以在我自己的项目里我会保证代码 依赖声明 环境版本声明三种文件进仓库而任何类似.venv/、__pycache__/的本地产物一律不进仓库。这句话你能听懂以后换机器拉代码就不会被环境问题折磨得太惨。3. 云端仓库搭建与 SSH 免密认证3.1 云端仓库怎么选GitHub、Gitee 各自定位聊云端仓库绕不开两个平台。一个是海外的 GitHub全球开发者集聚地开源项目生态最丰富把项目推到上面天然就有了跟全世界交流的窗口。另一个是国内平台如 Gitee如果你面向国内团队协作、需要更快的国内访问速度、或者项目交付客户在国内使用起来会更顺手。我个人项目怎么选国外开源项目我放 GitHub与国内团队交接的项目我放 Gitee。两个平台的工作机理完全一样学会了 SSH 配置你在两家都花不了五分钟。GitLab 或公司私建的 GitLab 同理只是地址换一下而已配置思路完全相同。创建云端仓库的操作都差不多登录平台点 New Repository / 新建仓库填仓库名选可见性私有或公开要不要初始化 README我一般建议不初始化等本地项目推上去再说省得先 pull 再 push 的麻烦。创建好后平台会给你两个地址HTTPS 地址和 SSH 地址长这样# SSH 地址示例 gitgithub.com:你的用户名/仓库名.git后面所有同步操作都会用到这个地址。别被这一串字符吓到它只是你在哪台机器、哪个账号、哪个仓库的定位信息。3.2 SSH 密钥生成与配置全流程HTTPS 方式每次 push 要输账号密码就算有凭据管理器在部分场景下也会遇到 token 失效SSH 方式则是靠一对密钥来认证身份配置好之后一劳永逸。这个一劳永逸是值得的因为 Git 的日常操作频率远高于其他登录操作每次都被拦一道的体验非常影响心情。第一步生成密钥。打开终端Windows 用户可以在开始菜单里搜索 Git Bash用它来执行命令输入ssh-keygen -t ed25519 -C 你的邮箱example.com命令中的-C只是给密钥加一个注释标签方便你识别它是谁生成的。敲回车后会问你保存位置直接回车用默认路径~/.ssh/id_ed25519即可如果提示文件已存在说明你之前生成过这时建议不要直接覆盖另行命名即可。接着会让你输入密码passphrase这一步我建议设一个简短好记的密码短语。有些人嫌麻烦直接留空但这样一来私钥文件裸躺在磁盘上别人拿到文件就等于拿到了你的身份建议还是设一道锁。第二步把公钥内容复制出来。公钥文件是.pub结尾的那个内容是纯文本。Windows 上用如下命令查看并复制cat ~/.ssh/id_ed25519.pub全选复制这段以ssh-ed25519开头、以邮箱结尾的字符串。然后去你的云端仓库平台找到设置里的 SSH Keys / SSH 公钥配置入口把这段内容粘贴进去保存。第三步本地访问云端时要让 SSH 客户端知道该用哪把钥匙。系统有默认规则你生成的文件如果叫id_ed25519大部分场景免配置。你直接测试连接ssh -T gitgithub.com如果平台是 Gitee就执行ssh -T gitgitee.com。第一次连接会询问是否信任目标主机输入yes回车即可。看到类似这样的输出就算认证成功Hi yourname! Youve successfully authenticated, but GitHub does not provide shell access.3.3 SSH 认证失败排查实录SSH 认证失败是这个环节最常见的拦路虎网上搜ssh认证失败 git的人特别多。我把自己踩过和帮别人排查过的几种情况整理一下。第一种输出Permission denied (publickey)。整体逻辑是SSH 客户端发出了密钥但云端不认可。先检查你是不是把公钥贴错了位置或者贴的时候漏掉了行尾、多复制了空格再检查你本地的私钥路径和密钥对是否匹配。第二种本机有多个密钥默认的id_ed25519不是云平台里配置的那把。比如你给 GitHub 配了密钥 A给 Gitee 配了密钥 BSSH 默认会拿第一个密钥去连所有主机结果两边都失败一半或者出现用了 GitHub 的密钥去连 Gitee的错乱。这种情况要在~/.ssh/config文件里显式指定Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519_github Host gitee.com HostName gitee.com User git IdentityFile ~/.ssh/id_ed25519_gitee配置好之后再次ssh -T gitgithub.com它会按文件名精确匹配对应的密钥。第三种Windows 用户常见的是ssh-agent没有运行或者运行时没有加载密钥。执行eval $(ssh-agent -s) ssh-add ~/.ssh/id_ed25519然后重试。如果是 Git Bash 环境命令可以直接执行如果是 PowerShelleval写法不适用可以改为用 Git Bash 操作。第四种你明明用的是 HTTPS 地址克隆却在报 SSH 相关的错或者反过来。检查远程仓库地址到底用的是哪种git remote -v这条命令会列出当前项目关联的远程地址是git开头就是 SSH是https://开头就是 HTTPS。你可以在平台网页上复制对应的正确地址然后用下面的命令替换git remote set-url origin gitgithub.com:用户名/仓库名.git记住一个核心原则排查 SSH 认证问题按密钥是否存在 → 是否被正确托管 → 是否加到平台 → 是否连对主机 → 地址是否用对的顺序来。按这个顺序走一遍大部分问题都能定位。4. 日常同步实操克隆、提交、推送、拉取4.1 从零拉取远程项目含 IDEA 操作云端仓库建好、SSH 认证通过接下来就该把项目转到本地了。这里的拉取涉及两个真实场景一是在新机器上从零开始获取项目二是开发工具里直接打开远程项目。新机器上获取项目非常直接在终端里执行git clone gitgithub.com:用户名/你的项目.git执行后项目会出现在当前目录以仓库名命名。这个命令不仅把当前最新代码拉了下来还把云端上全部完整的历史记录、全部分支信息一并拉了下来。也就是说从这一刻起你本地就是一份完整的仓库不只是当前文件那么简单。如果你用的是 IntelliJ IDEA 或 PyCharm 这类 JetBrains 系的 IDE流程也一样丝滑打开 IDEA选择File - New - Project from Version Control在弹出的对话框里粘贴仓库的 SSH 地址点击 Clone。IDEA 会自动完成认证和导入之后你在底部工具栏的 Git 面板里就能看到版本历史、分支列表和变更列表。这里我要提醒一下首次 Clone 大项目时IDEA 可能会弹出Trust Project对话框一定要先确认项目来源没问题再确认信任。Clone 下来后建议先看一眼git status正常输出Your branch is up to date with origin/main.之类的提示就说明本地和远程是同步的。4.2 核心命令串讲add / commit / push / pull日常用 Git翻来覆去就四个命令add、commit、push、pull。我用一个生活化的场景给你串一遍你想把一排新做的产品图放进商场展示柜。add是把产品从箱子搬到展示区暂存区commit是拍照存档记录这批产品于此刻摆在展示区编号是多少push是把展示区的照片和产品运送到总店云端仓库pull是从总店拉取最新的展出清单到本地分店。实操中我先改代码然后看变更git status会列出所有有变动的文件用红色标记未暂存、绿色标记已暂存。然后逐批或全量添加git add .这个.表示当前目录下所有未被忽略的改动。也有人爱用git add -A效果类似但会在某些边界场景多处理一些删除和重命名新手先用git add .最不容易踩坑。接着提交git commit -m feat: 新增用户登录接口-m后面是提交信息。书写上我给你一个能立刻提升观感的格式前缀 简短描述前缀如feat新功能、fix修 bug、docs文档、refactor重构、chore杂务。这条习惯会让以后翻历史记录时爽到飞起。提交后本地历史已经记录本次快照但云端还没有执行推送git push origin main这里的origin是远程仓库的默认别名main有的项目仍叫master是你要推送的分支名。推送成功后就完成了云端也更新一份的动作。反过来当你在另一台机器上或队友已经推了新提交本地需要同步时执行git pull origin main这条命令会拉取远端最新提交并合并到当前分支。我给你的日常节奏建议是动手改代码之前先git pull一次尽量在最新代码基础上改少做与别人改动冲突的无用功。4.3 .gitignore 的正确打开方式这节单独拿出来讲是因为几乎每个新手都会在不该提交的文件上栽跟头。.gitignore是仓库根目录下的一个纯文本文件只要把文件路径或匹配模式写进去Git 就会自动无视它们。比如 Python 项目一份可用的 .gitignore# 虚拟环境与缓存 .venv/ venv/ __pycache__/ *.py[cod] *.so # 依赖目录如用了 npm / 某些包管理器 node_modules/ # IDE 本地配置 .idea/ .vscode/ # 系统文件 .DS_Store Thumbs.db # 环境变量与密钥文件 .env *.local看到*.env我多说一句千万别把含密钥、数据库密码、API Key 的 .env 文件提交进 Git 仓库。哪怕仓库是私有的也不行因为一旦提交记录里出现过密钥它就永久留在历史中了后续即使删除文件密钥也已经泄露。正确姿势是把.env.example作为模板提交大家各自复制为.env并填入本地值。判断你的 .gitignore 是否生效可以执行git status如果原来会出现的__pycache__/、.venv/等条目不再出现就说明规则正确。如果某个文件已经被提交过再写进 .gitignore 并不会让它从仓库中消失要先把文件从 Git 的追踪列表里移除git rm -r --cached .venv加了--cached是只移出追踪记录、保留本地文件。这个操作执行后提交一次云端仓库里的垃圾就从历史文件里清掉了。5. 分支管理与合并团队协作的关键5.1 分支的本质与常用工作流分支是 Git 里鼓噪最凶、也最常被讲玄乎的概念。我的理解用一个类比就够分支就是平行的实验台。你在这张台上怎么折腾都不会影响主实验台上的稳定状态main/master 分支。等实验成功再把成果合并回主台。单人开发时分支一样值钱。比如我要给项目加一个登录功能我会先建一个功能分支在这个分支上安心写代码即便写崩了也不会污染主分支git switch -c feature/login这条命令创建并切换到一个名为feature/login的分支等价于老写法git checkout -b feature/login。开发完成后回到主分支git switch main每次切换分支工作目录里的文件会跟着变化——这正是分支平行世界的效果。所以切换前要养成git status看一眼的习惯确保没有未提交的改动。团队协作的常见姿势是主分支保持稳定可运行的版本功能分支各自开花合并时通过 code review 把关发版时打 tag标签。这套流程叫 Git Flow 的简化版不用搞得那么重但主分支不乱来、功能分支随便玩这两条底线我建议每个人、每个团队都坚持。5.2 分支合并实操与冲突解决功能在feature/login开发完需要合并到 main。先切回 main 并保证本地最新git switch main git pull origin main然后执行合并git merge feature/loginGit 会分析两个分支的历史把 feature 分支的改动并入 main。如果没有内容矛盾它会自动创建一个合并提交或者走 fast-forward快进合并——相当于 main 直接跳到 feature 的顶端历史呈直线。这都很顺畅真正让人头疼的是冲突。冲突的本质是两个分支改了同一文件的同一位置Git 不知道该听谁的只能把选择权交给你。合并时 Git 会提示CONFLICT (content)并在冲突文件里插入标记长这样 HEAD 这里是 main 分支上的内容 这里是 feature/login 分支上的内容 feature/login你需要做的是打开文件删掉、、这三行标记保留你认为应该保留的代码或者两边内容都保留并做整合保存文件然后git add 冲突文件名 git commit -m merge: 解决登录功能冲突冲突文件不要怕处理一次就明白了。我个人经验是解决冲突前先整体读一遍两边的改动逻辑再决定怎么合并别只盯着局部。有些冲突表面上是同一行背后其实是对同一逻辑的两种实现思路这种时候最好跟改动双方沟通一下。如果是远程仓库在你 push 之前被别人更新了push 会被拒绝这时你需要先git pull --rebase或git pull把远端最新内容拉下来整合再重新 push。6. 常见问题速查与我的避坑建议6.1 高频问题速查表把日常答疑中最高频的几个问题整理成表你遇到直接对号入座现象大概率原因解决办法push 提示Permission denied (publickey)私钥未加载或未加入平台检查~/.ssh/id_ed25519.pub是否已粘贴到云平台本地ssh-add重新加载push 被拒绝non-fast-forward远程有新提交本地没有先git pull origin 当前分支同步再 pushcommit 时提示Please tell me who you are未配置用户信息git config --global user.name/user.emailgit add .没反应、文件不在列表.gitignore 将其忽略了检查 .gitignore 规则文件已提交后写进 .gitignore 仍被跟踪文件已在 Git 追踪列表执行git rm -r --cached 文件路径后提交clone 项目后 IDEA 大量报错环境未对齐Python 版本、依赖缺失按 requirements.txt / pyproject.toml 重建虚拟环境command not found: git安装后未生效或未安装成功重启终端Windows 检查 PATH多密钥互串连 A 平台用 B 密钥未指定 IdentityFile在~/.ssh/config中为各主机显式指定密钥这些问题的共同点在于原因都藏在配置里而不是命令里。所以排查时不要急着重装 Git先看配置、看远程地址、看密钥加载情况。6.2 几条用真金白银换来的经验最后分享几条我这些年实际踩过坑后才总结出来的规矩它们不教条但每条背后都有真实的教训。第一养成先 pull 再动手的习惯。我的标准动作是打开项目、切到目标分支、git pull、确认干净后开始写代码。每天第一次打开项目这也做。就这一个动作大概率能避开 80% 的合并冲突。第二提交信息写清楚别偷懒写 update。有一次我翻近一个月的提交记录排查一个回归问题如果每条都写update我大概会提交完当场崩溃。写清楚做了什么、为什么对自己的项目复盘和团队的 code review 都是巨大的便利。第三大文件不要进 Git 仓库。模型文件、数据集、二进制资源、视频这些动辄几百 MB 的货色会让仓库体积迅速膨胀clone 体验极差。它们应该走独立的文件存储方案仓库里只放它们的下载脚本或说明文档。这几年我见过太多团队因为把大数据文件塞进 Git仓库几个 GB 大后续每次 clone 都像受刑。第四关键时刻多打 tag。项目发布、交付一个稳定版本时执行git tag v1.0.0并推送这个版本就被永久记住了。以后出了任何问题说回到 v1.0.0比回到某年某月那次提交可靠一百倍。我在实际使用中最大的感受是Git 和云端仓库的这套组合最值钱的不是省了多少备份工夫而是它带来的安全感和确定性。你不用担心改坏不用担心丢代码不用担心沟通混乱每一次改动都有迹可循。把这套流程跑通之后你大概率会和我一样再也回不到那个用文件夹管理版本的时代了。
返回列表