1、版本控制 主要用于多人团队协作的,主要用于管理修改记录、修改人、修改时间、方便进行版本的回退。
>> SVN
集中式版本控制系统
>> Git
是一个分布式版本控制系统。
2、Git
2.1 概念
>> 工作区(workspace)
自己电脑上项目所在目录。
>> 暂存区(Index)
一般是在当前项目 .git 目录下的 index文件
>> 本地仓库(本地版本库)(repository)
在当前项目 .git 目录下
>> 远程仓库(远程端版本库)
将代码放在了服务器上。
2.2 Git 配置命令
// 安装完 Git 后做的第一件事:设置用户名与邮箱地址
// --global 是否全局设置
git config --global user.name '你的用户名'
git config --global user.email '你的邮箱'
// 查看当前 Git 配置
git config --list
2.3 仓库初始化
>> 新项目的仓库创建
mkdir 项目名(文件夹名字)
cd 项目名(进入项目目录)
# 仓库初始化:会在当前目录下创建一个 .git 的目录
git init
2.4 查看当前项目的状态
git status // 查看项目状态
2.5 文件跟踪 – 将工作区文件变动提交到暂存区
git add 文件名
git add . // 把所有的新增的、修改的都添加到暂存区
git add -A // 添加所有变化(新增、修改、删除)
2.6 文件跟踪 – 将暂存区的文件提交到本地仓库
git commit -m 本次提交说明
2.7 历史记录
git log // 查看版本历史记录
git reflog // 查看历史操作记录
2.8 文件删除
git rm 文件 // 删除工作区文件,并且也从暂存区中删除对应的文件记录
>> 通过 git rm 删除文件后,只需要 git commit
>> 但是如果是手动直接删除文件或者通过 rm 删除,则需要 git add 和 git commit
git rm --cached 文件 // 停止跟踪指定的文件
2.9 版本回退
>> git reset
# 语法 -- 回退到指定版本,之后的版本记录会消失。
git reset [--hard] <commit-id>
>> git revert
# 语法 -- 只会撤销某一次操作,在这之后和之前的提交不变
git revert <commit-id>
# 举例
git revert 1c8da79 // 撤销指定的版本
git revert HEAD // 撤销上一次
git revert HEAD^ 撤销上上次
git revert HEAD~3 // 撤销上上上次
2.10 远程仓库
>> 仓库类型
* GitHub
* gitee(码云)
* 自建服务器
>> git remote 远端
git remote add <remote-name> <url> // 关联远程仓库
git remote // 查看本地仓库关联的远程仓库
>> git fetch + git merge
>> git pull
git pull <远程主机名> <远程分支名>:<本地分支名>
# 使用 rebase 模式进行合并 -- 有更好的代码提交树
git pull --rebase <远程主机名> <远程分支名>:<本地分支名>
# 举例
git pull origin master:dev // 将远程端 origin 的 master 分支 拉取下来和本地的 dev 分支合并
git pull origin master // 将远程端的 master 与当前分支合并
>> git push
git push <远程主机名> <本地分支名>:<远程分支名>
# 举例
git push origin master // 将本地 master 推送到远程端的 master
git push origin dev:dev // 将本地的 dev 分支 推送到远程端的 dev 上
git push -u origin master // 一般第一次推送加上 -u,方便以后的推送只需要写 git push
>> git clone
>> 本地仓库与远程仓库关联
// 直接克隆别人的项目
git clone 远程端url
// 将本地项目上传到远程端
1. 远程端创建仓库;
2. 将远程端与本地端关联;
3. 同步远程仓库到本地;
4. 本地项目推送至远程端;
2.11 忽略文件
根目录下新建 .gitignore 文件。
不需要被 Git 跟踪管理的文件需要加入该文件(node_modules)。
>> 注意事项:
一般建议在初始化仓库之前创建。
>> 匹配规则(正则):
以 # 开头,代表注释
*:任意多个字符
**:任意目录
?:匹配一个任意字符
[abc]
!:不忽略
以 / 开头的路径:要忽略此目录下的子文件
以 / 结尾的路径:要忽略此目录下所有的目录。
# 如:
*.txt 忽略所有 .txt 结尾的文件
/todo 忽略根目录下的 todo 文件
todo/ 忽略 todo 文件夹下的所有文件
js/** /*.js 忽略 js 目录下所有 .js 文件
|