Git基础
版本控制系统(VCS)
Version Control System
是用来解决什么问题的?
在开发过程当中,我们经常需要,将代码返回到之前某个时刻所开发的版本,如果没有版本控制工具,那么我们只能通过拷贝文件。
拷贝文件的方式,不够简洁,而且会产生很多个文件。
版本控制工具,可以用来记录我们每一次的修改历史(版本), 当我们想要使用之前的版本的时候,直接使用这个工具,就能找回之前的代码。
版本管理系统分类
-
本地版本控制
-
集中式版本控制(例如:SVN)
- 分布式版本控制(例如:Git)
Git
版本控制工具(分布式的版本控制工具)
- 用Git来做什么?
将代码进行版本保存,每实现一个功能,可以保存一次,这样的话,会在git中形成一个版本库
如果以后我们想要回退到代码的某个版本的时候,我们可以使用git,将对应版本的代码从版本库中获取出来!
git可以非常方便的实现多人协作开发。
工作区、暂存区、仓库区、远程仓库
git仓库会分成三个区
工作区:我们书写代码的地方,工作的目录就叫工作区。
暂存区:暂时存储的区域,在git中,代码无法直接从工作区提交到仓库区,而是需要先从工作区添加到暂存区,然后才能从暂存区提交到仓库区。暂存区的目的是避免误操作。
本地仓库区:将保存在暂存区域的内容永久转储到 Git 仓库中,生成版本号。生成版本号之后,就可以任何的回退到某一个具体的版本。
远程仓库:上面三个都是我们本地的,远程仓库是我们统一存放代码的地方,不是存在本地,比如公司中,我们开发的项目会统一放在一台服务器上便于我们开发的时候获取,可以用来共享代码的,代表性的一个远程仓库就是Github
使用说明
基本命令
- 配置用户名和邮箱
# 这个命令一个电脑基本上只需要执行一次!
git config --global user.name xxx
git config --global user.email xxx@gmail.com
- 使用Git管理项目
# 这个命令一个项目只需要执行一次!
git init
这个命令其实就是在当前项目中创建了一个.git隐藏文件夹,我们所有的代码的版本信息最终都会被存储到这个文件夹里
- 查看文件状态
查看当前项目中,所有文件的状态(有没有被git管理,有没有修改)
git status
- 管理文件
让这个文件被git管理起来,添加到暂存区
git add 文件名
# 当前文件夹下的
git add .
# 所有的文件
git add *
# 将当前目录下所有的js文件添加到暂存区
git add *.js
- 删除暂存区文件
git rm --cache file
- 保存到版本库
将当前项目中的修改内容,形成一个新的版本,保存到版本库中,可以经过多次add后,让这些一起提交,提交的文件会生成一个32位的hash数作为版本号
git commit -m "提交的描述信息"
- 历史版本
使用这个命令,我们可以查看,以往提交的历史版本信息
git log
- 回退到指定版本
切换到指定版本,版本号可以只取前几位,只要前几位没有重复的就行
git reset --hard 版本号
# 通过head~n来返回到前n个版本情况
git reset --hard head~n
# 比如head~1将版本回退到上一次提交
# head~0 或者 省略 ~0 表示当前提交
- 查看所有的版本
有时候切换到之前版本后,又想切回原来的,这里通过git log 无法查到那个版本,就需要用这个命令
git reflog
分支
在git中有一个默认的分支,叫master,我们默认的提交都存在这个分支上
master分支在刚一开始的时候是没有的,只有进行了第一次提交之后,master分支才会被自动创建出来
使用场景: 只要是做一个新的功能模块,我们一般都会开辟一个新的分支进行开发,开发完毕之后,将新的分支中的内容和当前分支进行合并
- 查看分支信息
git branch
- 新建分支
git branch 分支名
# example
git branch branch1
- 切换分支
git checkout 分支名
# example
git checkout branch1
- 创建并切换分支
git checkout -b 分支名
# example
git checkout -b branch1
- 删除分支
git branch -d 分支名
# example
git branch -d branch1
- 合并分支
现在假设我们需要把branch1分支合并到master分支
步骤:
- 1、切换到master分支
- 2、执行 git merge branch1
git merge 要合并到当前分支的分支名
# example
git merge branch1
git diff
可以查看每次提交的内容的不同
# 查看工作区与暂存区的不同
git diff
# 查看暂存区与仓库区的不同
git diff --cached
# 查看工作区与仓库区的不同,HEAD表示最新的那次提交
git diff HEAD
# 查看两个版本之间的不同
git diff c265262 de4845b
远程仓库
- 克隆远程仓库的代码到本地
git clone [远程仓库地址]
# 从远程仓库克隆到本地的时候给克隆的项目命名
git clone [远程仓库地址] 项目名称
- 将本地仓库中代码提交到远程仓库
# 本地分支名:远程分支名
git push [远程仓库地址] master:master
# 如果两个分支名相同,可以只写一个
git push [远程仓库地址] master
- 将远程更新的代码下载到本地
# 获取远程仓库的更新,并且与本地的分支进行合并
git pull 远程仓库地址 分支名称
# 如果一开始就是clone过来的,地址就是默认的origin
# 并且拉取的分支和当前分支一样,可以省略后面的,如下
git pull
- 给仓库地址设置一个别名
每次push操作都需要带上远程仓库的地址,非常的麻烦,我们可以给仓库地址设置一个别名
# 给远程仓库设置一个别名
git remote add 仓库别名 仓库地址
git remote add xxxx git@github.com:xxxx/test.git
# 删除xxxx这个别名
git remote remove xxxx
# git clone的仓库默认有一个origin的别名
git remote 查看所有的别名
git remote get-url 别名 获取当前别名对应的仓库地址
git remote set-url 别名 url地址 设置当前别名对应的仓库地址
可以通过–help来查看对应命令的帮助
git xxx --help
# 比如
git add --help
git remote --help
忽视文件
在仓库中,有些文件是不想被git管理的,比如数据的配置密码、写代码的一些思路等。git可以通过配置从而达到忽视掉一些文件,这样这些文件就可以不用提交了。
- 在仓库的根目录创建一个
.gitignore
的文件,文件名是固定的。 - 将不需要被git管理的文件路径添加到
.gitignore
中
# 忽视idea.txt文件
idea.txt
# 忽视css下的index.js文件
css/index.js
# 忽视css下的所有的js文件
css/*.js
# 忽视css下的所有文件
css/*.*
# 忽视css文件夹
css
SSH免密登录
git支持多种数据传输协议:
- https协议:
https://github.com/xxxx/test.git
需要输入用户名和密码 - ssh协议:
git@github.com:xxxx/test.git
可以配置免密码登录
每次push或者pull代码,如果使用https协议,那么都需要输入用户名和密码进行身份的确认,非常麻烦。
- github为了账户的安全,需要对每一次push请求都要验证用户的身份,只有合法的用户才可以push
- 使用ssh协议,配置ssh免密码,可以做到免密码往github推送代码
SSH免密码登录配置
注意:这些命令需要在bash中敲
- 1 创建SSH Key:
ssh-keygen -t rsa
- 2 在文件路径
C:\用户\当前用户名\
找到.ssh
文件夹 - 3 文件夹中有两个文件:
- 私钥:
id_rsa
- 公钥:
id_rsa.pub
- 私钥:
- 4 在
github -> settings -> SSH and GPG keys
页面中,新创建SSH key - 5 粘贴 公钥
id_rsa.pub
内容到对应文本框中 - 5 在github中新建仓库或者使用现在仓库,拿到
git@github.com:用户名/仓库名.git
- 6 此后,再次SSH方式与github“通信”,不用输入密码确认身份了