关于GIT
GIT 是一个分布式版本控制软件,最初由林纳斯·托瓦兹(Linus Torvalds)创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。是目前世界上最先进的分布式版本控制系统.
什么是版本控制
版本控制(Revision control)是维护工程蓝图的标准作法,能追踪工程蓝图从诞生一直到定案的过程。此外,版本控制也是一种软件工程技巧,借此能在软件开发的过程中,确保由不同人所编辑的同一代码文件案都得到同步。
集中式和分布式
再说分布式是什么前, 我们前看一下什么是集中式.
集中式
集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。
分布式
那分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
安装GIT
sudo apt-get install git
创建版本库
第一步, 先要创建一个目录, 这个目录就是用来存放仓库的.
$ mkdir git 创建一个名叫git的目录
$ cd git
第二步, 使用git init命令, 将当前目录创建成git仓库.
$ git init
马上就把仓库创建成功了, 并提示这是一个空仓库.
$ ls -al al表示列出所有的文件,包括隐藏文件,就是文件前面第一个字符为.的文件
总用量 12
drwxrwxr-x 3 linux linux 4096 8月 10 18:14 .
drwxr-xr-x 43 linux linux 4096 8月 10 18:00 ..
drwxrwxr-x 8 linux linux 4096 8月 10 18:00 .git .git为隐藏文件夹, 表示创建成功
配置用户信息
配置用户名, 这个用户名是你的提交patch的名子, 最好写真的名了, 不是网名, 如果有一天你成为名人了,那这个东西会一直印着你的足迹.
$ git config --global user.name "你的名字"
配置用户邮箱, 这个邮箱最好写你最常用的邮箱, 说不定会有人给你写邮件的, 这个是可能来自世界的任何角落, 可能是任何肤色和眼睛.
$ git config --global user.email "你的邮箱"
配置编辑提交信息的编辑器, 我们熟悉的编辑器是vim. 使用这个去编辑提交信息, 最好把每一次提交信息填写写的全面, 不是为了给别人看, 万一那天自己想回顾一下. 也需要详细的信息.
$ git config --global core.editor vim
Git用户名邮箱的全局配置和单仓库配置
Git可以配置了一个全局的用户名和邮箱:
$ git config --global user.name "xxxxx"
$ git config --global user.email "xxxxx@xx.com"
$ git config --list
但是你的项目可能是公司自己搭建的gitlab进行管理的,那就需要单独针对这个项目单独配置用户名和邮箱。
在项目根目录下进行单独配置:
$ git config user.name "gitlab's Name"
$ git config user.email "gitlab@xx.com"
$ git config --list
git config --list查看当前配置, 在当前项目下面查看的配置是全局配置+当前项目的配置, 使用的时候会优先使用当前项目的配置
增加文件
当前目录里没有文件, 那么我们先创建一个文件README.
$ touch README
编辑这个文件, 写一点东西在里面.
$ vim README
先用查看当前状态的命令, 查看一下现在目录下文件的状态.
$ git status
位于分支 master
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
README
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
把文件加到仓库中去, 只有加到仓库中了, 才可能看一下文件的变化.
$ git add README
现在使用查看状态的命令, 看一下目录下文件的状态.
$ git status
位于分支 master
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
新文件: README
提交
$ git commit
现在使用查看状态的命令, 看一下目录下文件的状态.
位于分支 master
无文件要提交,干净的工作区
查看提交信息
$ git log
commit 50f37204c0a3f056f799683415f577a3a6bfb11b id
Author: klous <klous530.outlook.com> 我们的用户名,邮箱
Date: Thu Aug 10 19:10:13 2017 +0800
Add file README
新文件: README
删除文件恢复
有时候, 我们不小心把文件给删除了. 想恢复这个文件时, 需要用到下面的命令.
我现在把仓库里的README这个文件给删除了. 然后再使用ls命令查看文件, 看看这个文件是否还存在.
$ rm README
$ ls
$ ls -al
文件已经被删除了, 这是我们使用linux基本命令去查看文件是不是还存在这个目录中.现在我们使用git去查看一下现在仓库是什么状态
$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add/rm <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
删除: README
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
发现这个文件是误删了, 我们想把它恢复回来, 现在我们有办法吗? 如果没有将这个文件提交到仓库里, 我们是没有办法将它恢复的.
$ git checkout README
然后我们再用ls查看一下文件是否存在.
$ ls -al ==> ll
总用量 16
drwxrwxr-x 3 linux linux 4096 8月 10 19:20 ./
drwxr-xr-x 44 linux linux 4096 8月 10 19:10 ../
-rw-rw-r-- 1 linux linux 9 8月 10 19:20 README
drwxrwxr-x 8 linux linux 4096 8月 10 19:20 .git/
再查看git仓库状态
$ git status
位于分支 master
无文件要提交,干净的工作区
版本回退
什么叫版本, 一次提交就相当于一个版本. 如果更准确的说是提交的回退. 每一次提交都会将修改的状态提交到仓库中保存着, 这些信息都保存那里呢?都保存在.git的目录下.
如果想回退到上次提交的版本, 那么需要使用git reset命令.
$ git reset --hard commit ID
注意: 使用这个命令后,再使用git log命令不会查看到所有log的相关信息, 那么我们没有办法获取到后一个提交的CommitID.
在这里我们需要使用git reflog命令查看后一次提交的CommitID, 如果已经有了后一次提交的CommitID, 那么我们需要使用git reset命令恢复到前面提交版本.
$ git reflog
版本之间对比
$ git diff commitID1 commitID2