分布式版本控制---Git

230 阅读6分钟

分布式版本控制---Git

Git概述

Git是一个免费的,开源的分布式版本控制系统,可以快速高效地处理各种项目。Git的诞生与Linux内核开发有着密切的关系(最初Git是为了帮助管理Linux内核开发而开发的一个开源的版本控制软件),两者的作者都是Linus Torvalds。

目前常见的版本控制工具

  • 集中式版本控制工具(SVN)

集中式版本控制.png
比如SVN、CVS、VSS等这类都是集中化的版本控制系统,它们通过一个单一的服务器来保存所有文件的修订版本,协同工作的开发人员通过客户端连接到这台服务器,取出最新的文件或者提交自己的更新。通过这种做法各个开发人员都可以在一定程度上看到项目中的其他人正在做些什么,而且管理员可以很轻松地管理每个开发人员的权限。但是,这样的集中式版本管理有个显而易见的缺点,当服务器宕机后,在宕机的这段时间中,开发人员们既无法向服务器提交代码也无法从服务器更新代码,就无法协同工作。

  • 分布式版本控制工具(Git)

分布式版本控制.png
像Git这种分布式版本控制系统,客户端提取的不是最新版本的文件快照,而是把远程库完整地拉取到本地的一个仓库(本地库),这样任何一处协同工作的文件发生故障,事后都可以用其他客户端吧的本地仓库进行恢复。分布式的版本控制系统出现之后,集中式版本控制系统的缺陷就得到了解决:每个客户端保存的都是完整的项目(包含历史版本记录,更加安全),服务器断网的情况下开发人员任然可以进行开发(本地进行版本控制),待服务器网络恢复后,只需提交修改即可。

Git与SVN(集中式版本控制)的区别

  1. Git是分布式的,SVN不是:这是Git和其它非分布式的版本控制系统最本质的区别。
  2. Git把内容按元数据方式存储,而SVN是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn、.git等的文件夹中。
  3. Git中的分支与SVN中的分支不同:分支在SVN中一点都不特别,其实它就是版本库中的另一个目录。
  4. Git没有一个全局的版本号,而SVN有。
  5. Git的内容完整性要优于SVN:Git在内容存储使用的是SHA-1哈希算法,这能确保代码内容的完整性,在遇到磁盘故障和网络问题时降低对版本库的破坏。

Git的安装与配置

安装

直接去Git官网下载对应平台的安装文件就行:
官网下载地址:gitforwindows.org
官网慢,可以用国内的镜像:npm.taobao.org/mirrors/git…

配置文件

安装Git过后,在当前用户主目录下就会生成一个git.config这样的配置文件,专门用来配置或者读取相应的工作环境变量,决定了Git在各个环节的具体工作方式和行为。
需要注意的是:用户主目录下的配置文件只适用与该用户,且会被各个工作区中的.git下的配置文件覆盖。

用户信息

首先通过鼠标右键--Git-Bash-Here--在命令行中配置个人的用户名与电子邮箱

$ git config --global user.name "Camille"  
$ git config --global user.email camille@163.com  

这里介绍了最基本的一些配置,还可以通过命令行来配置默认的文本编辑器、差异工具(解决合并冲突)等。没配置就采用默认即可,想自定义相关的配置可自百度。

查看配置信息

$ git config --list

Git的工作流程

  • 从远程库克隆代码到工作区(本地的一个目录)
  • 对工作区文件进行修改、删除、增加(一把在对工作区进行修改前都应拉取最新代码
  • 确认修改后提交本地库
  • 最后就是将工作区推送到远程库(团队开发中一般都是新建分支,提交一个分支合并请求)

Git工作流程.png

工作区、暂存区、版本库

三者的概念:

  • 工作区:本机磁盘上某一个具体的目录。
  • 暂存区:英文叫index,一般存放在.git目录下的index文件中。
  • 版本库:工作区中的.git目录。

重点本质.png

  • 当对工作区修改的文件执行git add命令时,暂存区的目录树被更新,同时工作区修改的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在index文件中。
  • 当执行**git commit命令*时,暂存区的目录树写到对象库中,master分支会做相应的更新。
  • 当执行git reset HEAD命令时,暂存区的目录树会被重写,被master分支指向的目录树所替换,但是工作区不受影响。
  • 当执行git rm --cached filename命令时,会直接删除暂存区中对应的文件,工作区不受影响。
  • 当执行 git checkout . 或者 git checkout -- filename 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。
  • 当执行git checkout HEAD . 或者 git checkout HEAD filename命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

Git常用命令

创建本地库命令

git init/git init newrepo 初始化一个Git仓库。
git clone <repo> <directory> 克隆远程库。

提交与修改

git add 添加到暂存区(追踪)。
git status 查看仓库状态。 git diff 比较文件不同(暂存区与工作区的文件差异)。
git commit -m "提交备注" 提交暂存区到本地库。

查看提交日志

git log 查看历史提交记录。
git blame <file> 以列表形式查看指定文件的历史修改记录。

查看分支信息

git branch

创建分支

git branch <branchName>

切换分支

git checkout <branchName>
git checkout -b <branchName> 创建新分支并立即切换到新分支。

删除分支

git branch -d <branckname> 删除指定分支。

分支合并

git merge 发生冲突时需要手动合并。