Git中常用的概念
Git是免费、开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。
工作目录(workspace):是项目的目录,保存项目所有的文件,在电脑本机能够看到的文件和目录
暂存区(index/stage):是内存中的一个区域,用于临时存储项目中文件的变化
Git仓库(Repository):是一个特殊的目录,保存着项目中所有文件的变化记录,执行git clone地址就是把
远程仓库克隆到本地仓库,他是一个存放本地的版本库,
一、Git命令
第一次使用Git软件之前,告诉Git你是谁
git config --global user.name "自定义用户名"
git config --global user.email "用户邮箱"
查看配置列表
git config --list
1.初始化Git仓库
git init
会在当前目录下生成一个.git目录,用于存储项目中所有文件的变化
2.查看Git系统状态
git status
可以检测哪些文件发生了变化,例如:新文件出现、文件修改、文件删除…
3.将文件从工作目录添加到暂存区
git add 文件名称 #将指定的文件添加到暂存区
git add . #将所有变化的文件添加到暂存区
4.将暂存区文件提交到Git仓库
git commit -m "提交说明"
5.查看提交日志
git log # 只能查看之前的提交日志,无法查看之后的
git reflog # 可以查看所有的提交日志、回退记录...
步骤1:新建2.html,随便写内容,添加到暂存区,提交到仓库
步骤2:新建css目录,添加1.css和2.css文件,随便写内容,添加到暂存区,提交到仓库
步骤3:删除1.html和1.css,添加到暂存区,提交到仓库
6.历史回退
git reset --hard 提交ID
练习:在tedu目录下初始化一个Git仓库
步骤1:新建index.html文件,随便写内容,添加到暂存区,提交仓库
步骤2:新建list.html和detail.html,随便写内容,添加到暂存区,提交到仓库
步骤3:新建img目录,放入两张图片,添加到暂存区,提交到仓库
步骤4:修改index.html文件,删除detail.html,添加到暂存区,提交到仓库
步骤5:查看所有的提交日志,回退到第1个版本,再回退到最新版
7.忽略文件
有些文件不需要Git系统来管理,可以忽略
在工作目录中,新建 .gitignore 文件,把要忽略的文件写入进去
通常 node_modules目录需要被忽略的文件。
git remote
git remote 查看关联的远程仓库名称
git remote add origin url 添加一个远程仓库
git remote show [remote] 显示某个远程仓库的信息
二、远程仓库(代码托管平台)
码云 www.gitee.com 国内最大
GitHub www.github.com 全球最大
1.将本地仓库推送到远程仓库
git push -u origin 分支名称 # 第一次提交
git push origin 分支名称 # 非首次提交
输入账号密码后,Windows会记录账号密码,需要删除记录的,才可以重新输入
打开 控制面板 -> 凭据管理器 -> Windows凭据
2.将一个远程仓库克隆到本地
在要克隆(下载)的目录中,打开git bash
git clone 仓库地址
3.拉取一个分支到本地仓库
git pull 仓库地址 分支名称
三、分支
在不影响主线的前提下,实现并行开发,默认只有一个主分支master
1.查看所有的分支
git branch
2.新建分支
git branch 分支名称
拷贝当前分支中提交的版本的文件拷贝一个新的分支
3.切换分支
git checkout 分支名称
4.合并分支
git merge 分支名称
合并过程中可能会产生冲突,需要打开用冲突文件,手动解决。
重新提交到仓库
练习:新建商品分支product,切换到商品分支,新建路由器模块product.js,随便写代码,添加到暂存区,最后提交仓库。
练习:在主分支下新建购物车分支shopping,切换到购物车分支,新建路由器模块shopping.js,随便写代码,添加到暂存区,最后提交到仓库。
练习:在主分支下新建订单分支order,切换到订单分支,新建路由器模块order.js,随便写代码,添加到暂存区,最后提交到仓库。
最后切换回主分支
补充:
创建与合并分支
在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master
分支。HEAD
严格来说不是指向提交,而是指向master
,master
才是指向提交的,所以,HEAD
指向的就是当前分支。
一开始的时候,master
分支是一条线,Git用master
指向最新的提交,再用HEAD
指向master
,就能确定当前分支,以及当前分支的提交点:
HEAD
│
│
▼
master
│
│
▼
┌───┐ ┌───┐ ┌───┐
│ │───▶│ │───▶│ │
└───┘ └───┘ └───┘
每次提交,master
分支都会向前移动一步,这样,随着你不断提交,master
分支的线也越来越长。
当我们创建新的分支,例如dev
时,Git新建了一个指针叫dev
,指向master
相同的提交,再把HEAD
指向dev
,就表示当前分支在dev
上:
master
│
│
▼
┌───┐ ┌───┐ ┌───┐
│ │───▶│ │───▶│ │
└───┘ └───┘ └───┘
▲
│
│
dev
▲
│
│
HEAD
你看,Git创建一个分支很快,因为除了增加一个dev
指针,改改HEAD
的指向,工作区的文件都没有任何变化!
不过,从现在开始,对工作区的修改和提交就是针对dev
分支了,比如新提交一次后,dev
指针往前移动一步,而master
指针不变:
master
│
│
▼
┌───┐ ┌───┐ ┌───┐ ┌───┐
│ │───▶│ │───▶│ │───▶│ │
└───┘ └───┘ └───┘ └───┘
▲
│
│
dev
▲
│
│
HEAD
假如我们在dev
上的工作完成了,就可以把dev
合并到master
上。Git怎么合并呢?最简单的方法,就是直接把master
指向dev
的当前提交,就完成了合并:
HEAD
│
│
▼
master
│
│
▼
┌───┐ ┌───┐ ┌───┐ ┌───┐
│ │───▶│ │───▶│ │───▶│ │
└───┘ └───┘ └───┘ └───┘
▲
│
│
dev
所以Git合并分支也很快!就改改指针,工作区内容也不变!
合并完分支后,甚至可以删除dev
分支。删除dev
分支就是把dev
指针给删掉,删掉后,我们就剩下了一条master
分支:
HEAD
│
│
▼
master
│
│
▼
┌───┐ ┌───┐ ┌───┐ ┌───┐
│ │───▶│ │───▶│ │───▶│ │
└───┘ └───┘ └───┘ └───┘
真是太神奇了,你看得出来有些提交是通过分支完成的吗?
下面开始实战。
首先,我们创建dev
分支,然后切换到dev
分支:
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
然后,用git branch
命令查看当前分支:
$ git branch
* dev
master
git branch
命令会列出所有分支,当前分支前面会标一个*
号。
然后,我们就可以在dev
分支上正常提交,比如对readme.txt
做个修改,加上一行:
Creating a new branch is quick.
然后提交:
$ git add readme.txt
$ git commit -m "branch test"
[dev b17d20e] branch test
1 file changed, 1 insertion(+)
现在,dev
分支的工作完成,我们就可以切换回master
分支:
$ git checkout master
Switched to branch 'master'
切换回master
分支后,再查看一个readme.txt
文件,刚才添加的内容不见了!因为那个提交是在dev
分支上,而master
分支此刻的提交点并没有变:
现在,我们把dev
分支的工作成果合并到master
分支上:
$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
git merge
命令用于合并指定分支到当前分支。合并后,再查看readme.txt
的内容,就可以看到,和dev
分支的最新提交是完全一样的。
注意到上面的Fast-forward
信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master
指向dev
的当前提交,所以合并速度非常快。
当然,也不是每次合并都能Fast-forward
,我们后面会讲其他方式的合并。
合并完成后,就可以放心地删除dev
分支了:
$ git branch -d dev
Deleted branch dev (was b17d20e).
删除后,查看branch
,就只剩下master
分支了:
$ git branch
* master
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master
分支上工作效果是一样的,但过程更安全。
注意到上面的Fast-forward
信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master
指向dev
的当前提交,所以合并速度非常快。
当然,也不是每次合并都能Fast-forward
,我们后面会讲其他方式的合并。
合并完成后,就可以放心地删除dev
分支了:
$ git branch -d dev
Deleted branch dev (was b17d20e).
删除后,查看branch
,就只剩下master
分支了:
$ git branch
* master
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master
分支上工作效果是一样的,但过程更安全。