Git介绍
Git 是由 Linus Torvalds(Linux之父)开发的第二个伟大作品。2005年,由于BitKeeper软件公司对Linux社区停止了免费使用权,Linus迫不得已自己开发了一个分布式版本控制工具。据说Linus花了两周时间用C语言写了一个分布式版本控制系统,这就是Git。一个月之内,Linux系统的源码已经由Git管理了。
什么是Git
Git 是一个版本控制工具,可以记录和追踪某个文件在某一个时刻的内容和状态。
Git的使用有点像一个”网盘”,但这个网盘比网盘更高级——Git可以追踪”网盘”中文件的历史版本状态。
🔑 核心理解:Git 可以记录某个文件夹下的不同文件在不同时间节点的不同状态,并追踪这些文件产生的变化。
Git的特点
| 特点 | 说明 |
|---|---|
| 分布式 | 每个开发者本地都有完整的仓库副本 |
| 离线可用 | 大部分操作可以在本地完成,无需联网 |
| 可回退 | 可以随时回滚到任意历史版本 |
Git vs SVN 对比
| 对比项 | SVN(集中式) | Git(分布式) |
|---|---|---|
| 架构 | 中央服务器 + 客户端 | 每个节点都是完整仓库 |
| 网络依赖 | 提交、更新都需要联网 | 本地操作无需联网 |
| 数据安全 | 中央服务器挂掉有风险 | 每个节点都有完整备份 |
| 分支操作 | 分支是目录的拷贝,较重 | 轻量级分支,快速切换 |

Git核心流程
Git工作区域
Git管理文件有三个核心区域:
工作区
编写、修改、删除文件发生在这里。Working Directory
暂存区
把这次准备提交的改动先收拢起来。Staging Area / Index
本地仓库
生成可追溯的版本历史,留在本机仓库中。Local Repository
远程仓库
把本地版本同步给团队成员和代码平台。Remote Repository
区域详解:
| 区域 | 英文 | 说明 |
|---|---|---|
| 工作区 | Working Directory | 你电脑上实际看到的文件目录 |
| 暂存区 | Staging Area / Index | 临时存放修改的地方,.git/index |
| 本地仓库 | Local Repository | Git存储版本数据的地方,.git/目录 |
| 远程仓库 | Remote Repository | 如GitHub、Gitee等服务器上的仓库 |

文件状态流转
未追踪(Untracked) ──────► 已暂存(Staged) ──────► 已提交(Committed)
▲ │
│ │
└──── 修改后重新add ◄──┘

Git基础命令
注册远程仓库平台
以Gitee(码云)为例,国内访问速度快:
- 访问 https://gitee.com 注册账号
- 注册时请记住:
- 用户名(推荐使用英文)
- 密码
- 手机号
- 邮箱(可以注册后自行设置)
⚠️ 重要:密码一定要牢记,后续push代码时需要验证。
创建远程仓库
登录Gitee后,点击右上角”+”号创建仓库:

创建时建议:
- 仓库名称使用英文
- 选择公开或私有(初学者建议公开)
- 勾选”初始化仓库”和”添加README.md”
- 勾选”添加.gitignore”(Java项目选Java模板)
git clone – 克隆仓库
将远程仓库下载到本地(首次使用必须操作):
# 方式1:下载远程仓库,本地创建同名文件夹
git clone https://gitee.com/common-zhou/test_50th.git
# 方式2:指定本地文件夹名称
git clone https://gitee.com/common-zhou/test_53th.git test_53th_local
# 方式3:克隆到当前目录的指定文件夹(文件夹必须为空或不存在)
git clone https://gitee.com/ciggar/test-40th.git dirName
💡 提示:克隆后会自动创建
.git文件夹(Git元信息目录),不要手动修改或删除!
⚠️ 文件类型注意事项
Git管理文件版本,推荐使用文本文件:
- ✅
.txt、.md、.java、.xml等 - ❌ 避免使用
.docx、.pptx、.xlsx等二进制格式
Git对比文件变化是一行一行比较的,.docx等是压缩包格式,无法有效对比差异。
git status – 查看状态
查看工作区和暂存区的变化:
git status
输出说明:
- 🔴 红色:工作区有变化(未添加到暂存区)
- 🟢 绿色:暂存区有变化(已add未commit)

简化输出(推荐日常使用):
git status -s
# 或
git status --short
git add – 添加到暂存区
将工作区的变化提交到暂存区:
# 方式1:添加指定文件
git add filename.txt
git add src/Main.java
# 方式2:通配符添加
git add *.java # 所有.java文件
git add src/* # src目录下所有文件
git add src/**/*.java # src及其子目录下所有.java文件
# 方式3:添加所有变化(最常用)
git add .
# 方式4:交互式添加(选择性添加)
git add -i
实战建议:日常开发中,
git add .最常用,但要注意.gitignore的配置。
git commit – 提交到本地仓库
将暂存区的内容提交到本地仓库,生成一个版本:
# 基础提交
git commit -m "提交信息"
# 添加并提交(跳过git add)
git commit -am "提交信息"
# 修改最后一次提交(未push前)
git commit --amend -m "新的提交信息"
首次提交配置
第一次commit前,必须设置用户名和邮箱:
# 方式1:命令行设置(推荐)
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
# 方式2:直接编辑配置文件
# Windows: C:\Users\用户名\.gitconfig
# Linux/Mac: ~/.gitconfig
配置文件内容示例:
[user]
name = stone
email = shitou@cskaoyan.com
提交信息规范
良好的提交信息应该一目了然:
# 推荐格式
git commit -m "功能描述 (issue编号)"
# 示例
git commit -m "修复用户登录bug (#123)"
git commit -m "添加HashMap练习代码"
git commit -m "优化数据库查询性能"
# ❌ 不好的示例
git commit -m "1"
git commit -m "abc"
git commit -m "修改"
提交信息模板:
<type>(<scope>): <subject>
<body>
<footer>
常用type:
feat:新功能fix:修复bugdocs:文档修改style:格式修改(不影响代码逻辑)refactor:重构test:测试相关
git push – 推送到远程
将本地仓库的所有变化推送到远程仓库:
# 推送到默认远程分支
git push
# 推送到指定远程仓库的指定分支
git push origin main
git push origin master
# 首次推送并建立追踪关系
git push -u origin main

push重要说明
- 第一次push需要验证身份:输入用户名和密码(或Token)

- push不能指定单个文件,只能推送整个分支
- push的前提:本地仓库版本必须领先于远程仓库(或已合并远程更新)
git pull – 拉取更新
将远程仓库的最新变化拉取到本地:
git pull

pull的本质
git pull = git fetch + git merge
# 等价于
git fetch origin # 下载远程更新
git merge origin/main # 合并到当前分支
黄金法则:”落后就要pull”——当本地版本落后于远程时,必须先pull才能push。
git log – 查看历史
查看仓库的版本历史:
# 基础查看
git log
# 简化输出(推荐)
git log --oneline
# 图形化显示分支
git log --oneline --graph --all
# 查看最近n条
git log -5
# 查看指定文件的历史
git log -- filename.txt

协作开发与冲突处理
邀请成员加入仓库
无论是开源仓库还是私有仓库,只有仓库成员才能修改代码。
- 开源仓库:所有人可见,但只有成员可修改
- 私有仓库:只有指定成员可见和修改
添加成员步骤:

注意:Gitee私有仓库免费版只能添加5个管理员(含主账号)。如需添加更多成员,可将仓库设为公开。
冲突的产生
当多个开发者同时修改同一文件的同一部分时,就会产生冲突。
冲突产生场景:
冲突产生场景开发者 A先提交的一方
修改 file.txt 后率先推送成功。开发者 B后提交的一方
也修改了同一文件的同一区域。
两人同时修改 file.txt
A 先 push,远程仓库内容发生变化
B 再 push 会被拒绝,需要先 pull 并处理冲突
💡 冲突处理黄金法则
- 先push的人不处理冲突,后push的人处理冲突
- 尽量避免多人同时修改同一文件
- push之前先pull,防止push失败
- 工作习惯:
- ☀️ 早上上班第一件事:pull最新代码
- 🌙 晚上下班最后一件事:push本地代码(确保能编译通过)
冲突处理实战
模拟冲突场景

冲突文件示例
当发生冲突时,Git会在文件中标记冲突内容:
<<<<<<<< HEAD
// 你的本地代码
System.out.println("我的版本");
================
// 远程仓库的代码
System.out.println("同事的版本");
>>>>>>>> a3f8b2c
标记说明:
<<<<<<< HEAD到=======:你的本地代码=======到>>>>>>> a3f8b2c:远程的代码(commit hash)
冲突处理步骤
# 1. 执行pull,Git会自动合并,发生冲突时标记冲突文件
git pull
# 2. 手动编辑冲突文件,决定保留哪些代码
# - 保留你的代码?删除远程部分
# - 保留同事的代码?删除你的部分
# - 两者都要?合并修改
# 3. 删除冲突标记(<<<<<<< ======= >>>>>>>)
# 4. 保存文件后,添加到暂存区
git add .
# 5. 提交解决冲突的代码
git commit -m "解决与同事的代码冲突"
# 6. 尽快push,防止别人又push了新代码
git push
版本回退
Git提供了多种”后悔药”,可以在不同场景下回退操作。

git checkout – 撤销工作区修改
作用:用暂存区或仓库中的文件覆盖工作区的文件
# 撤销单个文件的修改
git checkout filename.txt
# 撤销所有文件的修改(危险操作!)
git checkout .
危险警告:此操作会丢失工作区的所有修改,无法恢复,请谨慎使用!
适用场景:
- 写了一半发现思路错了,想回到修改前的状态
- 误删了文件,想从仓库恢复
git reset – 撤销暂存区
作用:将暂存区的变化回退到工作区(不会改变文件内容)
# 取消暂存区中指定文件
git reset HEAD filename.txt
# 取消所有暂存(保留工作区修改)
git reset HEAD .
# 或简写
git reset .
适用场景:
git add错了文件,想重新选择- 想拆分一个大的commit为多个小的
git reset –hard – 彻底回退版本
作用:将当前分支重置到指定版本,会清除工作区和暂存区的所有更改
# 回退到指定commit(通过hash)
git reset --hard a3f8b2c
# 回退到上一个版本
git reset --hard HEAD^
# 回退到上n个版本
git reset --hard HEAD~3
极度危险:此操作会丢失所有未提交的更改,请确保真的不需要这些更改!

找回丢失的commit:
# 查看所有操作记录
git reflog
# 恢复到之前的版本
git reset --hard <commit_hash>
忽略文件 .gitignore
什么是.gitignore
Git可以配置忽略某些文件或目录,不追踪它们的变化。这在项目中非常重要,比如:
- IDE配置文件(
.idea/) - 编译生成的文件(
target/、*.class) - 依赖库(
node_modules/) - 敏感信息(配置文件含密码)
创建.gitignore
在Git仓库根目录创建.gitignore文件:
# 创建文件(Windows需要在命令行创建,因为文件名以点开头)
touch .gitignore
Java项目常用.gitignore模板
# 编译输出
*.class
target/
build/
out/
# IDE配置
.idea/
*.iml
*.ipr
*.iws
.vscode/
*.project
*.classpath
.settings/
# 包文件
*.jar
*.war
*.ear
*.zip
*.tar.gz
*.rar
# 日志
*.log
logs/
# 临时文件
*.tmp
*.temp
*.swp
*~
# 操作系统文件
.DS_Store
Thumbs.db
# Maven
.mvn/
# Gradle
.gradle/
常用匹配规则
# 忽略单个文件
filename.txt
# 忽略目录
foldername/
# 忽略所有.class文件
*.class
# 不忽略某个特定的.class(取反)
!important.class
# 忽略target目录下的所有内容
target/*
# 忽略所有名为temp的目录
**/temp/
重要注意事项
尽早创建:.gitignore最好在创建远程仓库时就配置好

已追踪文件无效:如果一个文件已经被追踪并提交到远程仓库,再在.gitignore中忽略是无效的
“`bash
git rm –cached filename git commit -m “停止追踪某文件” “`
Git分支管理
什么是分支
Git分支是版本控制中的重要概念,用于在同一仓库中独立开发多个功能。
分支的好处:
- 多人并行开发,互不干扰
- 新功能开发不影响主分支
- 可随时回退到之前的状态
- 支持版本发布和bug修复并行
分支类型:
- 主分支(master/main):稳定版本,用于发布
- 开发分支(dev):日常开发,合并新功能
- *功能分支(feature/)**:开发特定功能
- *修复分支(hotfix/)**:紧急修复线上bug
基础分支命令
# 查看本地分支
git branch
# 查看所有分支(含远程)
git branch -a
# 查看分支关系(追踪关系)
git branch -vv
# 创建新分支
git branch 分支名
# 创建并切换到新分支(常用)
git checkout -b 新分支名
# Git 2.23+ 推荐:
git switch -c 新分支名
# 切换分支
git checkout 分支名
# Git 2.23+ 推荐:
git switch 分支名
# 合并分支
git merge 被合并的分支名
# 删除分支
git branch -d 分支名 # 已合并的分支
git branch -D 分支名 # 强制删除
分支工作流实战
典型企业分支模型
典型企业分支模型主线main
生产环境分支,只保留稳定可发布的版本。协作主干dev
日常集成功能的主开发分支。
feature/loginfeature/paymentfeature/search紧急修复hotfix/bug-001
线上故障优先修复,完成后再回合并主干。
实战步骤
# 场景:从dev分支拉取新功能分支,开发完成后合并回dev
# 1. 切换到dev分支
git checkout dev
# 2. 拉取最新代码
git pull
# 3. 创建并切换到功能分支
git checkout -b feature/user-login
# 4. 开发代码,提交到本地
git add .
git commit -m "feat: 添加用户登录功能"
# 5. 开发完成,切换到dev分支
git checkout dev
# 6. 合并功能分支到dev
git merge feature/user-login
# 7. 推送dev到远程
git push origin dev
# 8. 删除已合并的功能分支
git branch -d feature/user-login
本地分支与远程分支
# 查看所有分支(本地+远程)
git branch -a
# 推送本地分支到远程(首次)
git push origin 本地分支名
# 推送并建立追踪关系(推荐)
git push -u origin 本地分支名
# 查看分支追踪关系
git branch -vv
# 为已有本地分支建立与远程分支的追踪关系
git branch --set-upstream-to=origin/远程分支名 本地分支名
# 示例:本地dev分支追踪远程dev分支
git branch --set-upstream-to=origin/dev dev
# 检出远程分支到本地(创建本地分支并建立追踪)
git checkout -b dev origin/dev
# Git 2.23+ 推荐写法
git switch -c dev --track origin/dev
在IDEA中使用Git
配置Git路径
打开IDEA设置:File → Settings → Version Control → Git

设置Git可执行文件路径:
- Windows:
C:\Program Files\Git\bin\git.exe - Mac:
/usr/bin/git
点击”Test”按钮,显示版本号即配置成功。
项目颜色标识
如果项目被Git追踪,IDEA会用颜色标识文件状态:
| 颜色 | 含义 |
|---|---|
| 🔴 红色 | 新增文件,未追踪(Untracked) |
| 🔵 蓝色 | 文件有修改(Modified) |
| 🟢 绿色 | 已添加到暂存区(Staged) |
| ⚪ 白色/黑色 | 无变化,已提交 |

常用Git操作
右键菜单操作
在文件或项目上右键 → Git:
- Add:添加到暂存区(相当于
git add) - Commit:提交到本地仓库(相当于
git commit) - Push:推送到远程(相当于
git push) - Pull:拉取远程更新(相当于
git pull)
快捷键
| 操作 | Windows快捷键 |
|---|---|
| Commit | Ctrl + K |
| Push | Ctrl + Shift + K |
| Pull | Ctrl + T |
| 查看VCS操作 | Alt + ~ |
查看文件变动
在代码编辑器左侧,可以看到文件的变动标记:
- 绿色条:新增的行
- 蓝色条:修改的行
- 红色三角:删除的行
点击标记可以查看与上一版本的对比。
分支管理
底部状态栏点击分支名称,可以快速:
- 切换分支
- 创建新分支
- 合并分支
- 查看分支图
常见问题与解决方案(FAQ)
Q1: 提交时提示”Please tell me who you are”
问题:
*** Please tell me who you are.
Run:
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
解决:
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
Q2: push时提示”failed to push some refs”
问题:
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'https://gitee.com/xxx/xxx.git'
原因:远程仓库有更新,本地落后于远程。
解决:
# 先拉取远程更新
git pull
# 处理可能的冲突后,再push
git push
Q3: 忘记添加.gitignore,已经提交了不该提交的文件
解决:
# 1. 添加.gitignore文件(包含要忽略的文件)
# 2. 从仓库中移除文件,但保留本地文件
git rm --cached filename
# 3. 如果是目录
git rm -r --cached foldername
# 4. 提交更改
git add .
git commit -m "添加.gitignore,停止追踪某些文件"
Q4: 误删了文件(未commit),如何恢复
解决:
# 恢复工作区文件(从暂存区或仓库恢复)
git checkout -- 文件名
# 恢复所有文件
git checkout .
Q5: 误删了文件(已commit),如何恢复
解决:
# 查看文件历史
git log -- 文件名
# 恢复到指定版本
git checkout <commit_hash> -- 文件名
# 或
git restore --source=<commit_hash> -- 文件名
Q6: commit信息写错了,如何修改
解决:
# 修改最后一次commit信息(未push时)
git commit --amend -m "新的提交信息"
# 修改最后一次commit,添加漏掉的文件
git add 漏掉的文件
git commit --amend --no-edit
Q7: 如何查看某个文件是谁修改的
解决:
# 查看文件的修改历史
git blame 文件名
# 查看详细修改内容
git log -p -- 文件名
Q8: Windows和Mac换行符不一致导致的问题
问题:Windows使用CRLF(\r\n),Mac/Linux使用LF(\n),混用会导致diff显示整行变更。
解决:
# Windows用户配置(提交时自动转换)
git config --global core.autocrlf true
# Mac/Linux用户配置
git config --global core.autocrlf input
# 关闭自动转换(不推荐)
git config --global core.autocrlf false
Q9: 大文件误提交到仓库
问题:Git不适合管理大文件,会导致仓库臃肿。
解决:
# 从历史中彻底删除大文件(慎用,会重写历史)
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch 大文件名' \
--prune-empty --tag-name-filter cat -- --all
或使用BFG Repo-Cleaner工具:
bfg --delete-files 大文件名
Q10: GitHub/Gitee连接超时或失败
解决:
# 设置代理(如果有)
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy https://127.0.0.1:7890
# 取消代理
git config --global --unset http.proxy
git config --global --unset https.proxy
# 使用SSH协议替代HTTPS(更稳定)
# 将 https://github.com/xxx/xxx.git
# 改为 git@github.com:xxx/xxx.git
附录:Git命令速查表
基础命令
| 命令 | 作用 |
|---|---|
git init | 初始化仓库 |
git clone <url> | 克隆远程仓库 |
git status | 查看状态 |
git add <file> | 添加到暂存区 |
git commit -m "msg" | 提交到本地仓库 |
git push | 推送到远程 |
git pull | 拉取远程更新 |
git log | 查看历史 |
分支命令
| 命令 | 作用 |
|---|---|
git branch | 查看分支 |
git branch <name> | 创建分支 |
git checkout <name> | 切换分支 |
git checkout -b <name> | 创建并切换 |
git merge <name> | 合并分支 |
git branch -d <name> | 删除分支 |
撤销命令
| 命令 | 作用 | 危险程度 |
|---|---|---|
git checkout -- <file> | 撤销工作区修改 | ⚠️ 高 |
git reset HEAD <file> | 撤销暂存区 | ✅ 低 |
git reset --hard <hash> | 回退版本 | ⚠️⚠️ 极高 |
git reflog | 查看操作历史 | ✅ 安全 |