Git入门
欢迎来到Git的奇妙世界!🌲 本教程将带你了解Git版本控制系统的基础知识,从最基本的概念到实际工作中的应用,让你能够自如地管理代码和协作开发。
什么是Git?
Git是一个分布式版本控制系统,由Linux之父Linus Torvalds在2005年创建,用于跟踪文件的变化,特别是代码文件。它允许多人协作开发项目,同时保留每一次修改的完整历史记录。
Git名称的由来
Linus Torvalds开玩笑说,"git"这个词在英国俚语中是"愚蠢的人"的意思,他自嘲道:"我给我的所有项目取名字:Linux是以我自己命名的,而Git则是'我,愚蠢的人'"。此外,根据手册页的说法,git也可以理解为"全局信息跟踪器(Global Information Tracker)"。
Git的核心概念
在开始使用Git之前,让我们先了解一些基本概念:
仓库(Repository)
仓库(通常简称为repo)是项目的容器,包含了项目的所有文件和每一个文件的修订历史。仓库可以是本地的,也可以是远程的(如GitHub、GitLab或Bitbucket上的仓库)。
提交(Commit)
提交是Git中的基本操作单元,它记录了在特定时间点上仓库中所有文件的快照。每个提交都有一个唯一的ID(哈希值),并包含提交信息、作者信息和时间戳。
分支(Branch)
分支允许你从主开发线(通常称为"main"或"master")分离出来,以便独立开发特性或修复Bug,而不影响主线。完成后,可以将分支合并回主线。
工作区和暂存区
- 工作区(Working Directory):你实际编辑文件的地方
- 暂存区(Staging Area或Index):准备提交的文件修改的临时区域
- 本地仓库(Local Repository):保存提交历史的本地数据库
安装Git
在开始使用Git之前,需要先安装它:
配置Git
安装后,你需要设置你的身份信息,这将出现在你的提交记录中:
# 设置全局用户名
git config --global user.name "你的名字"
# 设置全局邮箱
git config --global user.email "你的邮箱@example.com"
# 查看配置
git config --list
Git基础操作
创建或克隆仓库
基本工作流程
Git的基本工作流程如下:
- 修改文件(在工作区)
- 暂存更改(添加到暂存区)
- 提交更改(保存到本地仓库)
- 推送更改(同步到远程仓库,可选)
# 1. 查看文件状态
git status
# 2. 添加文件到暂存区
git add 文件名 # 添加特定文件
git add . # 添加所有更改
# 3. 提交更改到本地仓库
git commit -m "提交信息" # -m 参数后跟提交说明
# 4. 推送到远程仓库(如果有)
git push origin 分支名
查看历史和差异
# 查看提交历史
git log
git log --oneline # 简洁的一行格式
git log --graph # 图形化显示分支合并历史
# 查看特定文件的历史
git log -- 文件路径
# 查看文件差异
git diff # 工作区与暂存区的差异
git diff --staged # 暂存区与最新提交的差异
git diff 提交1 提交2 # 两个提交之间的差异
分支操作
分支是Git最强大的功能之一,可以让你同时进行多条开发线的工作。
# 查看所有分支
git branch # 本地分支
git branch -r # 远程分支
git branch -a # 所有分支
# 创建新分支
git branch 分支名
# 切换分支
git checkout 分支名
git switch 分支名 # Git 2.23版本引入的新命令
# 创建并切换到新分支
git checkout -b 分支名
git switch -c 分支名
# 合并分支
git merge 源分支 # 将源分支合并到当前分支
# 删除分支
git branch -d 分支名 # 安全删除(只有在分支已合并后才能删除)
git branch -D 分支名 # 强制删除
分支工作流举例
假设你要开发一个新功能,可以按以下步骤操作:
# 1. 确保当前在main分支并更新
git checkout main
git pull
# 2. 创建并切换到新特性分支
git checkout -b feature/new-feature
# 3. 开发新功能,定期提交
git add .
git commit -m "添加新功能的XXX部分"
# ... 继续开发和提交 ...
# 4. 完成开发后,推送到远程(可选)
git push origin feature/new-feature
# 5. 切回main分支并更新
git checkout main
git pull
# 6. 合并特性分支
git merge feature/new-feature
# 7. 解决可能的冲突后,推送到远程
git push origin main
# 8. 删除特性分支(可选)
git branch -d feature/new-feature
git push origin --delete feature/new-feature # 删除远程分支
处理冲突
当多人修改同一个文件的同一部分时,合并时会产生冲突。Git会在文件中标记冲突区域,你需要手动解决:
解决冲突的步骤:
- 打开冲突文件,找到冲突标记
- 编辑文件解决冲突(保留需要的内容,删除冲突标记)
- 添加解决后的文件到暂存区
- 提交更改
远程仓库操作
Git的分布式特性使得可以轻松与远程仓库同步:
# 查看远程仓库
git remote -v
# 添加远程仓库
git remote add 远程名 远程URL
# 从远程获取更新(不合并)
git fetch 远程名
# 拉取并合并远程更新
git pull 远程名 分支名
# 推送本地更改到远程
git push 远程名 分支名
# 删除远程分支
git push 远程名 --delete 分支名
撤销与恢复
Git提供了多种方式来撤销错误的更改:
工作区和暂存区的撤销
# 撤销工作区的修改(未暂存)
git checkout -- 文件名 # 旧语法
git restore 文件名 # 新语法(Git 2.23+)
# 撤销暂存的更改(已add但未commit)
git reset HEAD 文件名 # 旧语法
git restore --staged 文件名 # 新语法(Git 2.23+)
提交的撤销
# 修改最近的提交(比如修改提交信息或添加遗漏的文件)
git commit --amend
# 回退到某个提交(保留更改但不提交)
git reset 提交ID
# 回退到某个提交(丢弃更改)
git reset --hard 提交ID
# 创建一个新提交来撤销指定提交的更改
git revert 提交ID
临时保存工作现场
# 保存当前工作进度
git stash
# 查看保存的工作进度列表
git stash list
# 恢复最近的工作进度
git stash apply # 保留stash
git stash pop # 恢复并删除stash
# 删除工作进度
git stash drop # 删除最近的stash
git stash clear # 删除所有stash
Git高级功能
标签(Tag)
标签用于标记特定的提交点,常用于版本发布:
# 创建轻量标签
git tag v1.0
# 创建附注标签(带描述信息)
git tag -a v1.0 -m "版本1.0发布"
# 查看标签
git tag
# 查看特定标签信息
git show v1.0
# 推送标签到远程
git push origin v1.0 # 推送特定标签
git push origin --tags # 推送所有标签
重基(Rebase)
重基是一种整理提交历史的方法,可以使历史更加清晰:
警告:重基的风险
重基会改变提交历史,不要对已经推送到公共仓库的提交进行重基,除非你确定没有其他人在使用这些提交。
实际工作流示例
个人项目工作流
# 初始化新项目
mkdir my-project
cd my-project
git init
# 创建文件并提交
echo "# My Project" > README.md
git add README.md
git commit -m "初始化项目"
# 添加远程仓库(假设已在GitHub创建)
git remote add origin https://github.com/username/my-project.git
git push -u origin main
# 日常开发循环
# 1. 修改文件
# 2. 查看状态
git status
# 3. 暂存和提交
git add .
git commit -m "更新功能"
# 4. 推送到远程
git push
团队协作工作流(GitHub Flow)
GitHub Flow是一种适合小团队的简单工作流:
- 从main分支创建特性分支
- 在特性分支上开发并提交
- 推送到远程并创建Pull Request(PR)
- 讨论和代码审查
- 合并PR并删除特性分支
# 假设已克隆仓库
git clone https://github.com/team/project.git
cd project
# 创建特性分支
git checkout -b feature/awesome-feature
# 开发并提交
# ... 编辑文件 ...
git add .
git commit -m "实现了惊人的功能"
# 推送到远程
git push -u origin feature/awesome-feature
# 在GitHub上创建PR
# 审查完成后,合并PR
# 更新本地main分支
git checkout main
git pull
# 删除本地特性分支
git branch -d feature/awesome-feature
最佳实践
提交信息规范
好的提交信息对项目历史至关重要。一个常用的格式是:
常见的类型包括:
- feat
: 新功能
- fix
: 修复Bug
- docs
: 文档更新
- style
: 代码风格修改(不影响功能)
- refactor
: 代码重构
- test
: 测试相关
- chore
: 构建过程或辅助工具变动
示例:
.gitignore文件
.gitignore
文件用于指定Git应该忽略的文件和目录,避免将不必要的文件(如编译生成的文件、临时文件、环境配置等)添加到仓库中:
# 编译输出
/dist
/build
# 依赖目录
/node_modules
/vendor
# 日志文件
*.log
# 环境变量文件
.env
.env.local
# 操作系统文件
.DS_Store
Thumbs.db
Git别名
可以为常用命令创建别名,提高效率:
# 设置别名
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 co main # 等同于 git checkout main
git br # 等同于 git branch
实战案例:开源项目贡献流程
假设你想为GitHub上的开源项目做贡献,一般流程是:
- Fork项目到自己的GitHub账号
- 克隆自己的Fork到本地
- 添加原始仓库为远程上游
- 创建特性分支
- 开发并提交
- 推送到自己的Fork
- 创建Pull Request
# 假设你想贡献给 https://github.com/original/project
# 1. 在GitHub上Fork项目(点击Fork按钮)
# 2. 克隆你的Fork到本地
git clone https://github.com/你的用户名/project.git
cd project
# 3. 添加上游远程
git remote add upstream https://github.com/original/project.git
# 4. 创建特性分支
git checkout -b feature/my-contribution
# 5. 开发并提交
# ... 编辑文件 ...
git add .
git commit -m "添加了惊人的新功能"
# 6. 确保与上游同步
git fetch upstream
git rebase upstream/main
# 7. 推送到你的Fork
git push origin feature/my-contribution
# 8. 在GitHub上创建Pull Request
Git工具和集成
除了命令行,还有许多工具可以帮助你更好地使用Git:
- GUI客户端:GitKraken, Sourcetree, GitHub Desktop
- IDE集成:VS Code, IntelliJ IDEA, Eclipse的Git插件
- 代码审查:GitHub Pull Requests, GitLab Merge Requests
- CI/CD:GitHub Actions, GitLab CI, Jenkins
练习题
- 创建一个新的Git仓库,添加几个文件并提交。然后创建一个新分支,修改一些文件,最后将这些更改合并回主分支。
- 模拟一个合并冲突的情况并解决它。
- 使用
git rebase -i
合并你的多个连续提交为一个提交。 - 创建一个
.gitignore
文件,配置忽略项目中的临时文件和构建输出。
常见问题解决
"拒绝推送"错误
原因:远程仓库有你本地没有的更改
解决方法:先拉取并合并远程更改,然后再推送
意外提交了敏感信息
# 从历史中完全删除文件
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch 敏感文件路径" \
--prune-empty --tag-name-filter cat -- --all
# 强制推送更改
git push origin --force --all
注意
这个操作会重写历史,应谨慎使用,且需要所有协作者的配合。
无法记住凭证
设置凭证存储:
# 缓存凭证15分钟
git config --global credential.helper cache
# 永久存储凭证
git config --global credential.helper store
# 使用系统钥匙串(macOS)
git config --global credential.helper osxkeychain
# 使用Windows凭证管理器
git config --global credential.helper wincred
小结
Git是一个强大的版本控制工具,掌握它可以让你在个人项目和团队协作中更加高效。本教程只是Git的入门,随着你的深入使用,你会发现Git的更多高级功能和技巧。
记住一句Git社区的名言:
"分支很便宜,合并也很容易,不要害怕使用它们。"
继续学习和实践,你会成为Git使用的专家!