Appearance
git准备
Git是一款开源免费的分布式的版本控制系统。是Linux之父为了方便管理Linux内核代码而开发的。
基本概念
版本控制
- 版本控制系统是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。git可以让对任何类型的文件进行版本控制。
- 有了版本控制系统你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。 使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先的样子。 但额外增加的工作量却微乎其微。
集中式版本控制系统
SVN 是集中式的版本控制系统常见的一种
版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器
依赖中央服务器,这么做最显而易见的缺点是中央服务器的单点故障。 如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。 如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,毫无疑问你将丢失所有数据——包括项目的整个变更历史,只剩下人们在各自机器上保留的单独快照。
分布式版本控制系统
分布式版本控制系统像 Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。
分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已
作用
版本控制系统在项目开发中作用重大,能记录文件的历史状态,主要功能有以下几点:
- 代码备份
- 版本回退
- 协作开发
- 权限控制
Git安装
下载安装
下载地址 https://git-scm.com/
安装方式和QQ安装相同,一路下一步,中间可以设置软件的安装路径。
因权限问题,安装目录尽量保持默认设置在C盘。
命令窗口
- CMD:cmd是command的缩写.即命令提示符(CMD),Win为基础的操作系统下的“MS-DOS 方式”。
- Powershell: 可以看作是cmd的升级版、补充版,并且支持大多linux命令
- Git Bash:bash是linux风格的命令行,路径也是linux式的,可以使用windows和linux的命令,Git在安装的时候也安装了一个轻量级的bash环境,然后启动这个”git bash”,出来的命令窗口就带有这个bash环境的环境变量。bash是基于shell的命令库,本身是unix下的命令脚本。你甚至可以在”git bash”中使用一个轻量的vi编辑器。
环境变量
- 简单来说,环境变量就是快速打开文件的方法
- 当你想要执行某个程序时,系统会在当前目录下找寻它,如果找不到就会去path环境变量里面找,找到就执行,找不到那很可能就会报错,我们通过设置环境变量,就可以达到更高效的使用效率,节约时间。
- 配置环境变量:控制面板->系统和安全->系统->更改设置->高级->环境变量->path
Linux常用命令
Linux常用命令
Linux是一套开源免费的操作系统,与系统的交互通常用命令来实现,常用的命令有:
ls
查看当前文件夹下的文件(list单词的缩写),ls -al
orls -a -l
查看隐藏文件并竖向排列cd
进入某一个文件夹(change directory)的缩写,cd ..
回到上一级。tab
键代码自动补全clear
清屏mkdir
创建文件夹touch test.html
创建一个文件rm test.html
删除一个文件rm -r 文件夹名称
删除文件夹mv 原文件或文件夹 目标文件或文件夹
移动文件cat test.html
查看文件内容ctrl+c
取消命令上下方向键,可以查看命令历史
md练习:创建一下目录结构 *project - css - app.css - home.css - js - app.js - index.html
Vim编辑器
Vim是一款命令行下的文本编辑器,编辑方式跟图形化编辑器不同
vim test.html
编辑文件(文件不存在则创建)- i 可以进入编辑模式
ESC
+:wq
保存并推出ESC
+:q!
不保存并推出
git 初始配置
什么是git配置
- 既然已经在系统上安装了 Git,需要做几件事来定制你的 Git 环境。 每台计算机上只需要配置一次,程序升级时会保留配置信息。 你可以在任何时候再次通过运行命令来修改它们。
- git配置是本地git客户端的一个变量,不随git库而改变
用户名和邮箱地址的配置
当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改
js//配置用户名 git config --global user.name "username" //配置密码 git config --global user.email "email"
查看git配置
git
查看用户名和邮箱地址:
git config user.name
git config user.email
git config -l //查看git所有配置
git初始化
初始化仓库
- 创建或进入文件夹
- 在文件夹空白区域右键后,点击 Git Bash Here 启动命令行(MAC 在当前文件夹打开终端)
git init
仓库初始化,该命令将创建一个名为.git
的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干
三个区域
Git 有三种状态,你的文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。由此引入 Git 项目的三个工作区域的概念:Git 仓库、工作目录以及暂存区域。
工作区(代码编辑区):代表本地开发代码的地方
暂存区(修改待提交区):代表本地仓库暂时保管代码的地址
仓库区(代码保存区):代表代码进入本地版本控制
.git 目录
- hooks 目录包含客户端或服务端的钩子脚本,在特定操作下自动执行。
- info 包含一个全局性排除文件,可以配置文件忽略
- logs 保存日志信息
- objects 目录存储所有数据内容,本地的版本库存放位置
- refs 目录存储指向数据的提交对象的指针(分支)
- config 文件包含项目特有的配置选项
- description 用来显示对仓库的描述信息
- HEAD 文件指示目前被检出的分支
- index 暂存区数据
- 切记: 不要手动去修改 .git 文件夹中的内容*
常用命令
提交操作
git status
版本状态查看红色:说明文件位于工作区(修改删除或者未跟踪)
绿色:说明文件位于暂存区
没有体现,说明位于版本区
git add -A
(或者git add .
git add *
):跟踪新文件,暂存已修改文件等git commit -m '注释 '
提交修改并注释尽管使用暂存区域的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。 Git 提供了一个跳过使用暂存区域的方式, 只要在提交的时候,给
git commit
加上-a
选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add
步骤git commit -a -m '注释'
撤销操作
- 使用
git restore <文件路径>
可以丢弃工作区的改动(新增文件需要使用 rm 删除) - 使用
git restore --staged <文件路径>或 *
可以取消暂存 . 注意: * 表示所有
对比差异
git diff
查看工作区与暂存区的差异(不显示删除或新增文件) 显示做了哪些修改js//解读结果 //进行比较的是,index.html(即变动前)index.html(即变动后)。 diff --git a/index.html b/index.html //表示两个版本的git哈希值 index 16158b4..61045cd 100644 //"---"表示变动前的版本 --- a/index.html //"+++"表示变动后的版本 +++ b/index.html //代表的意思是源文件的1-2行与目标文件的1-5行有差异,下面才是具体的差异信息; @@ -1,2 +1,5 @@ //-红色部分表示减少的部分,+绿色部分表示增加的部分 var filename = 'test' -console.log('这是test文件') + +console.log('第三行')
git diff --cached
查看暂存区与仓库的差异
历史版本及回滚
查看历史版本
git log
默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面。每次更新都有一个 SHA-1 校验和、作者的名字 和 电子邮件地址、提交时间,最后缩进一个段落显示提交说明。
git log
一个常用的选项是-p
,用来显示每次提交的内容差异。 你也可以加上-2
来仅显示最近两次提交如果内容偏多, 需要使用方向键上下滚动, 按
q
退出git log --oneline
简略信息
根据版本号进行回滚
版本回退,只是本地的。不会影响git库中的内容。
git reset --hard b815fd5a6ae655b521a31a9
进行版本回退时,不需要使用完整的哈希字符串,前七位即可
版本切换之前,要提交当前的代码状态到仓库
git reflog
如果在回退以后又想再次回到之前的版本,git reflog 可以查看所有分支的所有操作记录(包括commit和reset的操作),包括已经被删除的commit记录,git log则不能察看已经删除了的commit记录
4.3其他回滚(了解)
sh
git reset --hard HEAD^ 回滚到上个版本
git reset --hard HEAD^^ 回滚到上上个版本
git reset --hard HEAD~100 回滚到100个版本之前
配置忽略文件
仓库中没有提交该文件
项目中有些文件是不需要进入版本库中,比如编辑器的配置。Git 中需要创建一个文件 .gitignore,一般与 .git同级目录。
gitignore
# 忽略所有的 .idea 文件夹
.idea
# 忽略所有以 .test 结尾的文件
*.test
# 忽略 node_modules 文件和文件夹
/node_modules
仓库中已经提交该文件
对于已经加入到版本库的文件,可以在版本库中删除该文件
shgit rm --cached .idea git rm --cached ./css/go.css
然后在 .gitignore 中配置忽略
sh.idea /css/go.css
add 和 commit 提交即可
分支
- 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。 在很多版本控制系统中,这是一个略微低效的过程——常常需要完全创建一个源代码目录的副本。对于大项目来说,这样的过程会耗费很多时间。
- Git 处理分支的方式可谓是难以置信的轻量,创建新分支这一操作几乎能在瞬间完成,并且在不同分支之间的切换操作也是一样便捷。 与许多其它版本控制系统不同,Git 鼓励在工作流程中频繁地使用分支与合并,哪怕一天之内进行许多次。
GitFlow
GitFlow 是团队开发的一种最佳实践,将代码划分为以下几个分支
- Master 主分支。上面只保存正式发布的版本
- Hotfix 线上代码 Bug 修复分支。开发完后需要合并回Master和Develop分支,同时在Master上打一个tag
- Feather 功能分支。当开发某个功能时,创建一个单独的分支,开发完毕后再合并到 dev 分支
- Release 分支。待发布分支,Release分支基于Develop分支创建,在这个Release分支上测试,修改Bug
- Develop 开发分支。开发者都在这个分支上提交代码
分支操作
创建分支
name 为分支的名称
sh
git branch name
查看分支
sh
git branch
切换分支
sh
git checkout name
合并分支
sh
git merge name
删除分支
sh
git branch -d name
切换并创建分支
sh
git checkout -b name
注意: 每次在切换分支前 提交一下当前分支
冲突
当多个分支修改同一个文件后,合并分支的时候就会产生冲突。冲突的解决非常简单,将内容修改为最终想要的结果,然后继续执行 git add 与 git commit 就可以了。