有一次在技术群里帮人解决码云仓库上传的问题,对方已经把项目折腾了半天,在命令行里敲了一堆git add、git commit、git push,不是提示这个分支没关联,就是报错说远端有更新要 pull。我回了一句:“你装个小乌龟试试。”十分钟后,他在群里连发三个大拇指。
小乌龟不是宠物,指的是 TortoiseGit,Windows 下最老牌的 Git 图形客户端,图标是一只背着壳的乌龟,中文社区喊了十几年“小乌龟”。它把 Git 的命令全部包装成右键菜单,点一下就能克隆、提交、推送,特别适合从 SVN 转过来、或者根本不想碰命令行的开发者。这篇文章从小乌龟的安装、SSH 配置,到克隆、提交、分支切换、cherry-pick 这些高频操作完整过一遍,全程以码云 Gitee 作为远程仓库来演示。看完之后,你应该能信心十足地把项目端上码云。
1. 为什么偏偏是 TortoiseGit:和码云搭伙的正确姿势
1.1 小乌龟到底是个什么角色
TortoiseGit 的名字一眼就能看出它的出身:TortoiseSVN 的 Git 版本。它不替代 Git,只是在 Windows 资源管理器里给 Git 穿了一件看得见摸得着的外套。真正在底层干活的还是 Git 本体,小乌龟负责把add、commit、push这些命令翻译成右键菜单、弹窗和图标状态。
打个比方,Git 是发动机,小乌龟是仪表盘和方向盘。你不一定非得会修发动机才能开车,但得知道油门刹车在哪。TortoiseGit 就是那个把所有仪表都做得明明白白的驾驶舱,文件改了、冲突了、提交成功了,全部用图标颜色和弹窗告诉你,不需要背命令。
和 GitHub Desktop、Sourcetree 这些图形客户端相比,小乌龟的优势有三个:一是老牌稳定,该有的功能它都有;二是不绑定任何托管平台,码云、GitHub、GitLab 都能用;三是它活在系统右键菜单里,不用额外打开一个窗口,改完文件直接在资源管理器里右键操作,体验一气呵成。对 Windows 用户来说,这是个很难戒掉的爽点。
1.2 为何与码云特别搭
码云就是 Gitee 的中文品牌名,国内开发者用得非常多。它和 TortoiseGit 搭伙,可以说是省心组合。
先说码云吸引我的点:国内服务器访问速度快,中文界面没有阅读压力,最关键是私有仓库免费。个人项目不想公开、公司内部不想买服务,私有库一建,push 上去就完事。这一点对独立开发者和小团队特别友好,我在上面存了一堆平时写的脚本和练手项目,费用为零。
TortoiseGit 这边不挑食。它面对的是一个标准 Git 远程仓库,SSH 克隆、推送、分支管理这些动作,对码云和其他平台完全通用。你在这里学会的操作,换到别家平台一样用。所以用码云当宿主环境来练小乌龟,一点不会白学。
顺带说一句,码云网页端自己也提供了一些在线编辑、项目文档功能,但日常改代码还是本地顺手。本地用小乌龟管理版本,码云网页用来做备份和协作,两边各有分工,具体怎么配合我会在后面展开讲。
1.3 安装前的最后一道准备:Git 本体
在动小乌龟之前,必须先装一个东西:Git for Windows。
很多人容易忽略这一步,直接把 TortoiseGit 装上,打开发现右键菜单没有反应,或者提示找不到git.exe。因为小乌龟只是个壳,壳里得先有引擎。Git for Windows 是官方出的 Windows 版 Git,装好之后小乌龟才能调用它。
装 Git for Windows 的时候,大部分选项默认即可,但有一个地方要注意:PATH 环境变量那个环节,默认选的是中间项“Git from the command line and also from 3rd-party software”,这个选项的意思是不仅命令行能用 Git,第三方软件(比如小乌龟)也能找到它。千万别选第一项“Use Git from Git Bash only”,否则小乌龟可能加载不到 Git。装完之后打开 cmd 敲一下:
git --version能看到版本号,就说明 Git 本体准备好了,可以开始装小乌龟了。
提示:安装顺序别反。先装 Git for Windows,再装 TortoiseGit,否则可能出现右键菜单缺失或无法克隆的问题。
2. 小乌龟的完整安装流程:版本、语言包与右键菜单
2.1 第一步:装好 Git for Windows
Git for Windows 的下载地址就不贴了,直接去官网找,区分 64 位和 32 位。现在绝大多数电脑都是 64 位,选 64-bit 版本就行。双击安装后一路 Next,到 PATH 选项时留意一下选第二项,其他的默认到底。
有些人会遇到一个问题:安装完 Git 后,右键菜单里已经出现“Git Bash Here”和“Git GUI Here”,这就是正常的。这两个菜单位于让命令行走,小乌龟装好后会在同一个右键菜单里加入自己的项目。
装完 Git 后别忘了配置一下身份信息,打开 Git Bash 执行:
git config --global user.name "你的名字" git config --global user.email "你的邮箱"这个身份信息会写进每次提交里,码云仓库的提交记录会显示它。如果没配,提交时小乌龟可能会让你在弹窗里补,也行,但提前配好省事。
2.2 第二步:安装 TortoiseGit 主程序
从官网下载 TortoiseGit 安装包,同样注意位数要和系统匹配。双击安装,走到选择 SSH client 的环节时,这里是个容易踩坑的地方。
安装向导会给出两个选项:TortoisePlink(基于 PuTTY)和 OpenSSH(Git 自带的)。界面上可能默认选的是 TortoisePlink,我的建议是改选 OpenSSH。原因后面细说,一句话概括:OpenSSH 生成的密钥格式和码云、GitHub 等平台兼容性更好,操作少一个转换步骤,省心。
组件部分建议全选,包括右键菜单、图标覆盖、文件关联这些。图标覆盖很有用,它能让你从文件图标上直接看出哪些文件改过、哪些没改动。装完之后,如果提示重启或注销,照做就好,偷懒不重启大概率会遇到右键菜单不出现的情况。
装完后确认的方式很简单:在任意文件夹空白处点右键,菜单里出现“Git Clone...”和“TortoiseGit”,就说明外壳装好了。这时候你在仓库文件夹里能看到绿色的对勾图标,就是 TotoiseGit 生效的标志。
2.3 第三步:中文语言包与右键菜单汉化
小乌龟默认是英文界面,对英文不好的同学不太友好,好在官方有语言包。
下载语言包时有个铁律:语言包版本号必须和 TortoiseGit 主程序版本号完全一致。比如主程序装的是 2.15.0,语言包也必须是 2.15.0,差一个小版本都可能失效。装完后打开任意文件夹,右键 → TortoiseGit → Settings,在 General 标签页里找到 Language 下拉菜单,选“中文(简体)”,然后点应用。如果界面没有立即变化,注销或者重启资源管理器就行。
汉化之后,右键菜单里那些英文就全变中文了,“Git Commit”变成“Git 提交”,“Git Push”变成“Git 推送”。看懂中文菜单之后,再去对照英文术语,理解 Git 概念会容易不少。
有一点要提醒:语言包只是界面翻译,不改变操作逻辑。你在中文版里看到的“暂存更改”,对应的英文是 Stash,跟平时说的“暂存区(index)”完全是两个概念,后面讲分支切换的时候我会特别强调这个区别。
3. 让码云认账的 SSH 配置:一劳永逸的连接方案
3.1 HTTPS 与 SSH 之争:我为什么劝你用 SSH
连接码云仓库有两种地址,HTTPS 和 SSH。码云仓库首页的“克隆/下载”按钮旁边,会给你两个链接:
- HTTPS:https://gitee.com/用户名/仓库名.git
- SSH:git@gitee.com:用户名/仓库名.git
用 HTTPS 克隆项目,每次 push 都要输入码云的用户名和密码,虽然可以勾选“记住密码”,但依然有输入成本。我看过太多人在推送失败后反复输密码,最后发现是码云密码改了或者远端地址输错的案例。
用 SSH 就完全不一样了。SSH 是一对密钥:一把公钥交给码云,一把私钥留在电脑里。配对成功之后,克隆、拉取、推送全部免密,而且加密通道比普通 HTTPS 更安全。配置一次,之后这台电脑访问码云就再也不用输密码,可以说是一劳永逸。
| 对比项 | HTTPS | SSH |
|---|---|---|
| 首次配置 | 不需要配置,克隆时输账号密码 | 需要生成密钥、后台添加公钥 |
| 日常推送 | 每次输密码(或系统记住) | 配置后全程免密 |
| 安全性 | 账号密码有泄露风险 | 密钥对机制,私钥不出本机 |
| 平台通用 | 各平台地址格式不同 | git@ 开头的地址格式各大平台统一 |
所以我的建议很直接:做码云项目,老实配 SSH,前面多花三分钟,后面省三年事。
3.2 生成 SSH 密钥对的操作细节
生成密钥的方式取决于你安装小乌龟时选的 SSH client。如果按我前面说的选了 OpenSSH,直接用 Git Bash 来生成,打开 Git Bash 输入:
ssh-keygen -t rsa -b 4096 -C "你的邮箱"然后一路回车。它会问你保存路径,默认在C:\Users\你的用户名\.ssh\id_rsa,直接回车就行。后面再问要不要设置 passphrase,可以留空也可以设一个密码保护私钥。留空的话以后免密最彻底,但意味着拿到你私钥的人也能免密用你的身份,自己权衡。
生成完成后,用记事本打开C:\Users\你的用户名\.ssh\id_rsa.pub,把里面那串以ssh-rsa开头的内容全部复制。.pub后缀是公钥,可以给别人看;不带后缀的id_rsa是私钥,打死都不能给任何人。
注意:公钥是贴在码云后台的,私钥永远留在自己电脑里。任何一个要你私钥、要你把 id_rsa 文件发给他的“客服”“同事”,都是骗子。
3.3 把公钥交给码云后台
登录码云网站,点右上角头像 → 设置 → 安全设置 → SSH 公钥。页面里有个“公钥”输入框和“标题”输入框,把刚才复制的公钥粘贴进去,标题随便起,建议写成设备名,比如“办公室电脑”或者“我的笔记本”。这样以后电脑多了,后台看起来也清楚。
添加成功后,码云会要求你验证一次。回到 Git Bash 执行:
ssh -T git@gitee.com如果是第一次连接,会提示确认主机指纹,输入 yes 回车。看到 “Hi 用户名! You've successfully authenticated, but Gitee does not provide shell access.” 这样的回显,就说明码云已经认账了。
这一步是很多人卡住的地方。如果提示 Permission denied,大概率是公钥没粘贴完整,或者粘贴的时候多了空格、换行。重新复制一遍,检查首尾,再试一次。
3.4 客户端密钥指向与常见连接报错
密钥生成好了,码云后台也认识了,最后一步是在 TortoiseGit 里确认客户端能找到这把私钥。
打开仓库或任意文件夹,右键 → TortoiseGit → Settings → Git → Remote。这里会显示远程仓库列表。选中 origin 远端,下面有“Putty Key”和“URL”等字段。如果安装时选的是 OpenSSH,TortoiseGit 一般会自动读取默认位置~/.ssh/id_rsa,直接留空即可。如果密钥放在了自定义位置,这里需要手动指定私钥路径。
日常使用中,我遇到过几类连接报错,这里总结一下:
Permission denied (publickey):码云后台没有匹配的公钥。去后台检查有没有粘贴对、粘贴全。Could not open a connection to your authentication agent:ssh-agent 没启动。在 Git Bash 里执行eval $(ssh-agent) && ssh-add ~/.ssh/id_rsa。Host key verification failed:本地 known_hosts 缓存问题。执行ssh-keygen -R gitee.com清掉旧记录再连一次。- 克隆时报错“git did not exit cleanly”:多半是 PATH 配置有问题,回到 Git for Windows 的安装选项检查。
这些坑我几乎都踩过一遍,大部分是密钥或路径问题,按着顺序排查,都能解决。
4. 日常操作四件套:克隆、提交、推送、拉取
4.1 克隆码云仓库到本地
连接打通之后,第一步就是把码云上的仓库复制到本地,这个过程叫克隆(Clone)。
在码云仓库主页点“克隆/下载”,复制 SSH 地址。然后在本地想要放置项目的目录里,比如D:\projects,在空白处点右键,选择“Git Clone...”。弹窗里把 SSH 地址粘贴到 URL 输入框,Directory 一栏选择要保存的文件夹名称,点击 OK。
小乌龟会弹出一个黑色的进度窗口,显示类似Receiving objects的下载过程。等它跑完,窗口自动关闭,在你选择的目录下就能看到一个带绿色对勾图标的项目文件夹。绿色对勾表示本地文件和远程仓库同步,没有改动。
克隆时还有一个小细节:如果仓库里有子模块(submodule),需要在克隆弹窗勾选“Recursive”,否则子模块目录会是空的。这个看项目需求,很多人一时用不到,但知道了就能少踩一次坑。
4.2 提交:小乌龟最核心的动作
你改动了项目里的代码文件,会发现文件夹图标从绿色对勾变成红色感叹号,这就是 TortoiseGit 的图标覆盖在提示你:有改动。
在项目文件夹里点右键,选择“Git 提交”,会打开提交窗口。窗口分成三块:上半部分是提交信息输入框,中间是文件变更列表,下方是所选文件的差异预览。
提交信息那栏要认真写,我见过太多人提交信息写“1”“2”“3”这种无意义内容,过段时间回头看日志,根本不知道当时改了什么。写提交信息不需要长篇大论,但至少要说清楚这次改动做什么。比如“修复登录接口返回 500 错误”就比“fix”有价值得多。
文件列表里每一项前面有复选框,默认全选。如果有几个文件不想一起提交,可以取消勾选。双击文件,下面会显示这个文件具体改动了哪几行,绿色是新增、红色是删除,一目了然。确认无误后点“提交”按钮,这次改动就记录到本地仓库了。
请一定记住,提交是本地操作,不会上传到码云。只有 push 之后,远端仓库才会有这条提交记录。很多新手以为 commit 了码云就有备份了,然后电脑硬盘一坏,哭都来不及。
4.3 推送:把本地提交送上码云
提交完成后,本地的版本库里已经有新记录了,接下来要把这些记录推送到码云。在项目文件夹里右键,选择“Git 推送”,弹窗里选好远端(一般是 origin)和分支(一般是 master 或 main),点确定。
推送窗口会滚动显示进度,最后出现类似这样的输出:
To git@gitee.com:用户名/仓库名.git abc1234..def5678 main -> main这就说明推送成功了,打开码云网页刷新一下,就能看到提交记录和最新代码。
推送最常见的失败场景是:“远端有新提交,被拒绝了”。原因是别人(或者你在另一台电脑上)先推了代码,码云仓库的进度领先于你。这时候正确的做法是先拉取(Pull)远端变更,再推送,而不是强推。强推会把远端新的提交覆盖掉,团队协作时属于重大事故,按钮在哪、什么时候可以用,后面回滚部分会详细说。
4.4 拉取与忽略清单:保持同步的日常
拉取是把码云上的最新改动下载到本地。项目文件夹右键选择“Git 拉取”或者“Git Pull”,小乌龟会弹窗让你选拉取方式和分支。
先解释两个概念:Fetch 和 Pull。Fetch 只是把远端的最新提交下载到一个叫“远程跟踪分支”的临时区域,不改变你的工作区代码;Pull 会在 Fetch 之后把远端分支合并到当前分支,工作区的代码会随之更新。小乌龟的“Git Pull”默认帮你完成 Fetch + Merge 两步,日常用 Pull 就够了。
Pull 弹窗里有个“合并类型”选项:一个是“Merge”(合并提交),一个是“Rebase”(变基)。新手建议无脑选 Merge,原理简单:把远端代码和本地代码合并成一个新提交,历史会有分叉汇合点,但安全。Rebase 能保持提交历史整洁线性,但对冲突处理要求高,用不好会搞乱历史。我目前的习惯是:个人项目用 Rebase 清爽一些,团队大分支用 Merge 稳妥,你按自己情况来。
再说 .gitignore。克隆一个项目后,工作区里往往有node_modules、bin、out这种自动生成、不该进仓库的目录。如果不忽略它们,每次提交都会提示一堆无关文件,特别烦。小乌龟的处理方式很贴心:在项目里有这些目录或文件上右键 → TortoiseGit → “添加忽略清单”,选择“忽略此文件”或“忽略此目录”,小乌龟会自动生成.gitignore并更新,然后提示你提交它。
码云网页端创建仓库时也有 .gitignore 模板选择,新建仓库时选好模板可以省不少事。但项目跑起来了才想起这个,也不用慌,本地小乌龟补上就行。
5. 分支的创建、切换与合并:多线开发的核心场景
5.1 为什么要为功能开分支
提到 Git 就绕不开分支。一个项目的主干叫master或者main,它应该是稳定的,能随时拿来编译、发布。如果你在上面直接改来改去,改挂了就全盘崩溃。分支的用途就是在主干旁边拉一条“试验线”,你在里面开发新功能、大胆重构,改坏了不心疼,改好了合回主干。
分支的本质其实非常朴素:它就是一个会移动的指针,指向某一次提交。你创建分支,就是在当前提交位置放了一个新指针;切换分支,就是把当前指针挪过去。理解这一点,后面遇到“切换分支后文件怎么变了”这种疑问,就不会慌了。
小乌龟里创建分支有两种入口:一是右键 → TortoiseGit → 创建分支;二是在 Show Log 日志窗口里右键某个提交 → 创建分支。日常推荐用第一种,更直观。
5.2 创建分支与切换分支的实操
在项目文件夹里右键 → TortoiseGit → 创建分支,弹窗里填写分支名,比如feature-login。下面有一个“基于”选项,默认是 HEAD(当前所在位置),你也可以选某个提交记录、标签来当新分支起点。最下方有个复选框“切换到新分支”,如果勾上,创建完成后会自动切过去;不勾的话,只是建了分支,你还在原来的分支上。
切换分支的操作是右键 → Switch/Checkout(中文版叫“切换/检出”)。弹窗里会列出所有本地和远端分支,选中一个点确定即可。切换本质是把工作区的文件换成分支对应的快照。
热词里有“tortoisegit 切换分支”这个搜索,说明不少人在这里卡住过。切换分支其实没有任何神秘之处,选分支,确认,文件就变了。你之前在这个分支上看到的文件,可能在另一个分支上根本不存在,这是正常现象,因为每个分支就是独立的历史线。
5.3 切换分支的那些坑:未提交改动与 Stash
切换分支最大的坑,是带着未提交的改动硬切。
假设你在 A 分支改了文件,还没提交,直接切到 B 分支。如果 B 分支里这个文件已经被别人改过了,或者 B 分支压根没这个文件,Git 就会陷入两难:你工作区的改动往哪儿放?TortoiseGit 通常会弹窗警告,提示某些本地改动会被切换覆盖。
这时候有三个选择:取消切换、保留改动继续、丢弃改动。新手最怕的就是手一抖选了“丢弃”,一上午的修改直接清零。所以我给自己定了个规矩:切换分支前,先把当前改动处理干净。
处理方式有两个分支路。最简单的是提交掉,写个提交信息,下次想改再改;另一个是暂存当前进度,用的就是 Stash 功能。右键 → TortoiseGit → “暂存更改”并填写消息,小乌龟会把你的改动打包存到一边,工作区恢复干净,然后你可以安心切分支。想恢复这些改动时,再右键 → TortoiseGit → “暂存更改” → “弹出/恢复”即可。
注意这里有个术语陷阱:中文版把 Stash 翻译成“暂存更改”,很容易和文件列表里的“暂存区(Staging Area)”弄混。暂存区是git add之后存放文件快照的地方,而 Stash 是临时存放、稍后恢复的一套机制。你只要记住:Stash 操作的对象是“当前所有未提交改动”,跟add没关系。
5.4 合并分支与查看分支图
改完了、测好了,要把功能分支合回主干。先切到目标分支,比如切到main,然后右键 → 合并,选择要合并进来的分支,比如feature-login,点确定。
合并的结果有两种情况。如果功能分支是从主干直接拉出去的,期间主干没有任何新提交,Git 会直接做“快进合并”(Fast-forward),把主干的指针直接跳到功能分支的提交位置,不会产生新的合并提交。如果主干在合并前又有了新提交,Git 会把两边的改动拉在一起生成一个新的“合并提交”,这时就需要你写一条合并信息。
合并完成后,按照前面讲过的流程推送到码云,分支就合完了。
小乌龟的日志窗口(Show Log)是我最常用的工具。右键 → TortoiseGit → 显示日志,窗口上半部分是所有提交记录列表,左侧会根据分支归属显示不同的颜色节点,能清楚看出哪条线是主干、哪条线是分支,什么时候分的叉、什么时候合的流。这个图对理解 Git 内部逻辑帮助极大,比背一百条命令都有用。
6. cherry-pick、冲突解决与代码回滚:进阶应急三板斧
6.1 cherry-pick:把某个提交单独搬过来
合并是把整个分支搬过来,那如果我只想要某个分支上的某一次提交,怎么办?这就要用 cherry-pick,翻译过来就是“摘樱桃”。
经典场景是这样的:线上版本出了 bug,你在main分支上紧急修复了一行,提交记录是commit 8f3a2c1。然后你发现dev开发分支其实也继承了这个问题,但dev上还有很多你不想带过来的半成品功能。这时候你不想把main整个合并过去,只想把这个修复搬过去,cherry-pick 就是干这个的。
小乌龟的操作很简单:右键 → 显示日志,在提交列表里找到目标提交,右键 → Cherry Pick。小乌龟会把这个提交的改动应用到你当前所在的分支,弹窗会让你确认是否生成一个新的提交。整个过程不需要切分支,你在dev上直接就能摘main的提交。
有一点必须知道:cherry-pick 之后产生的新提交,内容一样,但提交哈希值(SHA)是全新的,它和原来的提交没有继承关系。所以不要指望通过某个命令去追溯“这个提交是从哪摘来的”,历史记录里看不出来的。还有,如果摘的提交涉及的文件在当前分支已经被改动过,也可能产生冲突,处理方式和正常冲突一样。
6.2 冲突现场:合并出错时怎么办
冲突是 Git 使用中绕不过去的坎,但真没那么可怕。所谓冲突,就是两边的代码都改了同一个文件的同一个区域,Git 不知道以谁为准,只能把人喊过来手动裁决。
冲突发生时,文件的图标会变成黄色感叹号。打开冲突文件,你会看到类似这样的内容:
<<<<<<< HEAD 你当前分支的代码 ======= 对方分支的代码 >>>>>>> feature-login<<<<<<< HEAD和=======之间是当前分支的内容,=======到>>>>>>>之间是对方分支的内容。你需要根据业务逻辑,把这段区域改成你想要的样子,然后把这些标记行全部删掉。
小乌龟对处理冲突做了不少人性化设计。在冲突文件上右键 → “编辑冲突”,会打开一个冲突编辑器,左边是当前版本、右边是对方版本、中间是合并结果。你可以手动选择“使用我的”或“使用他们的”,也可以一行一行手动调整。改完之后,右键文件 → “解决冲突”,图标变回绿色,然后正常提交。
如果项目很复杂,推荐配置第三方合并工具。设置路径在:TortoiseGit → Settings → 差异查看器 → 合并工具,可以选 Beyond Compare、KDiff3、WinMerge 这些。可视化的三栏对比比小乌龟自带的编辑器好用很多,尤其是大段代码冲突时,效率完全不是一个级别。
提示:冲突不是错误,也不是谁写崩了,它只是 Git 在告诉你“这个位置两边都动了,需要你决策”。带着这个心态去处理冲突,你会淡定很多。
6.3 代码回滚的三板斧:Revert、Reset 与 Force Push
人总会有手滑的时候,提交了不该提交的代码,或者想回到某个历史版本。小乌龟给了几套回滚方案,用错场景真的会出事故,我把它们的区别捋清楚。
第一种是Revert(还原)。在显示日志窗口里选中一个提交,右键 → 还原,小乌龟会生成一个新提交,这个提交把你选中的那次改动全部反着做一遍,相当于“撤销那次改动”。关键点:Revert 不会删除历史,只是追加一个反向提交,历史线是完整的、安全的。已经推送到码云的提交,推荐用 Revert 回退,大家拉取后自动同步,不会出乱子。
第二种是Reset(重置)。右键 → TortoiseGit → 重置到...,弹窗会让你选择重置模式和目标版本。重置模式有三个:
| 模式 | 作用 | 风险 |
|---|---|---|
| Soft | 分支指针回退,但把改动留在暂存区 | 低,改动可找回 |
| Mixed | 分支指针回退,改动留在工作区 | 低,改动可找回 |
| Hard | 分支指针回退,改动全部丢弃 | 高,不可找回 |
Reset 的威力在于直接把分支指针往回拨,但它会改变本地提交历史。如果这些提交已经推送到码云了,你 reset 之后本地和远端就不一致,想要让远端也变回去,就得强推。
强推就是 Push 弹窗里勾上“强制推送”(Force),或者选择 force with lease。它会把码云上的历史覆盖成你本地的状态。团队项目里,强推等于把别人的提交历史全部抹掉,这是灾难级别的操作。我的铁律是:强推之前,必须和组里所有人打招呼,并且做好全量备份。
实际工作中,我强烈建议能用 Revert 就别用 Reset Hard,用 Reset Hard 之前先备份好整个项目文件夹。回滚操作十次里有九次可以用 Revert 平稳解决,剩下那一次再用 Reset,也别慌,Git 没那么容易把数据彻底毁掉的。
6.4 码云网页端与本地小乌龟的分工
既然主打码云,最后说说网页端和本地客户端的配合。
小乌龟擅长的是本地仓库的细粒度操作:改代码、看 diff、做分支合并、处理冲突,这些在本地用小乌龟效率极高。码云网页端则承担协作和发布:发起合并请求(Pull Request)、代码评审、提交 Issue、管理 Wiki、部署 Pages 页面。
一套比较顺的工作流是:在网页端创建 Issue → 本地基于main拉出功能分支开发 → 提交推送 → 到网页端发起 Pull Request,邀请同事评审 → 评审通过后网页端合并到主干 → 本地切回main,用小乌龟拉取更新。这样团队的每个动作都有迹可循,本地的地盘归小乌龟管,远端的协作归码云管。
码云有些私有仓库免费、访问速度快,小乌龟把本地这摊事做得足够安静可靠。两者一配合,个人项目的代码备份、团队项目的协作流程,都能在一套工具链里跑顺。
从当前的状态看,我自己日常八成操作都交给了小乌龟,真要说有什么秘诀,其实就一条:把小乌龟当成你和 Git 之间的翻译官,遇到不懂的术语就去 Show Log 和提交窗口里看实际效果,看多了自然就通了。如果你以前用的是 SVN 那套右键交互,小乌龟会让你有种回老家的亲切感。等将来真要写脚本、跑自动化流水线了,再回来补命令行也来得及,那时候你会发现,图形界面帮你建立的这套心智模型,学命令行反而会快得多。