1. Git 简介
Git 是一个分布式版本控制系统,由 Linux 创始人 Linus Torvalds 在 2005 年创建,用于 Linux 内核的开发。它可以高效地处理从小型到大型项目的所有内容,并且是完全免费和开源的。
1.1 Git 的特点
分布式系统 :每个开发者都拥有完整的代码库副本
快速而高效 :设计用于处理大型项目
数据完整性 :Git 确保所有数据的完整性
非线性开发 :支持多分支并行开发
灵活的工作流 :适应各种开发模式
1.2 Git 与其他版本控制系统的区别
与 SVN 等集中式版本控制系统不同,Git 不依赖中央服务器,每个人的本地仓库都包含完整的历史记录。这使得 Git 在网络不可用时仍然可以工作,并且速度更快。
学习建议
Git 的概念可能在开始时有些难以理解,尤其是对于从集中式版本控制系统转过来的人。但一旦掌握了基本原理,Git 将成为一个非常强大的工具。
2. 安装与配置
在开始使用 Git 之前,我们需要先安装 Git 并进行基本配置。
2.1 安装 Git
Windows
从 Git 官网 下载安装程序,按照向导进行安装。
macOS
可以通过 Homebrew 安装:
brew install git
Linux
对于 Debian/Ubuntu:
sudo apt-get update
sudo apt-get install git
对于 Fedora:
sudo dnf install git
2.2 配置 Git
安装 Git 后,需要设置用户名和邮箱:
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
查看所有配置:
git config --list
2.3 配置 SSH 密钥
为了方便与 GitHub 等远程仓库通信,建议配置 SSH 密钥:
ssh-keygen -t rsa -b 4096 -C "你的邮箱"
然后将生成的公钥(通常在 ~/.ssh/id_rsa.pub)添加到 GitHub 的 SSH Keys 中。
配置建议
设置一些有用的别名可以提高工作效率,例如:
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
3. 基本命令
Git 的基本工作流程包括:修改文件,将更改添加到暂存区,然后提交到版本库。
3.1 创建与克隆仓库
初始化新仓库:
git init
克隆现有仓库:
git clone https://github.com/username/repository.git
3.2 基本操作
查看状态:
git status
添加文件到暂存区:
git add filename # 添加单个文件
git add . # 添加所有更改
提交更改:
git commit -m "提交信息"
查看提交历史:
git log
交互式演示:基本 Git 操作
尝试下面的命令来体验 Git 的基本工作流程:
$ git init
Initialized empty Git repository in /project/.git/
$ echo "# My Project" > README.md
$ git status
On branch master
No commits yet
Untracked files:
(use "git add ..." to include in what will be committed)
README.md
$ git add README.md
$ git commit -m "Initial commit"
[master (root-commit) a1b2c3d] Initial commit
1 file changed, 1 insertion(+)
create mode 100644 README.md
3.3 撤销更改
撤销工作区的更改:
git checkout -- filename
撤销暂存区的更改:
git reset HEAD filename
修改最近的提交:
git commit --amend
4. 分支管理
分支是 Git 的核心概念之一,允许并行开发而不会相互干扰。
4.1 分支操作
查看分支:
git branch # 查看本地分支
git branch -r # 查看远程分支
git branch -a # 查看所有分支
创建与切换分支:
git branch feature # 创建分支
git checkout feature # 切换分支
git checkout -b feature # 创建并切换分支
4.2 合并分支
将其他分支合并到当前分支:
git merge feature
解决合并冲突后标记为已解决:
git add filename
git commit
4.3 变基(Rebase)
与合并类似,但会重写提交历史:
git checkout feature
git rebase master
分支使用建议
一个常见的工作流是:
master
:稳定的生产分支
develop
:开发分支
feature/*
:功能分支
hotfix/*
:紧急修复分支
5. 远程仓库
远程仓库允许多人协作开发同一个项目。
5.1 管理远程仓库
查看远程仓库:
git remote -v
添加远程仓库:
git remote add origin https://github.com/username/repository.git
修改远程仓库地址:
git remote set-url origin https://github.com/username/new-repository.git
5.2 同步远程仓库
推送本地分支到远程:
git push origin master
拉取远程更新到本地:
git fetch origin # 只下载远程更新
git pull origin master # 下载并合并
5.3 处理远程分支
跟踪远程分支:
git checkout --track origin/feature
删除远程分支:
git push origin --delete feature
6. Git 工作流
Git 工作流是团队协作的最佳实践模式。
6.1 集中式工作流
所有开发者直接在 master 分支上工作,类似于 SVN。
6.2 功能分支工作流
每个新功能都在专门的分支上开发,然后合并回主分支。
6.3 Gitflow 工作流
严格的分支模型,包括 master、develop、feature、release 和 hotfix 分支。
master
develop
feature
hotfix
release
6.4 Forking 工作流
常用于开源项目,每个开发者都有自己的远程仓库副本。
7. 高级技巧
掌握以下高级技巧可以更有效地使用 Git。
7.1 储藏(Stash)
暂时保存修改而不提交:
git stash
git stash list
git stash apply
git stash pop
git stash drop
7.2 Cherry-pick
应用特定提交的更改:
git cherry-pick commitID
7.3 交互式变基
整理提交历史:
git rebase -i HEAD~3
7.4 子模块
在一个仓库中包含其他仓库:
git submodule add https://github.com/username/library.git lib
git submodule init
git submodule update
7.5 Git Hooks
自定义 Git 的行为:
#!/bin/sh
# pre-commit hook example
if git diff --cached | grep -q "console.log"
then
echo "Warning: You have console.log statements in your code."
exit 1
fi
8. 最佳实践
遵循这些最佳实践可以提高团队协作效率。
8.1 提交规范
编写明确的提交信息:
feat: 添加新功能
fix: 修复 bug
docs: 更新文档
style: 代码风格调整
refactor: 重构代码
test: 添加测试
chore: 构建过程或辅助工具的变动
8.2 频繁提交
小而频繁的提交比大而不频繁的提交更好,这样可以更容易追踪变更。
8.3 保持主分支稳定
确保主分支(如 master)始终可构建,可部署。
8.4 使用 .gitignore
忽略不应该提交的文件和目录:
# Node.js
node_modules/
npm-debug.log
# IDE
.idea/
.vscode/
# 构建输出
dist/
build/
# 环境变量
.env
.env.local
团队协作提示
建立清晰的分支策略和合并流程,并确保团队成员都了解并遵循。使用 Pull Request 或 Merge Request 进行代码审查。
9. 常见问题解决
使用 Git 时可能遇到的问题及解决方案。
9.1 撤销错误操作
撤销合并:
git merge --abort
撤销提交:
git reset --soft HEAD^ # 保留更改
git reset --hard HEAD^ # 丢弃更改
9.2 找回丢失的提交
使用 reflog 找回:
git reflog
git checkout commitID
9.3 解决合并冲突
当发生合并冲突时,Git 会在文件中标记冲突区域:
<<<<<<< HEAD
当前分支的内容
=======
要合并的分支的内容
>>>>>>> feature
手动编辑文件解决冲突,然后:
git add filename
git commit
9.4 清理仓库
删除未跟踪的文件:
git clean -n # 预览将被删除的文件
git clean -f # 删除文件
压缩仓库:
git gc