跳转至

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之前,需要先安装它:

# 访问 https://git-scm.com/download/win 下载安装程序
# 或使用Winget
winget install --id Git.Git -e --source winget
# 使用Homebrew
brew install git

# 或通过Xcode Command Line Tools
xcode-select --install
sudo apt update
sudo apt install git
sudo dnf install git

配置Git

安装后,你需要设置你的身份信息,这将出现在你的提交记录中:

# 设置全局用户名
git config --global user.name "你的名字"

# 设置全局邮箱
git config --global user.email "你的邮箱@example.com"

# 查看配置
git config --list

Git基础操作

创建或克隆仓库

# 在当前目录初始化Git仓库
git init
# 从远程克隆仓库到本地
git clone https://github.com/用户名/仓库名.git

# 克隆到指定目录
git clone https://github.com/用户名/仓库名.git 目标目录

# 克隆特定分支
git clone -b 分支名 https://github.com/用户名/仓库名.git

基本工作流程

Git的基本工作流程如下:

  1. 修改文件(在工作区)
  2. 暂存更改(添加到暂存区)
  3. 提交更改(保存到本地仓库)
  4. 推送更改(同步到远程仓库,可选)
# 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会在文件中标记冲突区域,你需要手动解决:

<<<<<<< HEAD
当前分支的内容
=======
要合并分支的内容
>>>>>>> feature/new-feature

解决冲突的步骤:

  1. 打开冲突文件,找到冲突标记
  2. 编辑文件解决冲突(保留需要的内容,删除冲突标记)
  3. 添加解决后的文件到暂存区
  4. 提交更改
# 解决冲突后
git add 冲突文件
git commit -m "解决合并冲突"

远程仓库操作

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)

重基是一种整理提交历史的方法,可以使历史更加清晰:

# 将当前分支的提交移动到指定分支之上
git rebase 目标分支

# 交互式重基,可以调整、合并、删除提交
git rebase -i 起始提交
警告:重基的风险

重基会改变提交历史,不要对已经推送到公共仓库的提交进行重基,除非你确定没有其他人在使用这些提交。

实际工作流示例

个人项目工作流

# 初始化新项目
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是一种适合小团队的简单工作流:

  1. 从main分支创建特性分支
  2. 在特性分支上开发并提交
  3. 推送到远程并创建Pull Request(PR)
  4. 讨论和代码审查
  5. 合并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

最佳实践

提交信息规范

好的提交信息对项目历史至关重要。一个常用的格式是:

类型: 简短描述(不超过50个字符)

详细描述(可选,每行不超过72个字符)

常见的类型包括: - feat: 新功能 - fix: 修复Bug - docs: 文档更新 - style: 代码风格修改(不影响功能) - refactor: 代码重构 - test: 测试相关 - chore: 构建过程或辅助工具变动

示例:

feat: 添加用户登录功能

实现了基于JWT的认证机制,包括:
- 登录表单和验证
- 令牌生成和验证
- 会话管理

.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上的开源项目做贡献,一般流程是:

  1. Fork项目到自己的GitHub账号
  2. 克隆自己的Fork到本地
  3. 添加原始仓库为远程上游
  4. 创建特性分支
  5. 开发并提交
  6. 推送到自己的Fork
  7. 创建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

练习题

  1. 创建一个新的Git仓库,添加几个文件并提交。然后创建一个新分支,修改一些文件,最后将这些更改合并回主分支。
  2. 模拟一个合并冲突的情况并解决它。
  3. 使用git rebase -i合并你的多个连续提交为一个提交。
  4. 创建一个.gitignore文件,配置忽略项目中的临时文件和构建输出。

常见问题解决

"拒绝推送"错误

! [rejected] main -> main (fetch first)

原因:远程仓库有你本地没有的更改
解决方法:先拉取并合并远程更改,然后再推送

git pull
git push

意外提交了敏感信息

# 从历史中完全删除文件
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使用的专家!