1. 介绍与安装

1. 简介

  • 集中式版本管理系统

版本库是集中存放在中央服务器的,而大家工作的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始工作,工作完成,再把自己的修订推送给中央服务器page6_image6.jpgpage6_image7.jpg

  • 分布式版本管理系统

分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的
修改推送给对方,就可以互相看到对方的修改了。

page7_image6.jpgpage7_image7.jpg

  • 官方介绍:

    Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.

Git是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有内容。

集中式(SVN) 分布式(Git)
是否有中央
服务器
有。开发人员需要从中央服务器获得最新版本的项目然后在本地开发,开发完推送给中央服务器。因此脱离服务器开发者是几乎无法工作的 没有中央服务器,开发人员本地都有Local Repository
网络依赖 必须要联网才能工作,而且对网络的依赖性较强,如果推送的文件比较大而且网络状况欠佳,则提交文件的速度会受到很大的限制。 分布式在没有网络的情况下也可以执行commit、查看版本提交记录、以及分支操作,在有网络的情况下执行 push 到 Remote Repository。
文件存储格
按照原始文件存储,体积较大 按照元数据方式存储,体积很小
版本号 全局唯一的连续版本号 依据数据计算sha-1的40位哈希值,全球唯一
分支操作的
影响
创建新的分支则所有的人都会拥有和你一样的分支 分支操作不会影响其他开发人员
提交 提交的文件会直接记录到中央版本库 提交是本地操作,需要执行push操作才会更新到主版
本库
应用场景 当研发成本比较低,协作开发人数不多,开发人员对于版本管理的水平参差不齐的时候,或者对于代码的安全性要求更高一点的情况下适用 对于很多人参与开发,代码量比较大,或者高频次协作,跨公司,跨地域合作的情况下更适用

2. 安装

Git官网https://git-scm.com/downloads下载安装

2. 配置

1. 用户信息配置

  • 配置用户名

    1. git config --global user.name "your name"
  • 配置用户邮箱

    1. git config --global user.email "email@example.com"

    2. 行为配置

  • Windows系统下可能出现的警告

    1. warning:LF will be replaced by CRLF in readme.txt # 这事windows可能显示的警告信息
    • 命令设置 ```shell git config —global core.autocrlf false git config —global core.safecrlf true 含义: AutoCRLF

      提交时转换为LF,检出时转换为CRLF

      git config —global core.autocrlf true

提交时转换为LF,检出时不转换

git config —global core.autocrlf input

提交检出均不转换

git config —global core.autocrlf false SafeCRLF

拒绝提交包含混合换行符的文件

git config —global core.safecrlf true

允许提交包含混合换行符的文件

git config —global core.safecrlf false

提交包含混合换行符的文件时给出警告

git config —global core.safecrlf warn

  1. - **其他设置**
  2. 不论 Windows 还是 Linux 还是Mac,建议至少config下述内容:
  3. ```shell
  4. git config --global push.default simple # 我们要求 Git 版本 1.9.5 以上

若是 Linux 还是Mac,建议至少config下述内容:

  1. git config --global core.autocrlf false # 让Git不要管Windows/Unix换行符转换的事。

说明:Windows 平台不要设置 core.autocrlf,否则注释里有中文路径就会编译不过的情况。config: autocrlf 的更多信息可以参考 https://www.atatech.org/articles/149656

Windows上还需要配置:

  1. git config --global core.ignorecase false # 设置大小写敏感

3. 配置 ssh keys

登录 GitLab ,在左边的菜单点击“profile settings”,继续点击“SSH Keys”
Git 简单使用指南 - 图6

然后点击绿色按钮 “+ Add SSH Key”
Git 简单使用指南 - 图7

  • ssh key 的生成
    1. ssh-keygen -t rsa -C "email@example.com"
    2. cat ~/.ssh/id_rsa.pub # 查看
    3. pbcopy < ~/.ssh/id_rsa.pub # 复制ssh key到剪切板(Mac)
    4. # Windows用户 shh key 目录:C:/用户/xxx/.ssh/id_rsa.pub

Git 简单使用指南 - 图8

配置好ssh key以后每次push代码就不用输入密码了。

3. 使用方法

1. 工作原理git工作原理.jpg

  • workspace:工作区,项目文件所在的文件夹里,统称为工作区。
  • Index:暂存区(Stage),用来保存要提交到本地版本库的所有文件;相当于一个缓存区。
  • Repository:版本库、本地仓库,一个简单的数据库;包含所有用来维护和管理的项目的修订版本和历史的信息。
  • Remote:远程仓库

    2. 命令介绍

  • 本地仓库克隆

    1. git clone git@xxx:/xxxxxx.git # url的格式:用户名@服务器地址:仓库路径
    2. git remote add origin git@xxxx:/xxxxxx.git # 将本地已经存在的git仓库与创建的远程仓库关联
  • 更新代码

    1. cd xxxx # 切换到本地仓库目录
    2. touch test.txt # 在本地仓库添加一个文件
    3. echo test code > test.txt # 添加内容
    4. git add -A # 添加未提交的文件到暂存区。add 后面可以跟文件名,多个文件用空格分开
    5. git commit -m 'msg' # 提交文件到版本库(本地仓库);不加参数 -m 会进入默认编辑器,进行msg的编写
    6. git push origin master # 推送文件到远程服务器。
    7. git pull origin master # git pull <远程主机名> <远程分支名>:<本地分支名> 相当于git fetch和git merge两条指令
    8. git fetch origin master
    9. git merge origin/master # 这两个指令等同于上面的 git pull 指令
  • 查看仓库状态

    1. git status # 查看仓库状态
  • 检查历史

    1. git log # 查看本地仓库
    2. git log origin/master # 查看服务器仓库
    3. git reflog # 查看命令历史

    reflog.gif

  • 文件比较

    1. git diff test.txt # 查看文件修改内容
    2. git diff HEAD "HEAD^" # 比较两个版本的不同,后面可以跟文件名参数
  • 版本回退

    1. git reset --hard "HEAD^" # 回退到上一个版本,git是用HEAD来表示当前分支中的当前版本,一个^表示上个版本
    2. ^^表示上两个版本,以此类推;但是如果要推到较早的版本需要使用HEAD@{版本号}
    • -mixed
      • 默认项。修改版本库,修改暂存区,保留工作区,会清空暂存区的修改
    • -soft
      • 修改版本库,保留暂存区,保留工作区。只需要commit即可恢复版本回退前的状态
    • -hard

      • 修改版本库、修改暂存区、修改工作区。回退最彻底的一种方式
    • soft—软重置

      软重置会将 HEAD 移至指定的提交(或与 HEAD 相比的提交的索引),而不会移除该提交之后加入的修改! 假设我们不想保留添加了一个 style.css 文件的提交 9e78i,而且我们也不想保留添加了一个 index.js 文件的提交 035cc。但是,我们确实又想要保留新添加的 style.css 和 index.js 文件!这是软重置的一个完美用例。

soft.gif

  • hard—硬重置

    有时候我们并不想保留特定提交引入的修改。不同于软重置,我们应该再也无需访问它们。Git 应该直接将整体状态直接重置到特定提交之前的状态:这甚至包括你在工作目录中和暂存文件上的修改。

hard.gif

  • 撤销修改—三种场景
    • 场景1:当你改乱了工作区的某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout —file 或者手动修改
    • 场景2:当你不但改乱了工作区的某个文件的内容,并且还添加到了暂存区(即已经 git add 了)时,想丢弃修改,分两步,第一步用命令 git reset HEAD file ,这样回到了场景1,第二部再按照场景1操作即可
    • 场景3:已经提交了不合适的修改到版本库(本地仓库)时,想撤销本次提交,可以使用版本回退,不过前提是没有推送到远程仓库
  • 取回

    1. git fetch origin master
    • 如果你有一个远程 Git 分支,比如在 GitHub 上的分支,当远程分支上包含当前分支没有的提交时,可以使用取回。比如当合并了另一个分支或你的同事推送了一个快速修复时。

      通过在这个远程分支上执行 git fetch,我们就可在本地获取这些修改。这不会以任何方式影响你的本地 分支:fetch 只是单纯地下载新的数据而已。
      fetch.gif

  • 拉取

    1. git pull origin master
    • 尽管 git fetch 可用于获取某个分支的远程信息,但我们也可以执行 git pull。git pull 实际上是两个命令合成了一个:git fetch 和 git merge。当我们从来源拉取修改时,我们首先是像 git fetch 那样取回所有数据,然后最新的修改会自动合并到本地分支中。pull.gif
  • 分支

    • 列出本地分支

      1. git branch
    • 查看远程分支

      1. git branch -r
    • 查看全部分支

      1. git branch -a
    • 创建分支

      1. git branch dev # dev为创建的分支的名字,此命令创建分支后仍会停留在当前分支
    • 删除分支

      1. git branch -d dev # 删除dev分支,如果分支中有未merge的提交,那么分支会删除失败
      2. 此时使用 git branch -D dev:强制删除dev分支
    • 分支改名

      1. git branch -m oldname newname
  • Checkout

    • 操作文件

      1. git checkout filename # 放弃单个文件的修改
      2. git checkout . # 放弃当前目录下的修改
    • 操作分支

      1. git checkout master # 将分支切换到master主分支
      2. git checkout -b dev # 如果分支存在则只切换分支,若不存在则创建分支并切换到dev分支
    • 合并分支 ```shell git merge dev # 将分支dev合并到当前分支

```

如果我们想把 dev 合并到 master,就会出现一个合并冲突:你想要标题是 Hello! 还是 Hey!? 当尝试合并这些分支时,Git 会向你展示冲突出现的位置。我们可以手动移除我们不想保留的修改,保存这些 修改,再次添加这个已修改的文件,然后提交这些修改。

merge.gif

  • 常用分支

常用分支.jpg

3. 基本使用流程

  1. 将Git的一个存储库克隆为工作副本。
  2. 可以添加修改工作副本。
  3. 操作完毕执行add命令将工作副本添加到暂存区
  4. 如果愿意可以继续添加或修改工作副本并再次将修改添加到暂存区。
  5. 执行commit命令提交更改到本地仓库中。
  6. 如果确认没有问题,可以执行push命令将本地仓库的最新内容推送到远程仓库中去。