1、基础概念
1.1 版本控制系统
版本控制系统是一种用于记录文件变化、方便回溯和写作的工作,他主要用于跟踪文件的历史变更
-
查看某文件的所有历史版本
-
回退到任意历史版本
-
对比不同版本之间的差异
-
多人协作时比卖你覆盖彼此的修改
常见类型:
-
本地版本控制:如RCS,只适用于单机使用
-
集中式版本控制:如SVN,所有版本数据都存放在一个中央服务区上
-
分布式版本控制:如Git,每个开发者本地都有完整的仓库历史
为什么要用版本控制系统
-
防止误删或错误修改导致的数据丢失
-
支持多人协作开发,减少冲突
-
可以追溯每一次修改是谁做的、为什么改
-
支持并行开发多个功能(分支)
-
提高团队效率和代码质量
1.2 git是什么
git是目前最流程的分布式版本控制系统,由 Linux 内核创始人 Linus Torvalds 于 2005 年开发
git的特点:
特点 | 描述 |
---|---|
分布式 | 每个开发者本地都有完整的仓库,不需要依赖中央服务器 |
快速高效 | 几乎所有操作都在本地完成,速度很快 |
支持非线性开发 | 可以轻松创建、合并、删除分支 |
数据完整性 | 使用 SHA-1 哈希校验机制,确保数据不可篡改 |
开源免费 | 社区活跃,文档丰富,支持多种平台 |
git 的核心思想:
-
所有提交(commit)都是对文件快照的记录
-
每次提交都会生成一个唯一的哈希值作为标识
-
Git 不只是记录差异,而是记录整个文件系统的状态
1.3 仓库是什么?
仓库是git存放项目文件和版本历史的地方,可以想象成一个“带有历史记录的文件夹”
创建仓库的方式有两种:
-
初始化一个新的仓库(空项目)
git init
这会在当前目录下创建一个.git子目录,里面保存了所有的git元数据
-
克隆一个已有的远程仓库(如github上的项目)
git clone https://地址
这会把远程仓库完整地复制到本地服务器上,包括所有的历史记录
2.安装git并配置用户信息
这一步是使用git的前提,安装完成后就可以进行版本控制操作了
2.1 下载与安装git
全程使用windows系统
官网下载地址:Git - 下载软件包
推荐使用默认设置安装即可
安装成功后会自带一个Git Bash工具,可以用来运行git命令
2.2 配置全局用户名和邮箱
git每次提交都会记录是谁做的修改,所以必须要配置用户名和邮箱
设置用户名
git config --global user.name "用户名"
设置邮箱:
git config --gloabl user.email "邮箱号"
--global表示这是全局配置,适用于当前用户的所有git仓胡,如果你只想为某个项目设置特定的用户名和邮箱,可以在对应仓库目录中去掉--global参数
查看当前配置信息:
git config --list
正常来说可以看到如下输出:
user.name=用户名 ser.email=邮箱号
2.3 可选配置(提升效率)
设置默认编辑器(如 VS Code)
git config --global core.editor "code --wait"
设置默认分支名称为 main
(替代旧版的 master
):
git config --global init.defaultBranch main
查看帮助文档:
git help config
小练习:验证安装和配置
-
打开终端或 Git Bash
-
输入以下命令:
git --version git config --list
确保你能看到 Git 版本号以及你刚刚设置的用户名和邮箱。
3.创建或克隆仓库
在git中,仓库是存放项目代码和历史记录的地方。可以选择从零开始创建一个新的仓库,或者从远程服务器上克隆一个已有的仓库
3.1 创建新仓库(本地初始化)
git init
如果有一个全新的项目文件夹,并希望用git来管理他,可以使用git init
来初始化一个空的git仓库
步骤:
#进入你的文件夹 cd your project #初始化git仓库 git init
执行完后,git会在该目录下创建一个.git文件夹(隐藏的),里面保存了所有的git元数据
注意:此时这个仓库是空的,还没有任何提交内容
3.2 克隆远程仓库(已有项目)
如果需要参加一个已经存在的项目(比如github上的开源项目),通常会使用git clone命令来复制整个仓库到本地
git clone <仓库地址>
步骤:
git clone https://github.com/(具体的地址)
持的协议包括:
-
HTTPS(最常用)
-
SSH(推荐用于频繁推送操作)
-
Git 协议(只读)
3.3 查看当前仓库状态
完成创建或克隆后,建议查看一下当前仓库的状态,确认是否正常工作。
git status
输出示例:
On branch main No commits yet nothing to commit (create/copy files and use git add to track)
3.4 添加并提交第一个文件
# 创建一个测试文件 echo "Hello, Git!" > README.md # 添加文件到暂存区 git add README.md # 提交更改 git commit -m "Initial commit"
4. 基本操作
4.1 查看仓库状态 git status
显示当前工作目录和暂存区的状态,帮助了解哪些文件被修改了,哪些已添加但未提交,是否可以提交等
常见的输出解释:
-
ntracked files:新增但未添加到暂存区的文件。
-
Changes not staged for commit:已跟踪但有修改的文件,尚未添加到暂存区。
-
Changes to be committed:已添加到暂存区,等待提交。
这个命令建议每次操作前都运行一次
4.2 添加文件到暂存区 git add
将修改过的文件或新文件添加到“暂存区”,准备提交
添加某个特定的文件
git add file.tat
添加所有文件
git add .
.gitignore文件中定义的文件不会被加入
4.3提交更改 git commit
将暂存区中的更改正式保存为一个提交,并附上描述信息
git commit
这会打开默认编辑器让你输入提交信息(使用vs的话,则会在弹出窗口中输入)
提交信息规范建议:
-
简明扼要
-
使用动词开头,例如
-
Fix bug in login flow
-
Update dependencies
-
Add user profile page
-
4.4 查看提交历史 git log
查看项目的历史提交记录,包括提交哈希值、作者、时间、提交信息等
显示完整历史:
git log
简介显示一行一条
git log --online
查看某个文件的提交历史
git log file.txt
4.5 撤销添加(从暂存区移除) git reset
如果不小心条件了错误的文件到暂存区,可以用这个命令撤销
移除某个文件的暂存状态:
git reset file.txt
取消所有暂存内容:
git reset
4.6小结
命令 | 功能 |
---|---|
git status | 查看当前状态 |
git add <filename> | 添加单个文件到暂存区 |
git add . | 添加所有文件到暂存区 |
git commit -m "message" | 提交更改 |
git log | 查看提交历史 |
git reset | 取消暂存 |
5.分支管理
分支是git的核心功能之一,它可以让你在不影响代码的情况下开发新功能,修复bug或尝试新想法。
5.1什么是分支?
在git中,分支是一个指向特定提交的指针。默认情况下,git创建的第一个分支叫做main或master(取决于配置)
可以通过创建多个分支来并行开发不同的功能或版本,互不干扰
5.2查看当前分支:git branch
列出所有本地分支,并显示当前所在分支
git branch
输出示例:
* main feature/login bugfix/header
5.3创建新分支:git branch 分支名称
创建一个新的分支,但不会自动切换过去
示例:
git branch test
5.4切换分支:git checkout 分支名称
切换到指定的分支,工作目录内容会更新为该分支的最新状态
示例:
git checkout test
5.5创建并切换分支:git checkout -b 分支名称
一步完成创建+切换
git checkout -b test
这个命令等价于
git branch test git checkout test
5.6 合并分支
将指定分支的内容合并到当前分支中
通常用于将功能分支合并会主分支
git checkout main git merge test
这会把test分支上的所有更改合并到main分支上
注意:
如果两个分支对同一个文件进行了修改,可能会出现冲突,需要手动解决
解决后是由git add . 标记冲突已解决,在运行一次git commit完成合并
5.7删除分支:git branch -d 分支名称
删除已经合并的分支
git branch -d test
如果确定某个分支未被合并但仍然想删除,使用-D参数
git branch -D test
5.8推送远程分支
当你创建了一个本地分支并希望同步到远程仓库是,需要推送这个分支
git push origin test
之后其他的协作者及可以看到并拉取这个分支
5.9拉取远程分支
如果别人推送了一个新分支到远程仓库,可以将其拉取到本地
git fetch origin git checkout -b test origin/test
这样就创建了一个与远程分支关联的本地分支
5.10小结
命令 | 功能 |
---|---|
git branch | 查看所有本地分支 |
git branch <name> | 创建新分支 |
git checkout <name> | 切换分支 |
git checkout -b <name> | 创建并切换分支 |
git merge <name> | 合并指定分支到当前分支 |
git branch -d <name> | 删除已合并的分支 |
git branch -D <name> | 强制删除分支 |
git push origin <name> | 推送本地分支到远程仓库 |
git checkout -b <local> origin/<remote> | 拉取远程分支 |
6.合并与冲突解决
在团队协作开发中,多个开发者可能会同时修改同一个文件。当你尝试将这些更改合并时,git可能无法自动判断该保留哪一部分的内容,此时就会产生冲突。
6.1合并分支:git merge
将一个分支的更改合并到当前所在的分支中
git checkout main git merge test
这会把test分支上的所有更改合并到main分支上
6.2冲突产生的原因
当两个分支对同一个文件的统一部分进行了不同的修改,git就无法自动决定使用那一段代码,于是标记为冲突,需要手动解决。
6.3冲突的表现形式
当你执行git merge
或git pull
操作后,如果发生冲突,git会在冲突文件中标记如下内容
<<<<<<< HEAD 这是当前分支的内容 ======= 这是要合并进来的分支内容 >>>>>>> branch-name
你需要手动选择保留哪些内容,并删除 <<<<<<<
, =======
, >>>>>>>
这些标记。
6.4解决冲突的步骤
-
查看冲突文件
git status
输出中会列出有冲突的文件
-
打开冲突文件,你会看到类似下面的标记
<<<<<<< HEAD Hello, this is the main branch. ======= Hello, this is the feature branch. >>>>>>> feature-branch
-
手动编辑文件,选择保留的内容
Hello, this is a merged message from both branches.
-
保存文件并删除冲突标记
-
将解决后的文件添加到暂存区
git add <file>
-
完成合并并提交
git commit
git会自动生成一个默认的提交信息,可以直接保存或修改
6.5查看冲突状态:git diff
如果不确定哪里发生了冲突,可以使用git diff查看详细差异
他结果中会高亮显示冲突区域
6.6 放弃合并(中止冲突处理)
如果在解决冲突的过程中发现有问题,或者想从头再来,可以中止合并操作
git merge --abort
这个命令会撤销正在进行的合并操作,并恢复到合并前的状态
6.7避免冲突的最佳时间
建议 | 说明 |
---|---|
经常拉取更新 | 定期执行 git pull 获取最新代码,减少冲突发生的概率 |
小颗粒提交 | 每次提交只做一件事,便于理解和回滚 |
明确沟通 | 团队成员之间明确谁负责哪些文件,避免多人同时修改相同文件 |
使用 Pull Request | 在 GitHub/Gitee 上通过 PR 提交代码,方便审查和讨论后再合并 |
6.8小结
命令 | 功能 |
---|---|
git merge <branch> | 合并指定分支到当前分支 |
git status | 查看冲突文件 |
git diff | 查看冲突细节 |
git add <file> | 标记冲突已解决 |
git commit | 完成合并提交 |
git merge --abort | 中止当前合并操作 |