
我前阵子帮一个刚入职的同事配环境他电脑上 Git 装好了、Gitee 账号也注册了结果在本地把代码写完愣是不知道怎么推到远程仓库去。我看他对着git push的报错一脸懵就意识到一个问题网上 Git 教程太多但大部分都默认你会“本地关联远程仓库”这一步可恰恰是这一步把很多新手卡在了门外。本地关联远程仓库说白了一句话就能概括让你电脑上的 Git 仓库和 Gitee或者 GitHub、GitLab上的远程仓库建立一对一的关系。关系建立之后你才能把本地代码推上去或者把远程代码拉下来。这篇文章我打算把这套流程从头到尾捋一遍从 Git 安装、仓库初始化、SSH 密钥配置到第一次push成功再把日常高频报错和排查思路一并整理出来适合刚接触 Git、以及那些被fatal报错折磨过的同学参考。1. 动手前的准备环境、账号与仓库的创建逻辑1.1 安装 Git 并验证环境关联远程仓库的第一步是先确保你本地有一个能用的 Git 环境。Windows 下安装 Git 其实没什么难度去官网下载安装包一路 Next 就行但有几个坑需要提前避一下。安装过程中有两个选项要特别注意一是“调整 PATH 环境变量”建议选Git from the command line and also from 3rd-party software这样你在 cmd 和 PowerShell 里都能直接用git命令不然装完打开终端还是提示“无法识别”二是行结束符转换选默认的 “Checkout Windows-style, commit Unix-style line endings” 就行这个选项会自动帮你处理 Windows 和 Linux 换行符不一致的问题虽然偶尔会带来一点小麻烦但对新手是最稳妥的。装完之后打开 Git Bash或者 Windows Terminal、PowerShell输入git --version能输出版本号就说明装好了。比如git version 2.45.0.windows.1这样的输出。还没装的话这里多提一句网上流传的各种 git 镜像下载站点能不用尽量别用直接去官网下载就好。官网下载速度慢的话可以找国内正规软件源注意核对文件信息和版本号别装到魔改版。1.2 配置用户信息第一次提交前必须做的事很多新手没搞明白一件事git config配置的user.name和user.email是干什么用的其实它们就是你的“签名”每次提交代码时Git 会把这两个信息写进提交记录里。别人看你的提交历史时看到的是这个签名而不是你在 Gitee 上叫什么名字。配置命令很简单git config --global user.name 你的名字 git config --global user.email 你的邮箱加--global参数的意思是“全局生效”也就是这台电脑上所有 Git 仓库都用这个签名。如果某个项目想用不同身份可以在那个项目目录下不加--global重新配置一份这样项目级配置会覆盖全局配置。有个细节值得说一下填写的邮箱不一定要和 Gitee 注册邮箱一致但如果想让 Gitee 正确识别你的提交并关联到你的账号上最好保持一致。不然你会发现自己在 Gitee 上提交了一大堆代码个人主页的贡献图却一片空白那是因为提交邮箱对不上号。1.3 先建远程仓库公开还是私有README 要不要勾选本地关联远程仓库之前你得先在平台上创建一个空的远程仓库。以 Gitee 为例点“新建仓库”填仓库名称、选择公开或者私有然后你会看到一堆初始化选项比如“初始化仓库”、“选择 .gitignore 模板”、“选择开源许可证”等。这里有一个非常关键的决策如果你打算用纯命令行的方式走完“本地 - 远程”的流程建议创建仓库时不要勾选任何初始化选项直接创建空仓库。为什么因为如果你勾选了“初始化仓库”远程仓库会自动生成一个 README 文件有时候还有 .gitignore 和 LICENSE。等你把本地代码关联上去以后第一次push时Git 会发现本地和远程的提交历史完全没有交集然后给你报一个refusing to merge unrelated histories的错误这个报错后面会专门讲。当然不勾选初始化选项只是“对新手最友好”的做法不是唯一做法。如果你已经在远程仓库勾选了 README也是有办法解决的只不过要多走几步合并逻辑。公开还是私有这个选择看个人需求。公司项目肯定是私有个人学习笔记、练手项目可以选公开方便随时分享给别人看。我自己的习惯是学习练手的项目选私有万一代码里有乱七八糟的密钥或临时文件不至于被全世界看到。1.4 HTTPS 还是 SSH先想清楚再用本地仓库关联远程仓库本质上就是告诉 Git“我要把本地这个仓库跟远程那个 URL 绑定。”Git 支持多种远程协议最常见的是 HTTPS 和 SSH。这两个怎么选我直接给结论个人电脑建议用 SSH原因有两点配置好密钥之后push/pull都不需要反复输密码体验非常顺畅。SSH 密钥比密码更难被暴力破解安全性更好。HTTPS 也不是一无是处。在公司电脑上如果你没有配置 SSH 密钥的权限或者公司统一用 HTTP 代理访问代码仓库那么 HTTPS 就是你的选择。HTTPS 方式第一次推送时会让你输入 Gitee 的用户名和密码现在很多平台要求用私人令牌 token 代替密码然后你可以通过 Git 的凭据管理器缓存起来后面也不用每次输入。不过呢我个人还是建议你在自己的电脑上花十分钟把 SSH 密钥配好一次性投入长期受益。具体怎么配我放到第 3 章详细讲。2. 本地仓库初始化核心流程与底层逻辑2.1 git init 与 git clone两个起点两条路准备干活之前先理清一个基本逻辑你本地仓库和远程仓库建立关联通常有两种起点。一种是“从零开始”本地新建一个目录写了一堆代码这时候用git init把它变成一个 Git 仓库再去关联远程仓库。另一种是“从远程抄作业”远程已经有一个仓库比如同事建的你想把它复制到本地直接用git clone 远程仓库地址一条命令搞定。git clone的本质是在本地新建目录、把远程内容拉下来、自动关联远程仓库并把默认分支设置好一步到位。搞清楚这两种起点的区别你就知道什么时候该用哪个了。强烈建议新手的第一个练习项目走“从零开始”这条路因为git initgit remote addgit push这个过程能让你把 Git 的核心概念工作区、暂存区、版本库、远程仓库在脑子里串起来。直接git clone虽然方便但你少了一次理解“关联远程仓库”的机会。2.2 三个区与一套流转先理解再动手讲git add和git commit之前得先认识 Git 的三个区。这可能是 Git 学习中最容易被忽略、但理解之后收益极大的概念。工作区你电脑上能看到的那些文件和目录就是工作区。你平时写代码、改文件改的都是工作区里的东西。暂存区一个看不见的中间区域在.git/index文件里用来临时存放你git add过的文件。它相当于一个“购物车”你先挑要买的东西放进购物车最后统一结账。版本库.git目录存储了所有提交历史和版本信息。git commit就是“结账”的动作把暂存区的内容打包成一个不可变的快照永久保存到版本库中。很多新手搞不懂“我明明改了文件为什么git status看不到或者git commit提交了个空”就是因为文件还躺工作区没有git add进暂存区。记住一句话Git 只跟踪通过git add显式添加过的文件但每次修改之后还得再 add 一次因为 Git 的快照机制是按文件内容变化记录不是按文件路径记录。一次常规的本地提交流程是# 查看当前仓库状态 git status # 将指定文件添加到暂存区 git add index.html # 或者一次性添加所有改动过的文件 git add . # 提交到版本库-m 后面是提交说明 git commit -m feat: 新增首页日常开发中我个人的习惯是尽量用git status先确认改动范围再用git add精准添加而不是无脑git add .。因为git add .会把你不小心生成的临时文件、日志文件、配置里的敏感信息也加进去后面处理起来很麻烦。保险起见项目里一定要配置.gitignore文件把node_modules/、target/、*.log、.idea/这类不该进版本库的文件提前排除掉。2.3 建立联系git remote add 的完整解析本地仓库有了提交历史之后就该和远程仓库“建立联系”了。这一步用到的命令是git remote add origin 远程仓库地址拆开讲一下这条命令里的三个信息remoteGit 中“远程仓库”的核心命令。add表示添加一个远程仓库的引用。origin给这个远程仓库起的名字它是一个别名。你可以理解为给手机通讯录里的联系人存了一个备注名之后你微信发消息git push就不用背诵对方手机号远程 URL了直接喊备注名就行。origin只是 Git 社区约定俗成的默认名字理论上你起什么名都行但除非你有特殊原因不然最好跟随大众就叫origin这样团队协作时沟通成本最低。远程仓库地址怎么获取在 Gitee 仓库首页找到“克隆/下载”按钮它会弹出两个地址HTTPS 地址形如https://gitee.com/用户名/仓库名.git和 SSH 地址形如gitgitee.com:用户名/仓库名.git。如果你是按照 1.4 的建议选了 SSH 方式这里就应该复制 SSH 地址然后执行git remote add origin gitgitee.com:用户名/仓库名.git添加完以后可以用下面的命令查看关联结果# 查看所有远程仓库的别名和地址 git remote -v正常情况下会显示出两行一行是origin对应的 fetch拉取地址一行是 push推送地址。看到这两行就说明你本地和远程的关联关系已经建立成功了。2.4 第一次推送git push -u 到底在做什么关联建立之后下一步就是推送代码。我第一次用git push时被网上的各种说法搞得很混乱有人说加-u有人说不加今天把这个问题彻底说清楚。在远程仓库是空仓库没有 README、没有 LICENSE、没有 .gitignore的前提下第一次推送用的命令是git push -u origin master其中-u参数是--set-upstream的缩写意思是“把本地当前分支和远程的 master 分支关联起来并设置上游分支”。什么是上游分支upstream这是一个贯穿 Git 日常使用的重要概念。简单解释设置完之后git push和git pull就有了默认的目标你再也不用每次打全git push origin master直接敲git push就能往对应的远程分支推送。这就像你给家人设置了一个“默认联系人”发消息的时候直接说“发消息”就行不用每次都指定发给谁。如果你的远程仓库默认分支不是master而是main很多新仓库现在默认用 main那第一次推送就是git push -u origin main这里有个细节Git 2.28 版本之后支持通过git init -b main指定初始分支名但很多老项目还是用master。所以你在执行推送之前最好先执行git branch看看自己当前在哪个分支别稀里糊涂地把master分支推到一个默认分支叫main的远程仓库那样会创建出两个看似无关的默认分支后面合并起来会多几步操作。2.5 远程仓库不是空仓库怎么办unrelated histories 的解决方案前面提到如果你在 Gitee 创建仓库时勾选了初始化 README那么远程仓库就不是空的本地和远程各有一条独立的提交历史。这时候git push -u origin master大概率会报错提示! [rejected] master - master (fetch first) error: failed to push some refs to ... hint: Updates were rejected because the remote contains work that you do not have locally.这其实是 Git 的保护机制在提醒你“远程仓库有一些本地没有的提交你不能直接覆盖它。”解决办法是先拉取远程内容并合并。如果你是第一次关联远程只有一条 README 的初始化提交最简单的处理方案是# 拉取远程内容并允许合并无关历史 git pull origin master --allow-unrelated-histories # 合并完成后再推送 git push -u origin master--allow-unrelated-histories这个参数翻译一下就是“允许合并两个没有共同祖先的提交历史”。因为本地仓库和远程仓库是从零分开创建的两者没有共同的“祖先提交”Git 默认拒绝合并。加上这个参数后Git 会把两边内容强行拉到一起可能会产生冲突冲突解决方式和普通合并一样。如果是你个人的学习项目远程那条 README 没什么价值也可以直接用git push -u origin master --force强制推送本地历史直接覆盖远程。但注意--force慎用团队协作时千万不要这么干否则会把同事的提交冲掉。我自己的原则是只在个人项目、确定远程内容不要了的情况下才用 force。3. SSH 免密配置为什么推荐它以及怎么配置3.1 为什么用 SSH 协议更舒服第 1 章我推荐了 SSH 方案这里展开讲讲为什么。使用 HTTPS 协议关联远程仓库时你每次执行git push或者git pullGit 都需要向远程服务器证明“我是谁”。早期版本要输账号密码后来 Git 官方做了凭据管理器会帮你缓存密码第一次输入后后面不用再输。但这里有个梗Gitee 的 HTTPS 推送密码不是你的登录密码而是私人令牌Personal Access Token。很多新手第一次用 HTTPS 推送输了自己的登录密码结果一直报Authentication failed怎么试都不对。相比之下SSH 协议走的是非对称加密的密钥认证。你本地生成一对密钥公钥 私钥私钥自己保管公钥放到 Gitee 的 SSH 公钥管理页面。建立连接时远端用公钥加密一个随机挑战本地用私钥解密两边对上号认证通过全程不用输密码。好处很明显配置一次一劳永逸。后面push、pull、clone全都静默通过非常符合“Git 工作流应该顺畅、不打断心流”的原则。3.2 密钥生成与配置的完整步骤在 Git Bash 中执行以下命令生成 SSH 密钥ssh-keygen -t rsa -b 4096 -C 你的邮箱解释一下参数-t rsa指定密钥类型为 RSA这是目前兼容性最好的类型。-b 4096指定密钥长度为 4096 位越长越安全。-C 你的邮箱添加注释方便你以后区分这把钥匙是干嘛用的。执行后Git Bash 会让你选择密钥保存位置默认是~/.ssh/id_rsa直接回车即可。接着会提示你设置 passphrase密码短语这是给私钥再加一道锁。我个人的建议是个人电脑可以不设图省事公司电脑建议设一个万一设备丢失别人拿到私钥也破解不了。不过设了的话每次连接 SSH 都要输一遍体验稍差看个人取舍。生成完成后查看公钥内容cat ~/.ssh/id_rsa.pub输出以ssh-rsa开头的一大串字符就是你的公钥。把它完整复制下来然后打开 Gitee - 设置 - SSH 公钥粘贴到公钥框里标题随意确认保存。最后在 Git Bash 里验证一下ssh -T gitgitee.com如果看到Hi 用户名! Youve successfully authenticated, but GIT does not provide shell access.说明配置成功。如果提示Permission denied (publickey)那就要检查密钥是否放对位置、公钥是否复制完整。3.3 known_hosts第一次连接时的那个提示要不要管第一次用 SSH 连接 Gitee 时Git Bash 会弹出一个提示The authenticity of host gitee.com (xxx.xxx.xxx.xxx) cant be established. ED25519 key fingerprint is SHA256:... Are you sure you want to continue connecting (yes/no)?很多新手看到英文就慌不知道怎么回事。其实这是 SSH 在告诉你“这个服务器我没见过这是它的指纹你确定要连吗”你输入yes回车即可。它的作用是防止中间人攻击——记住这台服务器的指纹下次再连接时会自动比对如果服务器换了SSH 会警告你。输入yes之后Gitee 的指纹会被记录到~/.ssh/known_hosts文件里以后再连接就不会再问你了。这个机制平时不用管知道它存在就行。3.4 出了内网/公司网络SSH 连不上的排查思路在正常网络环境下SSH 配置好基本不会出问题。但在某些公司网络环境或特定网络策略下会遇到连接超时或者Connection refused。这时候可以先试 HTTPS 方式作为应急方案因为 HTTPS 走 443 端口通常会被防火墙放行。如果确定要用 SSH可考虑更换 SSH 端口测试ssh -T -p 443 gitgitee.com另外还有一个排查点如果你之前配置过 Git 的代理git config --global http.proxy或者https.proxy可能会导致 SSH 连接异常。查一下git config --global --list看到 proxy 相关配置且不需要代理时用下面的命令移除git config --global --unset http.proxy git config --global --unset https.proxy4. 日常高频操作从提交到回滚的命令矩阵4.1 提交信息写错了git commit --amend 怎么用热词里有git commit --amend这是很多人迟早会用到的命令。它的作用是“篡改最近一次提交”但要注意它有一个容易踩的坑。假设你刚执行了git commit -m fix: 修复登录bug结果发现提交信息写错了想把“登录bug”改成“注册bug”可以这么做git commit --amend -m fix: 修复注册bug执行完之后最近的提交信息就被修改了提交的哈希值也会变。这就是amend的第一个用途修改最近一次提交的 message。它还有一个用途你把文件漏提交了不想为了一个漏掉的文件再新建一次提交可以这样git add 漏掉的文件 git commit --amend --no-edit--no-edit的意思是“不修改提交信息直接合并进上一次提交”。这样操作后刚才漏掉的文件就被“补”进上一次提交了提交历史看起来干干净净。用法上最大的坑amend是在“改写历史”它会生成一个新的提交哈希。如果这个提交已经推送到了远程仓库并且别人已经基于它做了改动那么你 amend 之后本地提交和远程提交就走岔了直接 push 会被拒绝。这时候你只能git push --force或更安全的--force-with-lease覆盖远程但这会对协作者造成很大困扰。所以我的原则是提交没有 push 到远程之前amend 随便用只要 push 过就别 amend 了老老实实新增一个提交写清楚“修复上一个提交遗漏的问题”就行。4.2 改到一半要切分支git stash 暂存大法日常开发里经常遇到这种情况你在dev分支正改着a.js改到一半突然线上出 Bug需要立刻切到master分支修一个紧急问题。可a.js还没改完直接切分支Git 会阻止你——因为未提交的改动可能会和分支切换产生冲突。这时候用git stash# 把当前工作区的改动临时保存起来工作区恢复干净 git stash # 切换到别的分支干活 git checkout master # 干完活切回来 git checkout dev # 恢复之前暂存的改动 git stash popgit stash相当于把你的改动放进一个“抽屉”里工作区回到上次提交时的干净状态。git stash pop则是把抽屉里的改动取出来放回工作区。如果抽屉里存了好几份可以用git stash list查看用git stash apply stash{1}恢复指定的某一份。区别在于pop是“取出并删除记录”apply是“取出但保留记录”。这个命令我几乎每周都会用到熟练之后切分支、改紧急 Bug、恢复原状的过程可以控制在一分钟以内。4.3 拉取远程更新git pull 的分支指定问题当远程仓库有同事推了新提交你本地需要同步时最直接的命令是git pull如果你之前执行过git push -u origin master本地分支已经关联了上游那么git pull会默认从origin/master拉取内容并自动合并到当前分支。但如果你本地分支是新创建的还没关联上游直接git pull会提示There is no tracking information for the current branch.解决方案是明确指定分支git pull origin mastergit pull等价于git fetchgit merge。git fetch只是把远程内容拉下来放到本地“远程追踪分支”如origin/master但不合并到当前代码git merge才是把拉下来的内容合并到你当前的工作分支。如果你想让拉取过程更平滑可以考虑用git pull --rebase。它和默认的 merge 模式区别在于merge 会产生一个“合并提交”rebase 则会把你本地的提交放到远程提交的后面提交历史是一条直线。对于多人协作的仓库rebase 的提交历史更清晰。新手暂时不用太纠结但知道有这两种模式存在等你看日志的时候就能理解为什么有人推荐--rebase了。4.4 查历史与回滚git log、git reset、git revert 三兄弟提交历史查不了后面什么都白搭。先记住最常用的三个查看命令# 查看所有提交历史 git log # 一行模式看提交历史只显示哈希、分支、提交信息最常用 git log --oneline # 图形模式看分支合并情况 git log --graph --oneline --all回滚操作要根据“提交是否已经推送到远程”来选择不同的命令。如果提交只在本地还没推送想撤销某次提交的改动可以用git reset --hard HEAD~1HEAD~1指向上一个提交。--hard的意思是工作区和暂存区全部回退到上一个提交的状态你在这个提交上的所有改动都会消失。这个命令非常暴力执行前务必想清楚最好先git stash或确认改动确实不要了。如果提交已经推送到远程历史已经被别人看到就不要用reset去改写历史了而是用git revert生成一个反向提交git revert commit哈希git revert会创建一个新提交这个提交的内容是“撤销指定提交的改动”但保留原来的提交历史。这样团队协作时远程历史是持续增加的不会因为有人强推而乱套。我把这几个命令的适用场景整理成一个表方便你对照使用命令适用场景是否改写历史远程已推送时可用git commit --amend修改最近一次提交信息或补充遗漏文件是不建议git reset --hard HEAD~n本地提交想彻底回退是不建议git revert commit已推送的提交需要撤销否推荐git stash临时保存工作区改动不影响提交历史可用4.5 分支操作速查新建、切换、删除、重命名分支操作是 Git 日常使用最频繁的功能之一这里把最常用的一批命令列全。# 查看本地分支* 号表示当前所在分支 git branch # 查看所有分支包括远程分支 git branch -a # 新建分支并切换过去最常用 git checkout -b feature/login # 或者用新版命令 git switch -c feature/login # 切换已有分支 git checkout master # 或 git switch master # 重命名当前分支 git branch -m new-name # 删除本地分支需要在其他分支上操作 git branch -d feature/login # 删除远程分支 git push origin --delete feature/login这里有个容易踩的坑在本地分支删除之后远程分支不会自动消失必须要用git push origin --delete再删一次很多人删了本地就以为删干净了结果远程分支一直挂在那里。还有一个常见困惑git checkout和git switch有什么区别switch是 Git 2.23 版本引入的新命令专门用来切分支职责更纯粹checkout是老命令既能切分支也能恢复文件。如果你用的是新版本 Git建议优先用switch切分支、用restore恢复文件这样语义更清晰避免checkout一专多能带来的混淆。5. 高频报错排查这些错误你迟早会遇到5.1 fatal: not a git repository这个报错的完整形式是fatal: not a git repository (or any of the parent directories): .git翻译过来就是“当前目录不是一个 Git 仓库到上级目录也找不到.git目录。”新手遇到这个报错十有八九是这两个原因之一当前所在目录根本不在仓库里比如你cd到了其他文件夹或者在仓库的父级目录执行git status。你还没有执行git init所以这个目录压根没有被 Git 接管。排查方法很简单先执行git init把当前目录变成 Git 仓库如果你确实想在这里初始化或者用cd命令回到正确的仓库目录再执行git status验证。5.2 git 无法识别为 cmdlet、函数、脚本文件或可运行程序的名称这个报错提示在 Windows 上特别典型形式是git : 无法将“git”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。意思是你在 PowerShell 或 cmd 里输入了git但系统找不到这个程序。原因一般是 Git 安装时没有把可执行文件路径加到系统环境变量 PATH 里或者安装完成后没有重新打开终端。解决办法有两个重新运行安装包选择“修改”安装确保 PATH 选项是“Git from the command line ...”。手动添加环境变量将C:\Program Files\Git\bin具体路径看你安装位置添加到系统环境变量的 Path 中然后重新打开终端。修改完环境变量后一定要重新打开终端窗口已经打开的那些终端可能还在用旧的缓存环境变量。5.3 refusing to merge unrelated histories这个报错前面的 2.5 提过对应代码是fatal: refusing to merge unrelated histories根本原因是本地仓库和远程仓库的提交历史没有共同祖先。最常见的场景就是远程仓库创建时勾选了初始化 README或者本地有内容直接 push 到了一个已有关联历史的仓库。解法分两种本地内容确实想和远程内容共存加上--allow-unrelated-histories强制合并。远程内容不需要直接git push -u origin master --force。但我再强调一次--force只能在个人项目里用团队项目绝对不要碰。5.4 认证失败或 API Token 相关报错在实际开发中有些使用 HTTPS 协议关联仓库的开发者会在推送代码时遇到类似这样的报错Login failed. Check API token or GitLab version. Log in via Git if the version...出现这种报错十有八九是账号认证方式的问题而不是网络或仓库配置的问题。对于使用 Gitee 之类的平台如果你在用 HTTPS 方式推送很多平台已经要求使用私人令牌token代替账号密码所以先去平台设置页面生成一个新的 token勾选projects相关权限。推送时用户名填你的账号名密码填 token 而不是登录密码。或者干脆切换到 SSH 方式关联远程仓库省去这些认证麻烦。5.5 fatal: 拒绝合并无关历史 - 一个真实排查实录最后分享一个我实际遇到过的场景帮大家巩固一下排查思路。有一次我用 TortoiseGit就是大家常说的“小乌龟”操作一个项目原本本地已经提交了 3 笔代码远程仓库是同事新建的勾了 README 初始化。我按照一般流程去拉取远程代码结果 TortoiseGit 弹窗报refusing to merge unrelated histories。当时我没急着点任何按钮先是到 Git Bash 里执行了git remote -v确认关联的地址没错然后执行git fetch origin拉取远程信息后再用git merge origin/master --allow-unrelated-historiesGit 把两边的文件合并到一起因为我本地没有 README远程的 README 自动被拉进来没有产生冲突。再执行git push一切正常。如果你的合并产生了冲突比如远程的 LICENSE 和本地的LICENSE文件内容不同Git 会停下来在文件里标记冲突区域需要你手工编辑文件保留想要的内容然后git addgit commit完成合并。这类问题本质上不难难的是第一次遇到时不要心慌。排查思路归纳成三步确认远程地址对不对、确认提交历史是否有关联、确认是否需要 --allow-unrelated-histories 或 --force按这个顺序来基本不会出大乱子。6. 进阶技巧学完基础之后建议继续深挖的方向6.1 图形化工具TortoiseGit 到底要不要装很多新手纠结命令行还是图形化工具。我的看法是命令行走天下但你完全可以用图形化工具辅助。TortoiseGit 最大的优势是操作直观右键提交、右键拉取、右键推送文件状态有图标提示对不习惯命令行的人非常友好特别是查看文件级 diff、解决冲突时图形化界面比命令行直观得多。我自己的习惯是主用命令行偶尔用 TortoiseGit 查看日志和 diff。两个不冲突理解了命令行的逻辑之后用图形化工具反而很顺手因为工具本质上就是在帮你执行那几条命令。6.2 深入了解 .gitignore 与文件排除.gitignore是每个 Git 项目必不可少的一部分。它的作用是告诉 Git“哪些文件不要管”。常见需要排除的包括依赖目录node_modules/、vendor/构建输出目录dist/、build/、out/日志文件*.logIDE 配置.idea/、.vscode/部分团队会将.vscode里的公共配置跟踪看团队约定本地环境配置.env、config.local.js如果文件已经被 Git 跟踪了再往.gitignore里添加是无效的必须先取消跟踪git rm --cached 文件名--cached的意思是“从 Git 的索引里移除它但保留磁盘上的文件”这样既能让 Git 忽略它又不影响本地文件存在。6.3 从本地关联到团队协作push 之前先 pull 的习惯把本地关联远程仓库学完之后你基本就进入了“会用 Git”的阶段。下一步再进一步就是要养成一个重要的协作习惯push 之前先 pull。多人协作时你在本地改代码的期间同事可能已经往远程仓库推了新提交。如果你直接git push很可能被拒绝因为远程有本地没有的提交。正确的做法是git pull git push先拉取远程更新并合并到本地解决可能的冲突再推送自己的修改。这个过程可以让远程历史保持线性减少冲突来源。最后分享一点我对 Git 学习的体会我见过太多人学 Git 只记命令不记概念今天背了git add、git commit明天遇到报错就懵。如果你问我有什么经验能分享我的建议是遇到报错不要第一时间去搜命令先停下来想清楚 Git 的三个区、本地和远程的关系、提交历史的概念想明白这几个底层逻辑大多数报错你都能自己推导出解法。本地关联远程仓库是 Git 学习从“会用”到“能用顺手”的分水岭。这一步打通之后日常开发的推拉流程才算真正跑通。我写这篇文章的时候尽量把我踩过坑的地方都标了出来希望能帮你少走弯路。如果你配完 SSH、推完第一笔代码回头再看这篇内容应该会对这些命令背后的逻辑有更深的理解。