GIT版本控制

一、版本控制的历史及作用 版本控制的作用: 对于IT这个行业来说,经常会遇到一个问题:代码分散的拷贝在各个分区之中,不知道哪个代码文件是最 新的,哪个代码文件是最优的。失败的复制、替换经常会导致原来尚能运行的代码遭到破坏。于是,针对 以上的问题就产生了一种解决方案,这种方案我们成为版本控制。版本控制系统是能够随着时间的推进记 录一系列文件的变化以便于你以后想要的退回到某个版本的系统。 版本控制的历史: 1)CVS:最早期的版本控制工具称为CVS,于1985年由荷兰阿姆斯特丹VU大学的Dick Grune教授完成开 发,奠定了后续版本控制软件的模型基础。CVS采用C/S模型,版本库位于服务端,实际上存储的文件可以 理解为一个RCS容器。每一个RCS文件以'.v‘作为后缀,保存该文件的每一次更改历史,使得其存储十分有 效。然而CVS也存在如下缺点:1.效率不高,服务端文件越多,处理速度越慢。2.合并困难重重,经常会遇 到严重冲突。3.不能直接对文件和目录的重命名进行版本控制,会破坏数据。 2)SVN:SVN全名为subversion,由collabNet公司于2000年开发,目的是为了弥补CVS的不足,创建一 个性能更加强大的版本控制系统来取代CVS。到了2001年的时候,SVN已经可以用于市场环境。SVN拥有 以下几个特征:1.轻量级拷贝。2.以授权文件的方式来实现版本库的授权。2.在工作区的隐藏目录下会保存 一份冗余的原始拷贝。然而,SVB比起CVS在本质上并没有突破。到2009年年底,SVN被交由APACHE社区 管理,至此svn成为了apache的一个子项目。 3)GIT:GIT由linux之父linus于2005年开发,在结构上比起SVN和CVS有很大的提升。可以说GIT是世界上 目前最优秀的版本控制系统之一。GIT的每个功能都作为一条独立的命令,导致git庞大的命令集,但这并不 妨碍各大程序人员对于GIT的喜爱,原因就在于它一个分布式的版本控制系统。此外:GIT虽然是基于linux 操作系统开发的,但目前已经可以跨平台运行在多种操作系统之上,包括linux,MAC OS X,Windows 等。 版本控制系统的分类: 版本控制主要分为三大类:本地版本控制系统,集中式版本控制系统和分布式版本控制系统。 本地版本控制:将文件的各个版本以一定的数据格式存储在本地的磁盘,这种方式在一定的程度上解决了 手动复制黏贴的问题,但无法解决多人协作的问题。 集中式版本控制:比起本地版本控制多了一个中央服务器,各个版本的数据存储在中央服务器,管理员可 以控制开发人员的权限,而开发人员也可以从中央服务器拉取数据。集中式版本控制解决了团队协作问 题,但缺点是所有数据存储在中央服务器,服务器一旦宕机,会造成不可估量的损失。SVN和CVS都是集中 式版本控制。 分布式版本控制,系统保存的不是文件变化的差两,而是文件的快照。分布式版本控制系统是分布式的, 当你从中央服务器拷贝下来代码时,你拷贝的是一个完整的版本库,包括历史纪录,提交记录等,即使某 一台机器宕机,也能够找到文件的完整备份。GIT就是分布式版本控制。

二、git 安装 [root@Ansible ~]#yum -y install git [root@Ansible ~]# git --version git version 1.7.1 [root@Ansible ~]# cp /usr/share/doc/git-1.7.1/contrib/completion/git-completion.bash /etc/bash_completion.d/ [root@Ansible ~]# source /etc/bash_completion.d/git-completion.bash 添加用户和邮箱 [root@Ansible ~]# git config --global user.name "carol" [root@Ansible ~]# git config --global user.email lijiayi@uplooking.com 新建存储目录(工作平台) [root@Ansible /]# mkdir /myproject 初始化工作平台 [root@Ansible myproject]# git init Initialized empty Git repository in /myproject/.git/ 第一次提交文件 1)先在工作区生成一个文件 [root@Ansible myproject]# echo hello >welcome.txt [root@Ansible myproject]# ls welcome.txt [root@Ansible myproject]# cat welcome.txt hello 2)为了将这个新建立的文件添加到版本库,需要执行以下指令 [root@Ansible myproject]# git add welcome.txt [root@Ansible myproject]# git commit -m "frist" [master (root-commit) ff38d0d] frist 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 welcome.txt 1)git diff:用来显示工作区和暂存区文件的差异 [root@Ansible myproject]# echo test >>welcome.txt [root@Ansible myproject]# ls welcome.txt [root@Ansible myproject]# cat welcome.txt hello test [root@Ansible myproject]# git diff welcome.txt diff --git a/welcome.txt b/welcome.txt index ce01362..b2b9cc9 100644 --- a/welcome.txt +++ b/welcome.txt @@ -1 +1,2 @@ hello +test 2)git status:用来查看改过的内容 [root@Ansible myproject]# git status
#on branch master #Changed but not updated: #(use "git add <file>..." to update what will be committed) #(use "git checkout -- <file>..." to discard changes in working directory) #modified: welcome.txt #no changes added to commit (use "git add" and/or "git commit -a") 3)git log: 用来查看历史提交的日志 [root@Ansible myproject]# git log commit ff38d0d40f471d840c49d9a1cba007763e5f6efa Author: carol lijiayi@uplooking.com Date: Mon Mar 26 13:51:50 2018 +0800

frist

4)git reset 用来做回滚 恢复工作区的文件到上一个提交的版本: [root@Ansible myproject]# echo hello daivd >> welcome.txt [root@Ansible myproject]# cat welcome.txt hello testok hello daivd [root@Ansible myproject]# git add welcome.txt [root@Ansible myproject]# git commit -m "six" [master 8568164] six 1 files changed, 1 insertions(+), 0 deletions(-) [root@Ansible myproject]# git log --graph --online fatal: unrecognized argument: --online [root@Ansible myproject]# git log --graph --oneline

  • 8568164 six
  • e9c66fd third
  • ff38d0d frist [root@Ansible myproject]# git reset --hard ff38d0d HEAD is now at ff38d0d frist [root@Ansible myproject]# ls welcome.txt [root@Ansible myproject]# cat welcome.txt hello 5)git reflog用来查看历史记录,可以结合reset完成恢复数据的操作 [root@Ansible myproject]# git reflog ff38d0d HEAD@{0}: ff38d0d: updating HEAD 8568164 HEAD@{1}: commit: six e9c66fd HEAD@{2}: HEAD@{3}: updating HEAD e825d96 HEAD@{3}: commit: second e9c66fd HEAD@{4}: e9c66fd: updating HEAD 8728c6f HEAD@{5}: commit: th4 e9c66fd HEAD@{6}: commit: third ff38d0d HEAD@{7}: HEAD^: updating HEAD 25bb637 HEAD@{8}: commit: second [root@Ansible myproject]# git reset --hard HEAD@{1} HEAD is now at 8568164 six [root@Ansible myproject]# ls welcome.txt [root@Ansible myproject]# cat welcome.txt hello testok hello daivd