# GIT_Document **Repository Path**: btchc/GIT_Document ## Basic Information - **Project Name**: GIT_Document - **Description**: GIT - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 6 - **Created**: 2016-12-17 - **Last Updated**: 2021-08-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Git 版本控制
[ 本文档由黄超(Seeker),使用 MarkDown 构建而成,转载请注明出处 ]
### 1. 什么是 Git > Git 是当今世界上最先进/最好用的分布式版本控制系统,没有之一 ### 2. 什么是版本控制系统? > #### 版本控制 --- 《维基百科》 > 版本控制是一种软件工程技巧,能在软件开发的过程中,确保由不同人所编辑的同一个代码文件都得到同步. > 版本控制能使项目的设计者,将项目恢复到之前任意的状态,这种选择权在设计过程中特别重要. > 理论上所有的信息记录都可以加上版本控制:利用版本控制来追踪、维护源码、文件以及配置文件等等的改动 ---- ### 3. 版本控制发展史 #### 3.1 文件名方式 早年的软件开发过程,代码管理以手动和邮件等形式,文件命名及保存存在问题 > 如图 : 文件命名方式 > >  > 如图 : 毕业论文版本 > >  #### 3.2 集中式 包括库和工作区两部分:在工作区编码,然后上传至库的方式,完成多人协作。 问题:工作机与库机,需要联网才能控制版本,传输速度较慢。  #### 3.2 分布式 每台电脑都有,工作区和库,可以自己控制版本。数据更加安全,有逻辑上的中心。  ---- ### 4. 常见版本控制系统 > 如图 : 版本管理器的发展史  > 这张图上,分成了四个时期 : > ● 史前时期:1982年的RCS。现在你可能还能在Unix的发布包中找到它。 > ● 古典时期:1990年的CVS自身缺陷已经过时;1985年的PVCS、1992年的clearcase(费用昂贵、功能复杂沿用至今);微软VVS反人类;Perforace(广泛,谷歌内部最大代码管理器) > ● 中世纪时期:SVN解决了CVS的问题,集中式领域王者。AccuRev(支持分支合并让很多公司拜托cvs和clearcase)。 > ● 文艺复兴:BitKeeper(SUN公司大量使用),2002年Linux内核使用BitKeeper,2005年闭源时有人试图破解BitKeeper,于是出现了Git。 #### Git 问世 Git的第一个版本是Linux之父Linus Torvalds亲手操刀设计和实现的(两周内 用C写完),Linus不仅仅给出一个原始设计,并在向世人介绍Git时强烈批评了CVS和SVN等,Git消除了分支和合并的恐惧。很多大型开源项目由SVN迁移至Git。 2008年[GitHub](https://github.com/)也成为世界最大的SCM系统(软件配置管理),它使用的就是Git版本库的技术.从此Git成为版本控制系统的主流。 GitHub上的著名项目 : Linux内核、安卓、jQuery、Bootstrap、Ruby ... ---- ### 5. Git 的安装 和 基本配置 #### 5.1 安装 > Linux 安装 > > 二进制包(在线) > > yum -y install git // RedHat系列 > > apt-get git install // Debian系列 > > 源码包(官网下载) > Windows 安装 > > Git 在 Windows 使用模拟环境 msysgit > > 下载地址: > > [https://git-for-windows.github.io/](https://git-for-windows.github.io/) > > 注意:如果想让 windows 作为 git 服务器则需要搭建ssh服务。 ---- > 本教程使用 windows 版本来做演示 : > 安装步骤: (如果你不熟悉每个选项的意思,请保持默认的选项) - 以`管理员方式`运行安装包,选择 `是` 安装  - 同意协议条款  - 选择安装选项: 安装Git Bash和Git GUI,创建图标(可选)  - 选择 Git 的默认编辑器 (默认为vim,可选取自己熟悉的编辑器)  - 选择: `git form the command line and also form 3rd-party software` (GIT命令行和第三方软件)  - 选择: 选择 OpenSSL 传输 HTTPS 的信息  - 选择 : 换行符默认为 windows 环境为主  - 选择 : MinTTY 默认终端  - 选择 : 系统文件缓存 和 git 的管理器(需要.net v4.5.1)  - 实验选项,暂不选择  - 点击 Install 安装,开始安装  - 安装完成,选择运行`git bash`工具  - Git 运行界面 (命令行提示的是 你电脑的用户名)  ---- #### 5.2 配置 > 无论 Linux 还是 Windows,安装完成后都要初始化 ```sh # 查看 git 版本 git --version # 查看配置 git config -l # 设置用户名和邮箱 git config [--global] user.name "Your Name" git config [--global] user.email "your@email.com" # 中括号内的参数: # --local 本地 # --system 系统 # --global 全局 # 无参,则为当前库配置身份 # 如: git config --global user.name "seeker" git config --global user.email "3300696254@qq.com" ``` ### 6. Git常用操作 #### 6.1 生成新的版本库 1. 新建空目录 2. 进入该目录---单击右键---选择 `Git Bash Here` 3. 弹出 git 的命令行工具 4. 初始化该目录为版本仓库,键入 `git init` 5. 显示 `Initialized empty Git repository in xxxxxx` 6. `ls -a` 查看该目录下出现`.git`的隐藏目录,即版本库 7. 初始化完成 #### 6.2 添加文件到版本库 1. 新建文件 `1.txt` 2. 查看当前版本状态 ```sh # 查看当前版本状态 git status ``` 3. 红字提示有文件未跟踪(未加入版本控制) 4. 在命令行内输入以下,添加文件至版本库: ```sh # 添加文件至缓存区 git add 1.txt # 再次查看版本库状态 git status # 提示有要提交的修改,有一个新增的文件 # 提交文件至版本库 # 直接提交 # 回车后,会打开指定的编辑器编写描述信息 git commit # 填写完描述信息,保存关闭即可 # 或者带参数 -m 直接写入提交的描述信息 git commit -m "新增1.txt" # 新建 2.txt / 3.txt # 多文件添加 git add 2.txt 3.txt # 将缓存区的多次添加一次提交 git commit -m "新增2.txt+3.txt" # ps: # 添加所有改动过的和新增的文件到缓存区 (不包括被删除的文件) git add . # 添加所有文件到缓存区 git add --all git add -A ``` 5. 执行完后,提示提交完成 6. 查看提交后的版本库状态: ```sh $ git status On branch master nothing to commit, working tree clean ``` 7. 至此,最简单的添加文件,到版本库的操作已完成 ---- #### --- PS部分: Git 实现原理 --- 1. 工作区 : 就是程序员日常编写代码的文件夹 2. 版本库 : 负责代码版本控制,就是`.git`隐藏目录 3. 版本库原理图 :  版本库包括:暂存区(index/stage),HEAD(指针),分支(默认为 master 主分支)等。 文件提交至版本库总共分两步: 1. `git add filename` # 添加至 stage 缓存区 2. `git commit -m "描述"` # 将 stage 的内容提交至版本库的 master 分支 > 实验: > 1. 修改文件 >>> 查看状态 > 2. 添加到缓存区 >>> 查看状态 > 3. 再次修改 >>> 提交 >>> 查看状态 实验过程如下,观察理解 Git 实现机制: 1. 修改文件 >>> 查看状态: - 修改`1.txt`文件的内容,添加一行`111`,查看状态:`git status` - 提示:`Changes not staged for commit:` (工作区的修改,还没有提交到缓存区) - 显示红字,`modified: 1.txt` 2. 添加到缓存区 >>> 查看状态: - 添加到缓存区`git add .` - 查看状态:`git status` - 提示:`Changes to be committed` (要提交的修改。表示已提交到缓存区,待提交到版本库) - 显示绿字:`modified: 1.txt` 3. 再次修改 >>> 提交 >>> 查看状态 - 继续修改文件:`1.txt`文件的内容,添加一行`222` - 提交版本库:`git commit -m "第1次修改 1.txt"` - 再次查看状态:`git status` - 提示:`Changes not staged for commit`(表示工作区中,还有修改记录,没有被提交到版本库之中) - 显示红字:`modified: 1.txt` 说明: - 第 3 步的提交,只是提交了缓存区内,已经缓存过的内容(即,第二步的`add .`操作) - 第 3 步中的第二次修改文件内容的记录,并没有添加到缓存区,所以版本库与工作区文件不一致 - 此时需要将第二次的修改记录,添加到缓存区,再次提交即可 ```sh git add. git commit -m '第2次修改 1.txt' git status ``` ---- #### 6.3 查看文件修改状态相关 ```sh # 查看当前版本状态(是否修改) git status # 状态简览 git status -s git status --short # 以上命令,将得到一种更为紧凑的格式输出 # ?? 标记表示: 新添加的未跟踪文件 # A 标记表示: 新添加到暂存区中的文件 # M 标记表示: 修改过的文件 # ` M` 表示:(出现在右边)该文件被修改了但是还没放入暂存区 # `M ` 表示:(出现在左边)该文件被修改了并放入了暂存区 # `MM` 表示:(出现两个)暂存区和工作区都有该文件被修改了的记录 ``` 修改文件,测试区别: ```sh # 当 工作区/缓存区/版本库 都一致时,使用以下命令不会有任何提示 # 想知道具体修改了什么地方,可以用以下命令 git diff # 工作区 与 缓存区的区别 git diff --cached # 缓存区 与 版本库的区别 git diff HEAD # 工作区 与 版本库的区别 # 更改工作区的 1.txt,并将更改添加到缓存区 # 然后再次更改工作区的 1.txt,并保存文件的更改 # 再次测试以上三条命令 ``` > 很多编辑器里,都可以使用 git diff 的相关插件,来分析文件的差异。 > 譬如: [sublime插件: GitGutter](https://github.com/jisaacks/GitGutter) / [Sublime Merge](https://www.sublimemerge.com/) 等等.. ---- #### 6.4 Git 日志 ```sh # 查看提交历史 git log # 以简短的方式查看提交日志 git log --oneline # 行为日志,显示所有提交,回滚等.. git reflog # 显示缓存区的所有文件 git ls-files ``` ---- #### 6.5 版本回退 ```sh # 将当前版本重置为 HEAD(通常用于清空缓存区,或 merge 失败回退) git reset --hard HEAD git reset --hard HEAD^ # 回退上一个版本 git reset --hard HEAD^^ # 回退上两个版本 git reset --hard HEAD~n # 回退上n个版本 # 回退到指定版本,commitid 可根据日志获取,'<>'内的id必填 git reset --hard