Git是一个分布式版本控制系统,由Linux之父Linus Torvalds于2005年创建。它可以跟踪文件的变化,协调多人协作,并且能够追踪每一个版本的完整性。
主要特点:
版本控制:
多人协作:
分支管理:
数据安全:
分布式vs集中式:
分支管理:
Git有三个主要的工作区域:
工作目录(Working Directory):
暂存区(Staging Area):
git add
添加文件本地仓库(Local Repository):
git commit
提交的历史记录.git
目录中的内容远程仓库(Remote Repository):
文件在Git中有四种状态:
未跟踪(Untracked):
git add
加入版本控制已跟踪(Tracked):
下载安装:
安装步骤:
验证安装:
git --version
# 设置用户名
git config --global user.name "你的名字"
# 设置邮箱
git config --global user.email "你的邮箱"
# 设置VS Code为默认编辑器
git config --global core.editor "code --wait"
# 设置换行符处理
git config --global core.autocrlf true # Windows
git config --global core.autocrlf input # Mac/Linux
# 生成新的SSH密钥
ssh-keygen -t rsa -C "你的邮箱"
# 指定文件名(可选)
ssh-keygen -t rsa -b 4096 -C "你的邮箱" -f ~/.ssh/github_key
# 默认密钥
cat ~/.ssh/id_rsa.pub
# 指定密钥
cat ~/.ssh/github_key.pub
添加到平台:
测试连接:
ssh -T [email protected]
Git有三个配置级别:
git config --system user.name "名字"
# 配置文件位置:/etc/gitconfig
git config --global user.name "名字"
# 配置文件位置:~/.gitconfig
git config --local user.name "名字"
# 配置文件位置:.git/config
# 设置默认编辑器
git config --global core.editor "vim"
# 设置差异比较工具
git config --global diff.tool vimdiff
# 设置颜色输出
git config --global color.ui true
# 设置别名
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
# 设置自动纠正
git config --global help.autocorrect 1
# 设置默认推送行为
git config --global push.default current
初始化新仓库:
git init
示例:创建一个新的项目
# 创建项目文件夹
mkdir my-project
cd my-project
# 初始化Git仓库
git init
# 查看创建的.git目录
ls -la .git
克隆现有仓库:
git clone <仓库地址>
示例:克隆一个GitHub项目
# 克隆项目到当前目录
git clone https://github.com/vuejs/vue.git
# 克隆项目到指定目录
git clone https://github.com/vuejs/vue.git my-vue-project
添加单个文件:
git add 文件名
示例:添加一个新的源代码文件
# 创建一个新文件
echo "console.log('Hello World');" > app.js
# 添加到暂存区
git add app.js
# 查看状态确认添加
git status
添加所有文件:
git add .
示例:添加多个新文件
# 创建多个文件
touch index.html styles.css
echo "# My Project" > README.md
# 添加所有新文件
git add .
# 查看添加的文件
git status
git commit -m "提交说明"
示例:提交新功能
# 添加并提交单个文件
git add app.js
git commit -m "添加用户登录功能"
# 添加并提交所有更改
git add .
git commit -m "完成首页界面设计"
# 使用详细的提交信息
git commit -m "feat: 添加用户注册功能
- 添加注册表单
- 实现邮箱验证
- 添加密码强度检查"
git status
示例:检查工作目录状态
# 创建和修改一些文件
echo "新内容" > test.txt
echo "测试内容" > demo.js
# 查看状态
git status
# 添加部分文件后再次查看状态
git add test.txt
git status
git diff
示例:查看文件修改
# 修改一个文件
echo "新的一行" >> README.md
# 查看未暂存的修改
git diff
# 查看已暂存的修改
git add README.md
git diff --cached
# 查看与特定提交的差异
git diff HEAD~1
# 查看提交历史
git log
示例:查看项目历史
# 查看简洁的提交历史
git log --oneline
# 查看最近3条提交
git log -3
# 查看指定作者的提交
git log --author="张三"
# 查看某个文件的修改历史
git log -p README.md
# 查看图形化的分支历史
git log --graph --oneline --all
# 撤销工作区的修改
git checkout -- <文件名>
示例:撤销各种修改
# 撤销未暂存的文件修改
echo "错误的修改" > README.md
git checkout -- README.md
# 撤销暂存区的文件
git add wrong.txt
git reset HEAD wrong.txt
# 修改最后一次提交
git add forgotten-file.txt
git commit --amend -m "更新的提交信息"
# 撤销最近一次提交(保留修改)
git reset --soft HEAD^
# 完全撤销最后一次提交(丢弃修改)
git reset --hard HEAD^
分支是Git中最强大的功能之一,它允许我们在不影响主线开发的情况下进行并行开发。
# 基于当前分支创建新分支
git branch <分支名>
# 切换到指定分支
git checkout <分支名>
# 查看本地分支
git branch
# 快进合并(Fast-forward)
git merge <分支名>
# 发生冲突时,查看冲突文件
git status
# 重命名当前分支
git branch -m <新名称>
# 安全删除(已合并的分支)
git branch -d <分支名>
# 清理已合并的本地分支
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
# 查看远程仓库
git remote -v
# 设置上游分支
git branch --set-upstream-to=origin/<分支名> <本地分支名>
# 获取远程更新(不合并)
git fetch origin
# 拉取并合并(fetch + merge)
git pull origin <分支名>
# 推送到远程分支
git push origin <分支名>
# 添加GitHub和GitLab远程仓库
git remote add github https://github.com/user/repo.git
# 推送到多个远程仓库
git push github main
git push gitlab main
# 1. 更新本地仓库
git checkout main
git fetch origin
# 储藏当前修改
git stash
示例:临时储藏工作进度
# 正在开发新功能
echo "新功能代码" >> feature.js
git add feature.js
# 突然需要修复bug,储藏当前工作
git stash save "正在开发的登录功能"
# 查看储藏列表
git stash list
# 完成bug修复后,恢复之前的工作
git stash pop
# 查看储藏列表
git stash list
示例:管理多个储藏
# 创建多个储藏
git stash save "功能A的修改"
git stash save "功能B的修改"
git stash save "功能C的修改"
# 查看所有储藏
git stash list
# 输出示例:
# stash@{0}: On feature: 功能C的修改
# stash@{1}: On feature: 功能B的修改
# stash@{2}: On feature: 功能A的修改
# 查看特定储藏的内容
git stash show stash@{1} -p
# 应用特定的储藏
git stash apply stash@{1}
# 删除不需要的储藏
git stash drop stash@{2}
# 清理所有储藏
git stash clear
# 储藏未跟踪的文件
git stash -u
示例:高级储藏操作
# 创建新文件(未跟踪)
echo "新页面代码" > new-page.js
# 储藏包含未跟踪的文件
git stash -u
# 交互式储藏
git stash -p # 可以选择性储藏部分改动
# 从储藏创建分支
git stash branch feature/new-login stash@{0}
# 储藏指定文件
git stash push -m "只储藏配置文件" config.json
# 修改最近的提交
git commit --amend
示例:修改最后的提交
# 初始提交
echo "console.log('Hello');" > app.js
git add app.js
git commit -m "添加应用入口"
# 发现遗漏了文件
echo "// 配置文件" > config.js
git add config.js
git commit --amend -m "添加应用入口和配置文件"
# 只修改提交信息
git commit --amend -m "更好的提交说明"
# 修改作者信息
git commit --amend --author="张三 "
# 交互式变基
git rebase -i HEAD~3
示例:整理提交历史
# 查看最近的提交
git log --oneline
# 输出示例:
# a1b2c3d 修复登录按钮样式
# e4f5g6h 调整按钮位置
# i7j8k9l 更新按钮颜色
# m0n1o2p 初始化登录界面
# 开始交互式变基
git rebase -i HEAD~4
# 在编辑器中将显示:
# pick m0n1o2p 初始化登录界面
# pick i7j8k9l 更新按钮颜色
# pick e4f5g6h 调整按钮位置
# pick a1b2c3d 修复登录按钮样式
# 将多个提交合并为一个
# 修改为:
# pick m0n1o2p 初始化登录界面
# squash i7j8k9l 更新按钮颜色
# squash e4f5g6h 调整按钮位置
# squash a1b2c3d 修复登录按钮样式
示例:清理大文件历史
# 查找大文件
git rev-list --objects --all | grep -f <(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print $1}')
# 删除大文件历史
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch big-file.zip' HEAD
# 清理并回收空间
git reflog expire --expire=now --all
git gc --prune=now
示例:版本发布管理
# 创建带注释的发布标签
git tag -a v1.0.0 -m "第一个正式版本"
# 给历史版本打标签
git tag -a v0.9.0 9fceb02 -m "测试版本"
# 推送标签到远程
git push origin v1.0.0
# 推送所有标签
git push origin --tags
# 删除本地标签
git tag -d v0.9.0
# 删除远程标签
git push origin :refs/tags/v0.9.0
# 检出特定版本
git checkout v1.0.0
# 基于标签创建修复分支
git checkout -b hotfix/v1.0.1 v1.0.0
示例:添加公共组件库作为子模块
# 添加子模块
git submodule add https://github.com/company/common-ui.git src/components
# 克隆包含子模块的项目
git clone --recursive https://github.com/company/main-project.git
# 初始化子模块
git submodule init
git submodule update
# 更新所有子模块到最新版本
git submodule update --remote
# 在所有子模块中执行命令
git submodule foreach git pull origin main
# 删除子模块
# 1. 取消注册子模块
git submodule deinit -f src/components
# 2. 从工作区删除子模块
git rm -f src/components
# 3. 删除.git中的子模块记录
rm -rf .git/modules/src/components
Git LFS (Large File Storage) 是Git的一个扩展,用于优化大文件的存储和传输。它通过将大文件存储在单独的服务器上,并在Git仓库中只保留文件的引用来实现。
# Windows安装(需要先安装Git)
git lfs install
# macOS安装
brew install git-lfs
git lfs install
# Linux安装
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt-get install git-lfs
git lfs install
# 初始化Git LFS
cd your-repository
git lfs install
# 配置跟踪规则
git lfs track "*.psd" # 跟踪PSD文件
git lfs track "*.zip" # 跟踪ZIP文件
git lfs track "videos/**" # 跟踪videos目录下的所有文件
git lfs track "*.png" "*.jpg" # 跟踪多种文件类型
# 查看当前跟踪规则
git lfs track
# 将.gitattributes加入版本控制
git add .gitattributes
git commit -m "build: 配置Git LFS跟踪规则"
# 添加大文件
git add large-file.psd
git commit -m "feat: 添加设计稿"
git push origin main
# 克隆带LFS的仓库
git lfs clone https://github.com/user/repo.git
# 拉取LFS文件
git lfs pull
# 检查LFS文件状态
git lfs status
# 查看所有被跟踪的文件
git lfs ls-files
# 手动获取指定文件
git lfs fetch --all
git lfs checkout
# 查看文件指纹
git lfs pointer --file="large-file.psd"
# 迁移现有文件到LFS
git lfs migrate import --include="*.psd"
# 查看LFS对象大小
git lfs ls-files --size
# 更新LFS缓存
git lfs prune
# 验证LFS文件
git lfs verify
# 锁定文件(防止并发修改)
git lfs lock "design.psd"
# 解锁文件
git lfs unlock "design.psd"
# 查看锁定状态
git lfs locks
# 清理未使用的LFS文件
git lfs prune
# 预取LFS文件(预先下载)
git lfs prefetch
# 查看LFS使用情况
git lfs env
# 批量操作
git lfs fetch --recent
git lfs prune --recent
# 并行下载
git config lfs.concurrenttransfers 8
# 设置带宽限制
git config lfs.transfer.maxretries 3
git config lfs.transfer.maxverifies 3
# 修复损坏的LFS文件
git lfs fsck
# 重试失败的传输
git lfs push --all origin
# 强制重新下载
git lfs pull --force
# 诊断问题
git lfs logs last
# 将普通文件转换为LFS
git lfs migrate import --include="*.zip" --include-ref=refs/heads/main
# 导出LFS文件(转回普通文件)
git lfs migrate export --include="*.zip" --include-ref=refs/heads/main
# 重写历史中的LFS文件
git lfs migrate import --everything --include="*.psd"
示例:完整的LFS工作流
# 1. 初始化新项目
git init my-project
cd my-project
git lfs install
# 2. 配置LFS跟踪
git lfs track "*.psd"
git lfs track "*.zip"
git add .gitattributes
git commit -m "build: 初始化Git LFS配置"
# 3. 添加大文件
echo "大文件内容" > large-file.zip
git add large-file.zip
git commit -m "feat: 添加示例大文件"
# 4. 推送到远程
git remote add origin https://github.com/user/repo.git
git push -u origin main
# 5. 团队协作
git lfs lock "large-file.zip"
# 编辑文件...
git add large-file.zip
git commit -m "feat: 更新大文件内容"
git lfs unlock "large-file.zip"
git push origin main
# 6. 维护清理
git lfs prune
git gc
提交信息应该清晰地描述改动的内容,遵循以下格式:
<类型>(<作用域>): <描述>
[可选的正文]
[可选的脚注]
类型(必填):
作用域(可选):
描述:
示例:
# 新功能
feat(auth): 添加用户登录功能
# Bug修复
fix(login): 修复登录按钮在IE11中不可点击的问题
# 文档更新
docs(readme): 更新安装说明和使用示例
# 代码格式调整
style(user): 规范用户模块的代码缩进
# 代码重构
refactor(cart): 重构购物车计算逻辑,提升性能
# 添加测试
test(api): 添加用户注册接口的单元测试
# 构建工具
chore(build): 升级webpack到最新版本
完整提交示例:
feat(user): 实现用户注册功能
- 添加用户注册表单
- 实现邮箱验证功能
- 添加密码强度检查
- 集成短信验证码服务
BREAKING CHANGE: 用户注册接口的请求参数格式已更改
需要更新客户端适配新的接口格式
Closes #123
# 开发新功能
git checkout develop
git checkout -b feature/login
git commit -m "feat: 添加登录功能"
git checkout develop
git merge feature/login
# 发布版本
git checkout -b release/v1.0
git commit -m "chore: 准备v1.0发布"
git checkout main
git merge release/v1.0
git tag v1.0
# 开发功能
git checkout -b feature-cart
git commit -m "feat: 添加购物车"
git push origin feature-cart
# 创建PR并合并
git checkout main
git merge feature-cart
git push origin main
# 功能开发
git checkout -b feature
git commit -m "feat: 新功能"
git push origin feature
# 环境部署
git checkout pre-production
git merge feature
git checkout production
git merge pre-production
预防冲突:
解决冲突:
# 更新分支
git fetch origin
git merge origin/main
# 查看冲突文件
git status
# 解决冲突后标记为已解决
git add <冲突文件>
git commit -m "fix: 解决合并冲突"
常见问题:
解决方案:
# 修改最后一次提交
git commit --amend
# 撤销最近的提交
git reset HEAD^
# 将提交转移到正确分支
git cherry-pick <commit-hash>
# 删除敏感信息
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch 敏感文件' HEAD
同步问题:
解决方案:
# 强制更新本地分支
git fetch --all
git reset --hard origin/main
# 清理无效远程分支
git remote prune origin
# 同步所有标签
git fetch --tags
git push --tags
常见场景:
解决方案:
# 检查远程仓库权限
git remote -v
# 测试SSH连接
ssh -T [email protected]
# 更新SSH密钥
ssh-add ~/.ssh/id_rsa
# 检查仓库访问权限
git ls-remote origin
常见情况:
解决方案:
# 查找大文件
git rev-list --objects --all | grep -f \
<(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10)
# 使用Git LFS管理大文件
git lfs install
git lfs track "*.psd"
# 清理大文件历史
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch large-file.zip' HEAD
常见场景:
解决方案:
# 查看所有分支关系
git log --graph --oneline --all
# 整理本地分支
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
# 重置分支到特定提交
git reset --hard <commit-hash>
# 修复错误合并
git revert -m 1 <merge-commit-hash>
常见情况:
解决方案:
# 优化仓库
git gc --aggressive
git prune
# 浅克隆加快克隆速度
git clone --depth 1 <repository-url>
# 使用稀疏检出
git sparse-checkout set <directory>
# 清理无用的远程跟踪分支
git remote prune origin
常见场景:
解决方案:
# 恢复误删除的文件
git checkout -- <file>
# 清理工作区
git clean -fd
# 重置暂存区
git reset HEAD <file>
# 保存工作现场
git stash save "工作现场"
# 查找大文件
git rev-list --objects --all | grep -f \
<(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10)
# 从历史中删除大文件
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch 大文件' HEAD
# 压缩仓库
git gc --aggressive
git prune
# 浅克隆
git clone --depth 1 <仓库地址>
# 单分支克隆
git clone --single-branch --branch main <仓库地址>
# 稀疏检出
git clone --filter=blob:none <仓库地址>
# 合并多个提交
git rebase -i HEAD~3
# 压缩提交历史
git checkout --orphan temp_branch
git add -A
git commit -m "压缩历史: 项目初始化"
git branch -D main
git branch -m main
认证方式:
SSH密钥认证:
# 生成SSH密钥
ssh-keygen -t ed25519 -C "[email protected]"
# 添加到SSH代理
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
# 测试连接
ssh -T [email protected]
双因素认证(2FA):
访问令牌(Token):
# 使用token克隆仓库
git clone https://<token>@github.com/username/repo.git
# 更新远程URL使用token
git remote set-url origin https://<token>@github.com/username/repo.git
权限管理:
仓库级别:
分支保护:
# 设置分支保护规则
- 限制强制推送(force push)
- 要求代码评审
- 要求状态检查通过
- 自动化CI/CD验证
提交签名:
# 配置GPG密钥
gpg --gen-key
gpg --list-secret-keys --keyid-format LONG
# 配置Git使用GPG签名
git config --global user.signingkey <GPG-KEY-ID>
git config --global commit.gpgsign true
# 签名提交
git commit -S -m "签名的提交信息"
预防措施:
配置.gitignore:
# 创建.gitignore文件
touch .gitignore
# 常见敏感文件模式
*.env
*.key
config/secrets.*
credentials/*
.DS_Store
node_modules/
使用环境变量:
# 使用环境变量文件
# .env.example(示例配置,可提交)
DB_HOST=localhost
DB_USER=example
DB_PASS=<your-password>
# .env(实际配置,不提交)
DB_HOST=production-db
DB_USER=prod_user
DB_PASS=actual_password
配置模板:
# 创建配置模板
cp config.json config.json.template
git add config.json.template
git commit -m "chore: 添加配置文件模板"
安全检查工具:
Git Secrets:
# 安装Git Secrets
brew install git-secrets # macOS
git clone https://github.com/awslabs/git-secrets.git && \
cd git-secrets && make install # Linux/Windows
# 配置检查规则
git secrets --register-aws # AWS凭证检查
git secrets --add 'private_key' # 自定义规则
git secrets --add 'api_key' # 自定义规则
# 在仓库中安装钩子
git secrets --install
# 扫描仓库
git secrets --scan
git secrets --scan-history
预提交钩子:
# 创建pre-commit钩子
cat > .git/hooks/pre-commit << 'EOF'
#!/bin/sh
# 检查敏感信息
if git diff --cached | grep -i "password\|secret\|key"
then
echo "警告:可能包含敏感信息!"
exit 1
fi
EOF
chmod +x .git/hooks/pre-commit
安全最佳实践:
定期安全审计:
密钥轮换:
事件响应:
# 如果密钥泄露,立即执行:
# 1. 撤销泄露的密钥
git config --global --unset user.signingkey
# 2. 更新所有认证信息
ssh-keygen -t ed25519 -C "[email protected]"
# 3. 检查提交历史中的敏感信息
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch config/secrets.yml' HEAD
SourceTree:
GitKraken:
GitHub Desktop:
Oh My Zsh:
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"
Git Extras:
choco install git-extras
brew install git-extras
# Debian/Ubuntu
sudo apt-get install git-extras
# CentOS/RHEL
sudo yum install git-extras
如有问题,欢迎各位大佬在评论区指出,你的点赞收藏是对我最大的鼓励!