Git

Git 是一种分布式版本控制系统(Distributed Version Control System,简称 DVCS)
《 Pro Git 》

Git 特点

  • 直接记录快照,而非差异比较
    Git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方法。 概念上来区分,其它大部分系统以文件变更列表的方式存储信息。 这类系统(CVS、Subversion、Perforce、Bazaar 等等)将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
    存储每个文件与初始版本的差异
    Git 不按照以上方式对待或保存数据。 反之,Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流。

存储项目随时间改变的快照

  • 近乎所有操作都是本地执行
    在 Git 中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。
  • Git 保证完整性
    Git 中所有数据在存储前都计算校验和,然后以校验和来引用。 这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。 这个功能建构在 Git 底层,是构成 Git 哲学不可或缺的部分。 若你在传送过程中丢失信息或损坏文件,Git 就能发现。
  • Git 一般只添加数据
    你执行的 Git 操作,几乎只往 Git 数据库中增加数据。 很难让 Git 执行任何不可逆操作,或者让它以任何方式清除数据。

Git 基本概念

  • 三种状态
    Git 有三种状态,你的文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。 已提交表示数据已经安全的保存在本地数据库中。 已修改表示修改了文件,但还没保存到数据库中。 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
  • 三个工作区域:Git 仓库、工作目录以及暂存区域。
    工作目录、暂存区域以及 Git 仓库
    Git 仓库目录()是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
    工作目录是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
    暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作`‘索引’’,不过一般说法还是叫暂存区域。

Git 基本工作流程

  • 1、在工作目录中修改文件。
  • 2、暂存文件,将文件的快照放入暂存区域。
  • 3、提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
    如果 Git 目录中保存着的特定版本文件,就属于已提交状态。 如果作了修改并已放入暂存区域,就属于已暂存状态。 如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。

Git 的安装

在 Windows 上安装 Git:从Git 官方网站下载安装。(要注意这是一个名为 Git for Windows 的项目(也叫做 msysGit),和 Git 是分别独立的项目)
安装完毕后,在任意文件夹鼠标右键出现“Git Bash Here”选项就说明安装完成,可以选择此选项即可进入 Git 命令行

初次运行 Git 前的配置

初次使用 Git 前,要对 Git 环境进行配置,每台计算机上只需要配置一次,程序升级时会保留配置信息。 你可以在任何时候再次通过运行命令来修改它们。

  • 用户信息设置
1
2
$ git config --global user.name "John Doe" //
$ git config --global user.email johndoe@example.com

如果使用了 –global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, Git 都会使用那些信息。 当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 –global 选项的命令来配置

  • 检查配置信息
    如果想要检查你的配置,可以使用git config --list命令来列出所有 Git 当时能找到的配置。
1
2
3
4
5
6
7
8
$ git config --list
user.name=John Doe
user.email=johndoe@example.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...

可以通过输入git config <key>: 来检查 Git 的某一项配置

1
2
$ git config user.name
John Doe

获取帮助

使用 Git 时需要获取帮助,有三种方法可以找到 Git 命令的使用手册:

1
2
3
$ git help <verb>
$ git <verb> --help
$ man git-<verb>

例如,要想获得 config 命令的手册,执行

1
$ git help config

常用 git 指令

Git 本地常用操作指令

  • 创建 git 库

    • git init #在当前目录中生成一个.git 目录(含有.git 目录的目录即是 git 仓库)
  • 注册 git 用户 —>用于在团队合作开发中,表明代码作者。

    • git config --global user.name XXX #用户名
    • git config --global user.email XXX #用户邮箱
    • git config --list #查看用户信息

注:加–global,全局设置。

  • 向 git 库添加修改
    • git add [path] #会把对应目录或文件,添加到 stage 状态
    • git add . #会把当前所有的 untrack files 和 changed but not updated 添加到 stage 状态

实际上是为修改内容添加 index 索引。

  • 向版本库提交修改

    • git commit –m “XXXX” #提交修改,添加注释 xxxx

注:git 提示: 未有 add 红色字体,未有 commit 绿色字体,已提交则 worktree 是干净的

  • 查看当前代码库的状态

    • git status
  • 查看版本信息—>实际是查看修改提交信息

    • git log

    • git log --graph #以图形化(节点)展示当前 git 库的提交信息。

  • 查看指定版本信息

    • git show sdjf974654dd…. #(show 后面为每次提交系统自动生成的一串哈希值)

    • git show sdji97 #一般只使用版本号的前几个字符即可

  • 撤销修改

    • git reset
    • (1)撤销整体修改 - git reset --hard #回到原来编辑的地方,改动会丢失。(同样适用于团队对于其他人
      的修改恢复) - git reset --hard sdv143kvf…... #可回到指定的版本#(hard 后面为每次提交系统自动生成的一串哈希值) - git reset [path] 会改变 path 指定的文件或目录的 stage 状态,到非 stage 状态。 - git reset 会将所有 stage 的文件状态,都改变成非 stage 状态。
    • (2)撤销某次修改
      • 回退 1 个 change 的写法就是 git reset HEAD^
      • 2 个为 HEAD^^,
      • 3 个为 HEAD~3,以此类推。
  • 向远端库推送修改(提交修改)

    • git push origin 分支名
  • 暂存修改

    • git stash 可以把当前的改动(stage 和 unstage,但不包括 untrack 的文件)暂存。然后通过 git stash list 查看。并通过 git stash apply 重新取出来。但 apply 之前要保证 worktree 是干净的。

Git 团队开发常用操作指令

  • 获取远端库项目

    • git clone/pull
  • 团队开发的基本流程(多分支合并一个分支)

    • git add . #添加改动的文件
    • git commit #(提交至本地)
    • git pull --rebase #(将服务器项目与本地项目合并)
    • git push #(将本地项目上传至远端库)
    • (在提交前要 git pull --rebase 一下,确保当前的本地的代码为最新。)

Git 分支管理

  • 建立分支

    • git branch AAA #建立分支 AAA
  • 分支切换

    • git checkout AAA #从当前分支切换到 AAA 分支 (若 AAA 分支不存在,则自动新建)
  • 将分支与主枝 master 合并

    • git checkout master #(首先切换回主枝)
    • git merge AAA #(将分支 AAA 与主枝合并)

注:git merge:默认情况下,Git 执行”快进式合并”(fast-farward merge),会直接将 Master 分支指向 Develop 分支。

使用–no-ff 参数后,会执行正常合并,在 Master 分支上生成一个新节点。为了保证版本演进的清晰(保持提交曲线为直线),建议采用这种方法。

  • 当前分支查看

    • git branch #默认有 master(也称为主枝)
    • git branch -r #查看远端库分支
    • git branch –a #查看当前所有分支(包括本地分支和远端库分支)
  • 删除分支

    • git branch –d AAA #删除分支 AAA
  • 切下远端库 A 分支到本地库 A 分支

    • git checkout -b A origin/A (若本地 A 分支不存在,则自动新建)

注:上面只是一些基本的操作命令,更多的命令可通过帮助文档查询。

  • 帮助文档的使用:
    • man git-<需查询的指令> #(git 后面有“-”)
      如 commit 的查询为 man git-commit

本地代码上传 Github

  • Gtthub 上建立远端仓库,复制下载链接。
  • 本地指定目录下,Gitbash 粘贴远端仓库下载链接拉取远端仓库代码。
  • 复制本地需要提交的代码到远端仓库目录。
  • Git add、commit、push 提交本地代码至 Github 远端仓库。

Github

GitHub:免费的远程仓库 & 开源协作社区

Github pages

personal page

访问https://用户名.github.io

搭建步骤

  1. 创建个人站点 新建仓库(仓库名必须是“用户名.github.io”)
  2. 创建 index.html

注:github page 只支持静态网页,仓库里只能是.html

project page

访问https://用户名.github.io/仓库名

搭建步骤

  1. 进入项目主页 点击 settings
  2. 点击自动生成主题页面

github page 只支持静态网页,仓库里只能是.html