📦 一、获取 Git 仓库——两种姿势开启版本控制
1. 本地初始化:给已有项目“装 Git”🖥️
cd /Users/yourname/Desktop/my-project
# 2. 初始化 Git 仓库(会创建一个隐藏的.git 文件夹,存储版本信息)
git init
# 3. 跟踪所有文件(* 表示所有文件,也可以指定单个文件如 README.md)
git add *
# 4. 第一次提交(- m 后面是提交说明,必须写!)
git commit -m “ 初始化项目,提交初始文件 ”
2. 克隆远程仓库:“抄作业”大神的项目🌐
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),而是把远程仓库的“所有数据”都复制过来——包括每一次提交、每一个版本的文件。
这意味着:就算远程服务器崩了,你本地的克隆仓库也能完整恢复服务器的数据(除了一些服务器端的配置)。这就是分布式的安全性!
实际应用:比如你克隆了公司的项目,就算下班回家没网,也能在本地修改、提交,等上班联网后再同步到服务器。
📝 二、记录仓库变化——文件的“状态管理术”
1. 查看状态:git status——Git 的“状态提示器”📊
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“认识”文件👋
git add README.md
# 跟踪多个文件(用空格分隔)
git add README.md CONTRIBUTING.md
# 跟踪所有文件(包括修改的和新建的,谨慎使用!)
git add *
# 跟踪某个文件夹下的所有文件
git add docs/
3. 提交修改:git commit——给版本“拍快照”📸
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“视而不见”某些文件
1. 创建.gitignore 文件
touch .gitignore
# Windows 命令提示符创建
type nul > .gitignore
# 然后用编辑器打开.gitignore,写入规则
2. 常用忽略规则(直接复制用)
# 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 文件
🧠 深度分析:.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 的“时光回溯镜”
1. 查看修改:git diff——精准对比变化📋
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 是修改后的行数范围);
- 红色减号(-):删除的内容;
- 绿色加号(+):新增的内容。
2. 查看历史:git log——浏览提交记录📜
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”
- %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 的“后悔药”怎么吃
1. 撤销最近一次提交:git commit –amend(改提交说明 / 补文件)✏️
git commit –amend
# 会打开编辑器,修改原来的提交说明,保存退出即可# 情况 2:补提交文件(提交后发现漏了文件)
git add 漏掉的文件.md # 先把漏的文件暂存
git commit –amend # 合并到上一次提交,修改说明
2. 撤销暂存:git reset HEAD < 文件 >(把文件从暂存区拿出来)📌
git status
# 撤销单个文件的暂存(比如 CONTRIBUTING.md)
git reset HEAD CONTRIBUTING.md
# 撤销所有文件的暂存(谨慎使用!)
git reset HEAD .
3. 撤销文件修改:git checkout — < 文件 >(放弃本地修改)🗑️
git checkout — CONTRIBUTING.md
# 撤销所有文件的修改(谨慎使用!会丢所有未暂存的修改)
git checkout — .
🧠 深度分析:撤销操作的“安全边界”
Git 的撤销不是“删除历史”,而是“创建新的状态”——已提交的内容几乎永远能恢复(除非删了.git 文件夹),但未提交的修改(工作区、未暂存)可能丢失。
安全原则:
1. 不确定的话,先 git status 看状态,Git 会提示你该用什么命令(比如暂存的文件会提示 git reset HEAD,未暂存的会提示 git checkout –);
2. 重要修改一定要先 git commit,就算提交错了,也能通过日志回滚;
3. 别用 git reset –hard(强制重置)!新手容易用它删光历史,除非你明确知道自己在做什么。
☁️ 六、远程仓库操作——和同事协作的核心
1. 管理远程仓库:git remote——查看 / 添加 / 删除远程地址📡
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
2. 拉取远程修改:git fetch / git pull——同步同事的代码📥
git fetch origin # origin 是远程仓库别名
# 查看拉取的修改(比如远程 master 分支的修改)
git diff origin/master
# 合并到本地 master 分支
git merge origin/master# 2. git pull:拉取并自动合并(快捷,但可能有冲突)
git pull origin master # 拉取 origin 的 master 分支,合并到本地当前分支
3. 推送本地修改:git push——把代码上传到云端📤
git push origin master
# 推送指定分支(比如本地 dev 分支推送到远程 dev 分支)
git push origin dev:dev
# 第一次推送分支时,设置上游跟踪(后续可以直接 git push)
git push -u origin master
🧠 深度分析:远程协作的常见场景和坑
场景 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 分支,这样更安全。
🏷️ 七、标签管理——给重要版本“打标签”
1. 查看标签:列出所有已打标签
git tag
# 搜索标签(比如查找 v1.8.5 系列的标签)
git tag -l “v1.8.5*”
2. 创建标签:两种类型任选
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. 切换到标签:查看某个版本的代码
git checkout v1.0
# 如果想在标签基础上修改,创建一个新分支
git checkout -b version1.0-fix v1.0
🧠 深度分析:标签的实际用途
用途 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 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
🧠 深度分析:别名的进阶用法
进阶 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 基础命令速查手册?包含本章所有核心命令、场景用法和避坑指南,打印出来贴在桌面,开发时随取随用~
“`