Skip to content

git准备

Git是一款开源免费的分布式的版本控制系统。是Linux之父为了方便管理Linux内核代码而开发的。

基本概念

版本控制

  • 版本控制系统是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。git可以让对任何类型的文件进行版本控制。
  • 有了版本控制系统你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。 使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先的样子。 但额外增加的工作量却微乎其微。

集中式版本控制系统

  • SVN 是集中式的版本控制系统常见的一种

  • 版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器

  • 依赖中央服务器,这么做最显而易见的缺点是中央服务器的单点故障。 如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。 如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,毫无疑问你将丢失所有数据——包括项目的整个变更历史,只剩下人们在各自机器上保留的单独快照。

    s4vSCq.png

分布式版本控制系统

  • 分布式版本控制系统像 Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。

  • 分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。

  • 分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已

    s4vTo9.png

作用

版本控制系统在项目开发中作用重大,能记录文件的历史状态,主要功能有以下几点:

  • 代码备份
  • 版本回退
  • 协作开发
  • 权限控制

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 or ls -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! 不保存并推出

img

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初始化

初始化仓库

  1. 创建或进入文件夹
  2. 在文件夹空白区域右键后,点击 Git Bash Here 启动命令行(MAC 在当前文件夹打开终端)
  3. git init 仓库初始化,该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干

三个区域

Git 有三种状态,你的文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。由此引入 Git 项目的三个工作区域的概念:Git 仓库、工作目录以及暂存区域。

  • 工作区(代码编辑区):代表本地开发代码的地方

  • 暂存区(修改待提交区):代表本地仓库暂时保管代码的地址

  • 仓库区(代码保存区):代表代码进入本地版本控制

    img

    img

.git 目录

img

  • 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

仓库中已经提交该文件

  1. 对于已经加入到版本库的文件,可以在版本库中删除该文件

    sh
    git rm --cached .idea
    git rm --cached ./css/go.css
  2. 然后在 .gitignore 中配置忽略

    sh
    .idea
    /css/go.css
  3. add 和 commit 提交即可

分支

  • 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。 在很多版本控制系统中,这是一个略微低效的过程——常常需要完全创建一个源代码目录的副本。对于大项目来说,这样的过程会耗费很多时间。
  • Git 处理分支的方式可谓是难以置信的轻量,创建新分支这一操作几乎能在瞬间完成,并且在不同分支之间的切换操作也是一样便捷。 与许多其它版本控制系统不同,Git 鼓励在工作流程中频繁地使用分支与合并,哪怕一天之内进行许多次。

GitFlow

GitFlow 是团队开发的一种最佳实践,将代码划分为以下几个分支

img

  • 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 就可以了。