📦 一、获取Git仓库——两种姿势开启版本控制
关键字:git init、git clone、本地仓库、远程仓库
想要用Git管理项目,第一步得有个“仓库”(Repository)——就像你放文件的专属文件夹,但Git会自动记录这个文件夹里所有文件的变化~ 获取仓库只有两种方式,新手也能轻松上手!
1. 本地初始化:给已有项目“装Git”🖥️
如果你已经有一个项目文件夹(比如写了一半的网站、代码),想让Git开始跟踪它,就用这种方式:
1. 打开终端,进入你的项目文件夹(替换成你的路径) cd /Users/yourname/Desktop/my-project # 2. 初始化Git仓库(会创建一个隐藏的.git文件夹,存储版本信息) git init # 3. 跟踪所有文件(*表示所有文件,也可以指定单个文件如README.md) git add * # 4. 第一次提交(-m后面是提交说明,必须写!) git commit -m “初始化项目,提交初始文件”
💡
小提醒:git init执行后,项目里会多一个.git隐藏文件夹(Mac按Command+Shift+.显示,Windows在文件夹选项里勾选“显示隐藏文件”),千万别删它!删了就丢了所有版本记录~
适用场景:自己从零开始的项目,比如本地写的笔记、个人小程序等。
2. 克隆远程仓库:“抄作业”大神的项目🌐
如果你想获取别人公开的项目(比如GitHub上的开源项目),或者和同事协作,就用git clone——它会把远程服务器上的仓库完整复制到你本地,包括所有历史版本!
基本用法:git clone + 远程仓库地址 git clone https://github.com/schacon/simplegit-progit # 自定义文件夹名:后面加文件夹名,比如把项目存到my-git-project文件夹 git clone https://github.com/schacon/simplegit-progit my-git-project
克隆后会发生什么?
- 自动创建一个和仓库名相同的文件夹(或你指定的名字);
- 文件夹里有完整的项目文件(最新版本);
- 自动初始化.git仓库,并且关联远程服务器(默认叫origin)。
🤖
新手必知:克隆和下载压缩包的区别——下载压缩包只有最新文件,没有历史版本;克隆有所有历史,能回溯、能提交、能和远程同步!
🧠 深度分析:为什么克隆是完整复制?
Git是分布式版本控制,克隆(clone)不是“下载工作副本”(像Subversion的checkout),而是把远程仓库的“所有数据”都复制过来——包括每一次提交、每一个版本的文件。 这意味着:就算远程服务器崩了,你本地的克隆仓库也能完整恢复服务器的数据(除了一些服务器端的配置)。这就是分布式的安全性! 实际应用:比如你克隆了公司的项目,就算下班回家没网,也能在本地修改、提交,等上班联网后再同步到服务器。
第二部分:记录仓库变化
📝 二、记录仓库变化——文件的“状态管理术”
关键字:跟踪文件、暂存区、提交、git add、git commit、git status
这是Git最核心的工作流程!记住:Git里的文件只有两种大状态——
已跟踪
(Git在管的文件)和
未跟踪
(Git不管的文件)。已跟踪的文件又分:未修改、已修改、已暂存。
整个流程就像:购物(修改文件)→ 放进购物车(暂存git add)→ 结账(提交git commit)🛒
1. 查看状态:git status——Git的“状态提示器”📊
不管你做了什么操作,先跑git status,就能知道文件处于什么状态,该下一步做什么!
查看文件状态 git status # 简化输出(新手推荐,更清晰) git status -s
常见输出解读:
- ✅ nothing to commit, working directory clean:工作区干净,没有未提交的修改;
- ?? README.md:未跟踪文件(Git没见过这个文件,需要git add跟踪);
- M CONTRIBUTING.md:已修改但未暂存(改了文件,没git add);
- MM Rakefile:已暂存又修改(先git add了,之后又改了文件,需要再git add一次);
- A lib/git.rb:已暂存(git add过了,等着git commit)。
2. 跟踪新文件:git add——让Git“认识”文件👋
新建的文件(比如刚写的README.md)默认是未跟踪的,需要用git add告诉Git:“这个文件我要你管!”
跟踪单个文件 git add README.md # 跟踪多个文件(用空格分隔) git add README.md CONTRIBUTING.md # 跟踪所有文件(包括修改的和新建的,谨慎使用!) git add * # 跟踪某个文件夹下的所有文件 git add docs/
💡
重要提醒:git add不只是“添加文件”,还能“更新暂存区”——如果文件改了之后又git add一次,暂存区会保存最新版本!
3. 提交修改:git commit——给版本“拍快照”📸
暂存区的文件准备好了,就用git commit把它们“固化”成一个版本——这是Git的核心操作,每一次commit都是一个不可修改的历史快照!
方式1:直接在命令行写提交说明(推荐,简洁高效) git commit -m “添加README文件,说明项目用途;修改贡献指南” # 方式2:打开编辑器写详细说明(适合提交内容多的情况) git commit # 方式3:跳过暂存区,直接提交已跟踪文件的修改(懒人用法) git commit -a -m “修改了登录功能的bug,无需暂存”
提交说明怎么写?
- 必须写!不写-m会强制打开编辑器,新手容易卡壳;
- 写清楚“做了什么”,比如“修复首页轮播图不跳转的bug”“添加用户注册接口”;
- 别写“更新了文件”“改了点东西”这种废话——不然以后查历史都不知道改了啥。
🧠 深度分析:为什么要有暂存区?
很多新手觉得“git add + git commit”太麻烦,总想用git commit -a跳过暂存区。但暂存区是Git的“灵魂设计”! 场景:你改了3个文件——A是修复bug,B是优化性能,C是测试代码(不想提交)。这时可以: git add A B(只暂存要提交的)→ git commit -m “修复bug+优化性能” → C还在工作区,不会被提交。 如果没有暂存区,要么只能全提交(把测试代码也提交了),要么只能撤销C的修改(麻烦)。暂存区让你“精确控制每次提交的内容”,让历史记录更清晰,后续回滚也更方便。
第三部分:忽略文件
🚫 三、忽略文件——让Git“视而不见”某些文件
关键字:.gitignore、忽略规则、自动生成文件
有些文件Git根本没必要跟踪——比如编译产生的.exe文件、日志文件、IDE生成的配置文件(.idea、.vscode)、缓存文件等。如果不忽略它们,git status会一直显示“未跟踪”,还可能不小心提交到仓库里(占空间还没用)。
解决办法:在项目根目录创建一个叫
.gitignore
的文件,里面写清楚要忽略的文件/文件夹规则。
1. 创建.gitignore文件
Mac/Linux终端创建(进入项目目录) touch .gitignore # Windows命令提示符创建 type nul > .gitignore # 然后用编辑器打开.gitignore,写入规则
2. 常用忽略规则(直接复制用)
1. 注释:用#开头,Git会忽略注释行 # 2. 忽略特定文件 .idea/ # 忽略PyCharm的配置文件夹 .vscode/ # 忽略VS Code的配置文件夹 *.log # 忽略所有.log后缀的日志文件 .exe # 忽略所有.exe后缀的可执行文件 .o # 忽略编译产生的目标文件 ~ # 忽略Emacs等编辑器产生的临时文件 # 3. 忽略特定文件夹 node_modules/ # 忽略npm安装的依赖文件夹(前端项目) dist/ # 忽略打包后的文件夹 build/ # 忽略编译后的文件夹 # 4. 不忽略某个文件(!开头) !lib.a # 虽然上面忽略了.a,但保留lib.a文件 # 5. 忽略特定目录下的文件 doc/.txt # 忽略doc文件夹下的所有.txt文件 doc/**/.pdf # 忽略doc文件夹及其子文件夹下的所有.pdf文件
🤖
新手福利:不用自己写!GitHub有现成的.gitignore模板,覆盖各种语言/框架(Java、Python、Vue、React等),直接下载用:
https://github.com/github/gitignore
🧠 深度分析:.gitignore的坑怎么避?
坑1:已经提交过的文件,再写进.gitignore没用!比如你已经git add node_modules/并提交了,再在.gitignore里加node_modules/,Git还是会跟踪它。 解决:先从仓库中删除已提交的文件(但本地保留),再忽略: git rm —cached -r node_modules/ → 然后提交:git commit -m “从仓库移除node_modules,后续忽略” 坑2:规则写得太宽泛,比如写了*,会忽略所有文件!一定要精准,比如*.log只忽略日志文件。 实际应用:前端项目必忽略node_modules(几百MB,没必要提交),Java项目必忽略target(编译产物),Python项目必忽略__pycache__(缓存)。
第四部分:查看修改和提交历史
🔍 四、查看修改和历史——Git的“时光回溯镜”
关键字:git diff、git log、查看差异、提交历史
写代码时经常会忘:“我刚才改了什么?”“上周是谁改了这个文件?”——Git的git diff和git log能帮你快速找到答案!
1. 查看修改:git diff——精准对比变化📋
git diff能显示“已修改但未暂存”“已暂存但未提交”的文件差异,比如哪一行加了代码、哪一行删了内容。
1. 查看已修改但未暂存的差异(最常用) git diff # 2. 查看已暂存但未提交的差异(—staged和—cached是同义词) git diff —staged # 3. 查看某个文件的差异(比如只看README.md) git diff README.md # 4. 用图形化工具查看(适合新手,更直观) git difftool
差异结果解读(新手友好版):
- --- a/文件名:修改前的文件;
- +++ b/文件名:修改后的文件;
- @@ -x,y +m,n @@:表示修改的位置(-x,y是修改前的行数范围,+m,n是修改后的行数范围);
- 红色减号(-):删除的内容;
- 绿色加号(+):新增的内容。
💡
小技巧:提交前先git diff一下,确认修改的是自己想要的,避免提交错误代码!
2. 查看历史:git log——浏览提交记录📜
git log能列出所有提交记录,包括谁提交的、什么时候提交的、提交说明是什么,还能过滤和格式化输出!
1. 查看所有提交历史(默认倒序,最新的在最前面) git log # 2. 简化输出(一行一个提交,只显示哈希值和提交说明) git log —pretty=oneline # 3. 显示最近n个提交(比如最近3个) git log -3 # 4. 显示每个提交的修改内容(-p表示patch,差异) git log -p # 5. 显示提交统计(改了多少文件、增删多少行) git log —stat # 6. 按作者过滤(比如只看“张三”的提交) git log —author=“张三” # 7. 按时间过滤(比如最近2周的提交) git log —since=2.weeks # 8. 自定义格式(哈希+作者+时间+提交说明,适合导出) git log —pretty=format:“%h - %an, %ar : %s”
常用格式占位符(—pretty=format专用):
- %h:简短哈希值(40位哈希的前几位,够用了);
- %an:作者名字;
- %ar:相对时间(比如“2天前”“1周前”);
- %s:提交说明。
🧠 深度分析:git log的实用场景
场景1:找bug源头——比如今天发现代码有问题,想知道是谁什么时候改的,用git log —author=“同事名” —grep=“相关功能”,快速定位到可疑提交,再用git diff 哈希值 查看具体改了什么。 场景2:统计工作量——老板问你这周改了多少代码,用git log —author=“你” —since=“2024-01-01” —until=“2024-01-07” —stat,能看到提交次数、修改文件数、增删行数。 场景3:回溯版本——想回到3天前的版本,先用git log —pretty=oneline找到3天前的提交哈希值(比如a11bef0),再用git checkout a11bef0就能切换过去(后面会讲撤销操作)。
第五部分:撤销操作
↩️ 五、撤销操作——Git的“后悔药”怎么吃
关键字:git commit —amend、git reset、git checkout —、撤销提交、撤销修改
人非圣贤孰能无过——提交错了、改坏了文件、暂存了不该暂存的文件,Git都有“后悔药”!但不同场景用不同命令,千万别用错(有些命令不可逆!)。
1. 撤销最近一次提交:git commit —amend(改提交说明/补文件)✏️
场景:刚提交完,发现提交说明写错了,或者忘了提交某个文件(比如漏了git add)。
情况1:只改提交说明(提交后没做任何修改) git commit —amend # 会打开编辑器,修改原来的提交说明,保存退出即可# 情况2:补提交文件(提交后发现漏了文件) git add 漏掉的文件.md # 先把漏的文件暂存 git commit —amend # 合并到上一次提交,修改说明
⚠️
警告:不要修改已经推送到远程仓库的提交!比如你已经git push了,再用—amend,会导致本地和远程仓库不一致,协作时会出大问题!
2. 撤销暂存:git reset HEAD <文件>(把文件从暂存区拿出来)📌
场景:不小心git add了不该暂存的文件(比如把日志文件add了),想撤销暂存,但保留文件的修改。
查看当前暂存的文件 git status # 撤销单个文件的暂存(比如CONTRIBUTING.md) git reset HEAD CONTRIBUTING.md # 撤销所有文件的暂存(谨慎使用!) git reset HEAD .
说明:这个命令只会修改暂存区,不会动工作区的文件——也就是说,你改的内容还在,只是不打算提交它了。
3. 撤销文件修改:git checkout — <文件>(放弃本地修改)🗑️
场景:改坏了文件(比如删了重要代码),想恢复到最近一次提交/暂存的状态(相当于“一键还原”)。
撤销单个文件的修改(比如CONTRIBUTING.md) git checkout — CONTRIBUTING.md # 撤销所有文件的修改(谨慎使用!会丢所有未暂存的修改) git checkout — .
⚠️
高危警告:这个命令会直接覆盖工作区的文件,未暂存的修改会永久丢失!如果还想保留修改,先git stash(后面章节讲),别直接用checkout —!
🧠 深度分析:撤销操作的“安全边界”
Git的撤销不是“删除历史”,而是“创建新的状态”——已提交的内容几乎永远能恢复(除非删了.git文件夹),但未提交的修改(工作区、未暂存)可能丢失。 安全原则: 1. 不确定的话,先git status看状态,Git会提示你该用什么命令(比如暂存的文件会提示git reset HEAD,未暂存的会提示git checkout —); 2. 重要修改一定要先git commit,就算提交错了,也能通过日志回滚; 3. 别用git reset —hard(强制重置)!新手容易用它删光历史,除非你明确知道自己在做什么。
第六部分:远程仓库操作
☁️ 六、远程仓库操作——和同事协作的核心
关键字:git remote、git fetch、git pull、git push、远程协作
单机版Git只能自己玩,要和同事协作、把代码存到云端(GitHub、GitLab、Gitee),必须会远程仓库操作!核心流程:拉取同事的修改(pull)→ 提交自己的修改(commit)→ 推送自己的修改(push)。
1. 管理远程仓库:git remote——查看/添加/删除远程地址📡
1. 查看已配置的远程仓库(克隆的仓库默认有origin,是远程服务器的别名) git remote # 2. 查看远程仓库的详细信息(包括拉取和推送地址) git remote -v # 3. 添加远程仓库(比如添加同事的仓库,别名设为colleague) git remote add colleague https://github.com/colleague/your-project.git # 4. 重命名远程仓库(比如把colleague改成team-mate) git remote rename colleague team-mate # 5. 删除远程仓库(比如同事的仓库不用了) git remote rm team-mate # 6. 查看某个远程仓库的详细信息(比如origin) git remote show origin
说明:origin是Git默认的远程仓库别名,代表你克隆的那个服务器地址。如果是自己创建的本地仓库,需要手动git remote add添加远程地址才能推送。
2. 拉取远程修改:git fetch / git pull——同步同事的代码📥
同事提交了新代码到远程仓库,你需要把这些修改同步到本地,避免冲突。
1. git fetch:拉取远程修改到本地,但不合并(安全,推荐先看再合并) git fetch origin # origin是远程仓库别名 # 查看拉取的修改(比如远程master分支的修改) git diff origin/master # 合并到本地master分支 git merge origin/master# 2. git pull:拉取并自动合并(快捷,但可能有冲突) git pull origin master # 拉取origin的master分支,合并到本地当前分支
💡
新手推荐:先用git fetch查看修改,确认没问题再merge,避免pull直接合并导致冲突不好解决。如果是单人开发,git pull也够用~
3. 推送本地修改:git push——把代码上传到云端📤
你本地提交了修改(git commit),想分享给同事,就用git push推送到远程仓库。
基本用法:推送本地master分支到origin远程仓库 git push origin master # 推送指定分支(比如本地dev分支推送到远程dev分支) git push origin dev:dev # 第一次推送分支时,设置上游跟踪(后续可以直接git push) git push -u origin master
⚠️
推送失败怎么办?如果同事已经推送过修改,你的本地仓库不是最新的,Git会拒绝推送。解决:先git pull拉取并合并同事的修改,解决冲突后再git push!
🧠 深度分析:远程协作的常见场景和坑
场景1:多人协作同一分支——比如你和同事都在master分支开发,流程是:每天上班先git pull同步最新代码 → 写代码 → git add → git commit → git push。如果同时修改了同一个文件的同一行,会出现冲突,需要手动解决(后面章节讲冲突解决)。 场景2:推送权限问题——git push提示“permission denied”,说明你没有远程仓库的写权限。解决:让仓库管理员把你的账号加入“开发者”权限,或者用SSH密钥登录(GitHub/GitLab有详细配置教程)。 坑:强制推送git push -f!除非你明确知道远程仓库的代码是错的,否则千万别用-f(force)强制推送——会覆盖远程仓库的历史,把同事的代码删掉! 实际应用:公司里一般用“分支协作”——每个人在自己的分支开发(比如feature/login),开发完推送到远程,再提Merge Request(MR)或Pull Request(PR),由负责人审核后合并到master分支,这样更安全。
第七部分:标签管理
🏷️ 七、标签管理——给重要版本“打标签”
关键字:git tag、轻量标签、注释标签、版本标记
项目发布时(比如v1.0版本、v2.1.3版本),需要给这个稳定版本“打个标签”,方便后续回溯(比如用户反馈v1.0有bug,你能快速切换到v1.0的代码查看)。Git的标签就是干这个的!
1. 查看标签:列出所有已打标签
查看所有标签(按字母顺序排列) git tag # 搜索标签(比如查找v1.8.5系列的标签) git tag -l “v1.8.5*“
2. 创建标签:两种类型任选
Git标签分两种:轻量标签(简单标记,只存哈希值)和注释标签(带详细信息,推荐用)。
1. 注释标签(推荐,带作者、时间、说明) git tag -a v1.0 -m “版本1.0发布,实现核心功能” # -a:annotated(注释标签),-m:标签说明# 2. 轻量标签(简单,只关联提交哈希) git tag v1.0-lw # 不写-a、-m,直接写标签名 # 3. 给历史提交打标签(比如给3天前的提交打标签) # 先找到历史提交的哈希值(用git log —pretty=oneline) git tag -a v0.9 9fceb02 # 9fceb02是历史提交的哈希值前几位
3. 推送标签:标签不会自动推送,需要手动推
推送单个标签到远程 git push origin v1.0 # 推送所有标签到远程(一次性推所有) git push origin —tags
4. 切换到标签:查看某个版本的代码
切换到v1.0标签(此时处于“分离头指针”状态,不能修改提交) git checkout v1.0 # 如果想在标签基础上修改,创建一个新分支 git checkout -b version1.0-fix v1.0
💡
标签和分支的区别:分支会随着提交移动(比如master分支会不断有新提交),标签是固定在某个提交上的“快照”,不会变——适合标记稳定版本。
🧠 深度分析:标签的实际用途
用途1:版本发布——软件发布时打标签(v1.0、v1.1.0),用户可以根据标签下载对应版本的代码,开发者也能快速回溯到某个版本修复bug。 用途2:里程碑标记——比如项目完成第一阶段开发(核心功能实现),打个标签v0.5;完成测试,打个标签v0.9-beta,方便团队跟踪项目进度。 注意:标签一旦创建,最好不要删除(尤其是已经推送到远程的标签)——如果确实要删,本地用git tag -d v1.0,远程用git push origin :refs/tags/v1.0(谨慎使用!)。
第八部分:Git别名
⚡ 八、Git别名——懒人必备的快捷命令
关键字:git config alias、快捷命令、提高效率
Git命令太长?比如git checkout、git commit、git status,天天敲太麻烦——可以给常用命令设置别名,比如用git co代替git checkout,效率翻倍!
1. 基础别名(全局生效,—global) git config —global alias.co checkout # co → checkout git config —global alias.br branch # br → branch git config —global alias.ci commit # ci → commit git config —global alias.st status # st → status git config —global alias.lg “log —pretty=oneline” # lg → 简化日志# 2. 自定义实用别名 git config —global alias.unstage “reset HEAD —” # unstage → 撤销暂存 git config —global alias.last “log -1 HEAD” # last → 查看最后一次提交 git config —global alias.diffstaged “diff —staged” # diffstaged → 查看暂存差异 git config —global alias.visual “!gitk” # visual → 图形化日志 # 使用示例 git co master # 等价于 git checkout master git ci -m “修复bug” # 等价于 git commit -m “修复bug” git unstage README.md # 等价于 git reset HEAD — README.md git last # 等价于 git log -1 HEAD
💡
修改/删除别名:别名存在~/.gitconfig文件里(Mac/Linux)或C:\Users\你的用户名.gitconfig(Windows),直接编辑这个文件就能修改或删除别名。
🧠 深度分析:别名的进阶用法
进阶1:复杂命令组合——比如想一键查看“最近3次提交的详细差异”,可以设置: git config —global alias.log3 “log -3 -p” → 用git log3就能快速查看。 进阶2:外部命令——别名可以调用外部工具,比如用vscode打开.gitignore文件: git config —global alias.ignore “!code .gitignore” → 用git ignore就能打开编辑。 实际应用:新手可以先设置基础别名(co、br、ci、st),熟悉后再根据自己的使用习惯添加自定义别名,能节省大量敲命令的时间。
总结
🎊 八、本章总结——Git基础技能get!
到这里,你已经掌握了Git的核心操作,能独立完成:
- ✅ 创建/克隆仓库,开启版本控制;
- ✅ 跟踪文件、暂存、提交,记录代码变化;
- ✅ 忽略无用文件,保持仓库整洁;
- ✅ 查看修改和历史,回溯版本;
- ✅ 撤销错误操作,避免丢代码;
- ✅ 和同事协作,拉取/推送远程代码;
- ✅ 给稳定版本打标签,方便回溯;
- ✅ 设置别名,提高操作效率。
这些技能足够应对日常开发和协作了!下一章我们会讲Git的“杀手锏”——分支管理,让你能同时开发多个功能、优雅解决冲突~
🚀 恭喜你!已经从Git新手升级为“能用Git干活”的初级玩家~
结尾交付物提议
要不要我帮你整理一份
Git基础命令速查手册
?包含本章所有核心命令、场景用法和避坑指南,打印出来贴在桌面,开发时随取随用~