Git Basics – 玩转代码版本控制的核心技能✨

410次阅读

📦 一、获取 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 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 基础命令速查手册?包含本章所有核心命令、场景用法和避坑指南,打印出来贴在桌面,开发时随取随用~

“`

正文完
 0