
如果你已经能在Linux里熟练地cd、ls、vim那么接下来最值得花时间掌握的一定是Git。说实话我见过不少刚开始接触Linux的朋友把Git当成一种“需要背很多命令”的负担但实际上Git的核心思想非常朴素它就是一个帮你记录每一次文件变化的“后悔药制造机”。这篇内容不是把官方文档翻译一遍而是把你真正会在Linux命令行里用到的Git操作从安装、配置到日常开发、遇到问题怎么救完整地串一遍。无论你是刚装好虚拟机准备开始写代码还是工作中已经被迫在用Git但一直没搞明白原理这篇应该都能帮到你。1. 环境准备与Git安装别在最基本的步骤上翻车在Linux上装软件这件事不同发行版的习惯差别很大。Git的安装方式主要取决于你用的是哪个发行版、以及你的网络环境和仓库源的情况。别小看这一步我见过很多人在安装时就卡住后面全白搭。1.1 不同发行版的安装姿势如果你是Debian系比如Ubuntu、Deepin这类最直接的就是用apt来装sudo apt update sudo apt install git -y如果是Red Hat系比如CentOS、Rocky Linux用的是yum或者dnfsudo yum install git -y # 或者 sudo dnf install git -yArch系的朋友就更简单了sudo pacman -S git这些操作本质上都是去对应的软件仓库里拉取Git的二进制包然后自动处理依赖。之所以建议先执行 update或 refresh是因为仓库索引如果不更新可能找不到最新的Git版本甚至在某些源里出现“包不存在”的情况这个坑我在刚用Ubuntu时踩过。1.2 验证是否安装成功安装完成后我建议你用下面这串命令确认一下顺便看看版本号git --version如果输出的结果是类似git version 2.34.1这样的说明安装成功了。这里有个小细节不同发行版默认仓库里的Git版本差异挺大的Debian系通常版本较新CentOS默认仓库里的版本可能偏老。如果你只是做常规学习系统自带的版本完全够用但如果你发现某些新特性比如git switch命令在2.23版本才加入用不了再考虑手动编译安装也不迟。1.3 特殊情况源码编译安装有些时候官方仓库里的Git版本确实太旧了或者你想用最新版那就需要源码安装。先确认依赖装好了sudo apt install make libssl-dev libghc-zlib-dev libcurl4-gnutls-dev libexpat1-dev gettext unzip然后去Git官网找到最新的源码包下载地址接着wget https://github.com/git/git/archive/refs/tags/v2.43.0.tar.gz tar -zxvf v2.43.0.tar.gz cd git-2.43.0 make prefix/usr/local all sudo make prefix/usr/local install这种方式的优势是版本绝对新但代价是编译时间较长而且如果缺少依赖报错信息对新手并不友好。所以我个人的建议是能用包管理器装就直接用包管理器源码编译更适合确实有特殊需求的朋友。注意虚拟机里装Linux后如果遇到apt/yum下载速度很慢优先检查网络和软件源配置不要急着怀疑Git的问题。把源换成国内镜像源通常能解决80%的烦恼。2. Git核心配置与SSH免密登录Git装好之后第一件事不是急着建仓库而是告诉它“你是谁”。这一步很多人都忽略了结果等到提交代码时才发现一堆问题。2.1 设置用户名和邮箱每个提交的身份证Git的每一次提交都会记录作者信息而这个信息就来自你的配置。打开终端输入git config --global user.name 你的名字 git config --global user.email 你的邮箱这里设计到了Git配置的三级作用域我简单解释一下理解了这个你就知道为什么有些配置在不同的目录里表现不一样配置层级命令作用范围优先级系统级git config --system整台机器所有用户最低全局级git config --global当前用户所有仓库中仓库级git config --local不加参数就是它当前仓库最高在日常使用中--global最常用。但也有特殊场景比如你在公司用工作邮箱自己的个人项目想用另一个邮箱那就可以在某个仓库目录下单独执行不带--global的配置命令覆盖掉全局配置。查看当前所有配置用git config --list只想看某个项用git config user.name。2.2 让终端不那么“难用”别名与默认编辑器说实话如果每次提交都敲一长串命令谁都烦。我强烈建议你配置几个别名日常用起来效率翻倍。在终端里执行git config --global alias.st status git config --global alias.co checkout git config --global alias.br branch git config --global alias.ci commit配完之后git st就相当于git statusgit co相当于git checkout熟悉之后手指能少敲很多键。另外Git默认会用系统自带的编辑器有些系统是nano有的直接是vim来让你输入提交信息如果你更喜欢用vim或者别的编辑器可以这样设置git config --global core.editor vim2.3 配置SSH免密登录告别每次推代码输密码这一步更多是针对GitHub、Gitee这类远程托管平台的。虽然用HTTPS地址也能克隆和推送但每次都要输入用户名密码甚至是个人访问令牌体验确实比较痛苦。SSH免密的原理就像是你跟远程服务器之间约定了一个暗号本地保存一把私钥服务器存一把公钥验证通过就直接放行。首先生成密钥ssh-keygen -t rsa -b 4096 -C 你的邮箱然后一路回车也可以设置密码短语但那样每次使用还得输一次我一般选择空密码生成完成后把公钥打印出来cat ~/.ssh/id_rsa.pub复制这串内容登录你用的Git托管平台GitHub、Gitee、GitLab都行在“设置 - SSH Keys”里粘贴保存。最后验证一下以GitHub为例ssh -T gitgithub.com如果看到提示你已成功认证Hi xxx! Youve successfully authenticated...那就说明搞定了。之后克隆仓库时用gitgithub.com:用户名/仓库名.git这种格式就再也不用输密码了。这个步骤其实不太复杂却有很多朋友忘记了配置导致每次推送都要找密码折腾一圈最后才想起来。实操心得如果你的电脑上已经生成过密钥并且换过电脑一定要把新的公钥重新添加到托管平台旧的公钥建议删掉避免安全隐患。另外SSH配置文件~/.ssh/config里可以为不同网址指定不同的密钥但这是进阶内容了新手阶段不必急着学。3. Git常用命令与工作流从初始化到日常提交装好、配好接下来才是重头戏真正开始用Git管代码。很多教程喜欢一上来就把命令列表甩过来但我觉得更好的方式是先建立起模型。Git的日常操作其实就发生在三个区域之间工作区你眼睛看到的文件、暂存区临时存放准备提交的东西、版本库历史记录。理解了这个后面的命令全都顺理成章。3.1 初始化仓库与第一次提交假设你正在一个新建的目录里写代码想让Git管理起来第一步就是git init执行完目录下会出现一个隐藏的.git文件夹里面装着所有历史记录和配置。这时候你写一个文件比如hello.py然后执行git status会看到这个文件处于“未跟踪”Untracked状态。意思是Git认识它了但还没记录过它的任何变化。要让Git正式跟踪这个文件需要分两步走git add hello.py git commit -m 第一次提交git add把文件放进暂存区git commit把暂存区的内容正式提交到版本库并加上一句说明。这两步是Git最核心的动作。有人可能会问为什么Git不直接一键提交非要分两步因为分步的好处是你可以一次性改多个文件但只挑其中的一部分提交。比如你改了A和B两个文件但这次只想提交A那就可以只git add A再提交。这种灵活度在实际工作中非常有用。3.2 工作区、暂存区、版本库的联动理解我再打个比方帮助理解工作区是你的办公桌暂存区是旁边的收纳盒版本库是文件柜。你写好的文件摆在工作区上要归档了先放进收纳盒git add觉得没问题了再放进文件柜git commit。放进文件柜的东西有编号commit哈希值和日期标签随时可以取出来。日常开发中你自己改完代码通常会这样走一圈git status # 查看当前状态 git diff # 查看尚未暂存的具体改动 git add 文件名或. # 暂存文件. 表示全部 git status # 再看一眼暂存状态 git commit -m 描述信息git diff是很高频的命令它显示的是工作区和暂存区之间的差异也就是你改了但还没add的内容。如果在git add之后还想看差异需要用git diff --cached或git diff --staged。这个细节很多新手容易迷路。3.3 分支操作同时开发互不干扰分支是Git的灵魂。它像什么呢就像你在写一本书的主稿同时为了实验某个新写法单独复印了一个副本在副本上随意涂改涂改好了再考虑要不要把精彩的段落合并回主稿。查看所有分支git branch创建一个新分支并切换过去git branch feature-login git checkout feature-login如果你用的Git版本比较新2.23以上我更推荐用git switch来做切换语义更清晰git switch -c feature-login # 创建并切换 git switch main # 切换回主分支你在分支上正常add、commit完全不影响主分支的代码。要合并的时候先切回主分支再执行git checkout main git merge feature-login合并时如果两边改的是同一个文件同一处位置Git会提示冲突CONFLICT这时候需要手动打开文件找到类似和标记的部分自己决定保留哪边然后重新add、commit。冲突并不可怕反而是理解Git合并逻辑的最好机会。3.4 回滚与撤销你的后悔药人人都会写错代码关键是怎么优雅地回到过去。Git提供了几个不同的撤销手段各自适用的场景完全不同。如果你改了工作区的文件但还没add想放弃这些修改git restore 文件名如果你已经add了但还没commit想从暂存区撤回来git restore --staged 文件名如果你已经commit了但提交信息写错了或者想追加修改git commit --amend -m 新的提交信息如果想回退整个仓库到之前的某个提交git reset --hard HEAD~1 # 回退到上一个提交但要注意reset --hard是一个破坏性操作它会丢掉自目标提交以来的所有修改。某些情况下你只是想反悔某一次提交但仍保留历史记录那更推荐用git revert它会生成一次新的反向提交适合已经推到远程的分支。我记得第一次用reset --hard丢掉小伙伴的代码时真的被狠狠教训了一顿从那以后每次用这个命令都会先确认三遍。常见问题我提交错了能不能反悔能但越早发现越好。刚提交完用git reset --soft HEAD~1可以保留改动内容只撤销提交如果改动还想保留但不想暂存用git reset HEAD~1。已经推送到远程的分支尽量避免reset用revert更安全因为reset会重写历史可能导致别人拉代码时冲突。4. 远程仓库协作与常见问题排查学了这么多操作大部分时间是自己在本地玩。但Git真正的威力在于多人协作以及把代码备份到远程仓库。这一步绕过的话你学到的只是Git的一半。4.1 克隆、拉取与推送从零开始参与一个项目第一条命令通常是git clone 仓库地址比如你接手了一个放在GitHub上的项目执行之后整个项目的全部历史版本都会下载到本地这比只下载最新的代码文件更强大。克隆完成之后你的本地仓库和远程仓库就建立了关联。之后你做完修改先添加再提交最后推送git add . git commit -m 完成某个功能 git push origin main这里的origin是远程仓库的默认别名main是分支名。如果你在本地新建了一个分支想推到远程git push origin 分支名别人更新了代码你要同步到自己本地git pull origin maingit pull实际上是git fetch和git merge的组合。git fetch先把远程最新的提交拉取到本地的一个特殊分支里比如origin/main但不自动合并git pull则直接在拉取后尝试合并到你当前所在分支。理解了这一点你就会明白为什么有些团队推荐先用git fetch再手动git merge因为这样你可以在合并前看看远程到底改了什么心里更有底。4.2 处理代码冲突的正确姿势多人开发里冲突就像感冒一样常见。关键在于不要慌也不要随便用--force强推。举一个很典型的场景你和同事都改了index.html的同一行你先推上去同事再推时就会收到“推送被拒绝”的提示。这时候同事需要先拉取你的修改git pull origin mainGit会尝试自动合并如果合并失败就会在文件里留下冲突标记。打开那个文件你会看到 HEAD 这是你同事的内容 这是你本地的内容 你的分支名解决的方法很简单把不需要的代码删掉保留最终想要的样子同时把、、这些标记也一并清理掉。然后git add index.html git commit -m 解决冲突 git push origin main我见过太多新手一看到冲突就以为代码丢了其实不是Git把两边的版本都给你放在文件里了你只需要做一个判断保留哪边或者两边都要。这种问题处理过一次后面就轻车熟路了。4.3 常见问题的排查与避坑接下来说一些我实际使用中遇到过、也经常被问到的问题整理成一张速查表方便你以后直接对照。现象可能原因解决办法推送时要求输入密码用的是HTTPS地址改用SSH地址或配置credential helpergit pull 报“您的分支领先”本地和远程分支分叉正常先pull再push即可提交时提示“Please tell me who you are”未设置user.name和user.email按2.1节的配置方法设置中文文件名显示乱码终端编码问题设置git config --global core.quotepath falsegit add 误添加了大文件/敏感文件工作失误立即从跟踪列表移除并添加到.gitignore删除文件后空间没释放WSL场景WSL磁盘镜像不自动缩容用compact或手动压缩虚拟磁盘第一个问题多说一句很多新人用HTTPS克隆的仓库推送时被要求输入Gitee或GitHub的密码但输入密码又不对这是因为这些平台早就停用了密码认证改用个人访问令牌Personal Access Token了。你需要在账号设置里生成一个token然后把它当密码粘贴。而更省心的方案就是前面说的配置SSH。4.4 .gitignore的正确打开方式还有一个不被重视但非常重要的文件.gitignore。没有它你迟早会把一堆不该进仓库的文件提交进去。比如Python项目里的__pycache__、虚拟环境目录venv、IDE的配置文件.idea、密钥文件.env等等。在仓库根目录创建一个.gitignore文件里面按规则写__pycache__/ *.pyc venv/ .idea/ .env这样Git在add的时候就会自动忽略这些文件。有个细节要注意.gitignore只对尚未被跟踪的文件生效。如果某文件已经被git add过、进入过版本库了那再把它写进.gitignore也没用你需要先执行git rm --cached 文件名把它从Git的跟踪列表里移除但保留工作区的文件。这个操作我当时琢磨了半天才搞明白。4.5 关于Git目录泄露的一个安全提醒最后必须提醒一个安全话题。有些网站搭建时如果把.git目录暴露在Web根目录下访问者直接访问https://网站域名/.git/就能把整个代码仓库包括历史版本、密钥信息下载下来。这在安全圈里叫“Git目录泄露”危害很大。我见过一些朋友的测试环境或演示项目确实因为图省事把.git一起发布到服务器上结果源代码被人下载了。解决思路有多种发布代码时排除.git目录、在Web服务器配置里拒绝访问点开头的目录、或者干脆用容器镜像发布而非直接暴露文件目录。这个话题值得每个写Web项目的朋友多留个心眼。你甚至可以自己在本地验证一下看看一个暴露的.git目录能泄露多少信息但一定要注意不能拿别人的生产环境来做测试这是原则问题。保护好代码本身也是工程素养的一部分。5. 写在最后几个让我少踩坑的习惯按说内容到这里可以结束了但我还是想分享几个自己用了很久的小习惯它们让我在使用Git和Linux的过程中省下了大量不必要的折腾。第一提交信息一定要写清楚。别用“update”或者“fix”这种一个词带过的描述。写信息的时候可以套用“做了什么 为什么这么做”的格式比如“修复登录接口在token过期时未跳转的问题”。这看起来是小事但等到你一个月后回头看历史记录的时候就会感谢当初认真的自己。第二不要轻易改动历史版本。涉及已经推送到远程的提交避免用reset --hard去强行回退。历史记录就像项目组的共同记忆你改了自己的记忆无所谓但改了别人的就很容易引发混乱。如果不小心推错了优先考虑git revert。第三遇到不确定的命令先看git help 命令名。Git自带的文档写得非常清楚而且就在你手边。比如git help commit会直接在终端里打开完整的commit说明。我在刚学Git的时候每次遇到拿不准的参数都会先查一遍手册再执行这比在网上搜索零碎答案要高效得多。Git这门工具粗看是一堆命令细看是一套思维。它逼着你把“改代码”这件事分成“想清楚再改”和“记录清楚再走”。在Linux环境里操作Git一开始可能会觉得命令行不如图形界面直观但只要适应了你会发现自己写代码、管理项目的效率都在悄悄提升。这套组合拳打下来不只是掌握工具更是养成一种更稳健、更清晰的工程习惯。