Git|Git入门,什么是git,如何使用git以及git分支概念

一、Git
Git(读音为/g?t/。)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理. Git是Linus Torvalds(李纳斯)为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
Git是用于Linux 内核开发的版本控制工具。与常用的版本控制工具CVS, Subversion等不同,它采用了分布式版本库的方式,不必服务器端软件支持(wingeddevil注:这得分是用什么样的服务端,使用http协议或者git协议等不太一样。并且在push和pull的时候和服务器端还是有交互的。),使源代码的发布和交流极其方便。Git的速度很快,这对于诸如Linux kernel这样的大项目来说自然很重要。Git最为出色的是它的合并跟踪(merge tracing)能力。
分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库。
【Git|Git入门,什么是git,如何使用git以及git分支概念】Git的功能特性:
从一般开发者的角度来看,git有以下功能:
1、从服务器上克隆完整的Git仓库(包括代码和版本信息)到单机上。
2、在自己的机器上根据不同的开发目的,创建分支,修改代码。
3、在单机上自己创建的分支上提交代码。
4、在单机上合并分支。
5、把服务器上最新版的代码fetch下来,然后跟自己的主分支合并。
6、生成补丁(patch),把补丁发送给主开发者。
7、看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一个人提交。如果主开发者可以自己解决,或者没有冲突,就通过。
8、一般开发者之间解决冲突的方法,开发者之间可以使用pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。
从主开发者的角度(假设主开发者不用开发代码)看,git有以下功能:
1、查看邮件或者通过其它方式查看一般开发者的提交状态。
2、打上补丁,解决冲突(可以自己解决,也可以要求开发者之间解决以后再重新提交,如果是开源项目,还要决定哪些补丁有用,哪些不用)。
3、向公共服务器提交结果,然后通知所有开发人员。
二、在Linux上使用Git
1.Git基本命令
Git|Git入门,什么是git,如何使用git以及git分支概念
文章图片

Git可以看做公有部分和私有部分,公有部分为Git服务器,其数据和程序版本等信息对外而言都是一致的
私有部分是一每个使用者为单位的部分,每一个使用者的电脑都可以作为一个私有部分.
公有部分和私有部分的关系是一对多的关系.
如图所示,远程服务器是一个公有部分,Git仓库,暂存区,工作区都是私有部分.但是并不是说Git服务器没有这些组成部分,其实每一台主机都可以作为一台Git服务器,但是我们一般不在Git服务器上做修改,所以我们只使用Git服务器的仓库部分,而一般的操作员都是一个人主机为基础进行操作,这就需要了解三个分区的概论和关系
Git|Git入门,什么是git,如何使用git以及git分支概念
文章图片

2.在Linux上安装Git
我使用的CentOS系统

  1. [root@web1 ~]# yum -y install git
  2. [root@web1 ~]# git --version //查看版本
3.创建一个Git服务器
如图所示我们需要一个Git服务器,作为公共仓库

Git|Git入门,什么是git,如何使用git以及git分支概念
文章图片

  1. [root@web1 ~]# mkdir /var/git//创建一个目录作为仓库
  2. [root@web1 ~]# git init /var/git/project --bare//初始化project仓库信息 --bare 采用原始配置
  3. [root@web1 ~]# ls /var/git/project//默认的文件信息
  4. config description HEAD hooks info objects refs
4.在客户端克隆服务器版本到本地
 1)克隆
  1. [root@web2 ~]# yum -y install git//客户端需要安装git
  2. [root@web2 ~]# git clone root@192.168.2.100:/var/git/project//使用clone命令 ip地址为git服务器地址
  3. warning: 您似乎克隆了一个空版本库。
  4. [root@web2 ~]# cd project//在哪个目录下做clone操作,文件就在存哪
  5. [root@web2 ~]# ls//默认什么都没有

 2)修改Git配置
 我们这里是局域网的Git环境,可以随意填写,如果你使用GitHub软件,你需要填写你在GitHub上注册的信息

4.客户端对克隆文件的增删改查操作
 必须要先进入工作区再操作数据
  1. [root@web2 project]# git config --global user.email "you@example.com"//填写你的email地址和用户名
  2. [root@web2 project]# git config --global user.name "Your Name"
  3. [root@web2 project]# cat ~/.gitconfig//查看一下配置信息
  4. [user]
  5. email = you@example.com
  6. name = Your Name
  7. [root@web2 project]# echo "init date" > init.txt//写一个文件测试一下
  8. [root@web2 project]# ls
  9. init.txt
查看状态,注意我们目前处在的位置是工作区
[root@proxy2 project]# git status//在当前的clone文件下使用命令
# 位于分支 master
#
# 初始提交
#
# 未跟踪的文件:
#(使用 "git add ..." 以包含要提交的内容)
#
#a.txt
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
5.将工作区的内容提交到暂存区
  1. [root@web2 project]# git add .//要加'.' 代表当前目录文件
  2. [root@proxy2 project]# git status//提交之后就没有提交为空的提示了
    # 位于分支 master
    #
    # 初始提交
    #
    # 要提交的变更:
    #(使用 "git rm --cached ..." 撤出暂存区)
    #
    #新文件:a.txt
    #
6.将暂存区修改提交到本地仓库
 如果没有修改git配置就无法提交到本地仓库
  1. [root@web2 project]# git commit -m "注释,可以为任意字符"//如果没有修改Git配置 需要先修改Git配置
  2. [root@web2 project]# git status
  3. # 位于分支 master
    无文件要提交,干净的工作区
7.将本地仓库中的数据推送到远程服务器(web2将数据推送到web1)
  1. [root@web2 project]# git config --global push.default simple //配置一下提交策略
  2. [root@web2 project]# git push
  3. root@192.168.2.100's password: 输入服务器root密码
  4. [root@web2 project]# git status
8.版本控制-更新本地版本
 如果你本地的程序版本在你做修改的时候服务器发布了新的的版本,你可以用pull命令更新本地版本,但是代价是你当前的修改可能被抹去,所以你最好先提交push在使用pull
  1. [root@web2 project]# git pull 
  2. Your configuration specifies to merge with the ref 'master'//如果没有更新的话就会报一下提示
    from the remote, but no such ref was fetched.
9.查看版本日志
  1. [root@web2 project]# git log//做多少次push 就有几条log信息
  2. [root@web2 project]# git reflog//查看git指针
  3. [root@web2 project]# git log --oneline//简单的显示log信息

三、Head指针操作
HEAD指针是一个可以在任何分支和版本移动的指针,通过移动指针我们可以将数据还原至任何版本。每做一次提交操作都会导致git更新一个版本,HEAD指针也跟着自动移动。
1.准备工作
多对数据仓库进行修改、提交操作,以产生多个版本
  1. [root@web2 project]# echo "new file" > new.txt//一个新文件
  2. [root@web2 project]# git add .
  3. [root@web2 project]# git commit -m "add new.txt"
  4. [root@web2 project]# echo "first" >> new.txt//对文件的第一次修改
  5. [root@web2 project]# git add .
  6. [root@web2 project]# git commit -m "new.txt:first line"
  7. [root@web2 project]# echo "second" >> new.txt//第二次修改
  8. [root@web2 project]# git add .
  9. [root@web2 project]# git commit -m "new.txt:second"
  10. [root@web2 project]# echo "third" >> new.txt//第三次修改
  11. [root@web2 project]# git add .
  12. [root@web2 project]# git commit -m "new.txt:third"
  13. [root@web2 project]# git push
  14. [root@web2 project]# echo "123" > num.txt//新建一个文件内容为123
  15. [root@web2 project]# git add .
  16. [root@web2 project]# git commit -m "num.txt:123"
  17. [root@web2 project]# echo "456" > num.txt//修改内容为456
  18. [root@web2 project]# git add .
  19. [root@web2 project]# git commit -m "num.txt:456"
  20. [root@web2 project]# echo "789" > num.txt//修改内容为789
  21. [root@web2 project]# git add .
  22. [root@web2 project]# git commit -m "num.txt:789"
  23. [root@web2 project]# git push
2.查看git版本信息
  1. [root@web2 project]# git log --oneline
  2. 04ddc0f num.txt:789
  3. 7bba57b num.txt:456
  4. 301c090 num.txt:123
  5. b427164 new.txt:third
  6. 0584949 new.txt:second
  7. ece2dfd new.txt:first line
  8. e1112ac add new.txt
  9. 1a0d908 初始化
3.移动HEAD指针,将数据还原到任意版本
HEAD@{0}为指针当前指向的位置 ,你向移动到哪个版本就哪个版本,前提是有做提交
  1. [root@web2 project]# git reset --hard 301c0//将指针移动到内容为123的版本
  2. [root@web2 project]# git reflog
  3. 301c090 HEAD@{0}: reset: moving to 301c0//移动后会提示
  4. 04ddc0f HEAD@{1}: commit: num.txt:789
  5. 7bba57b HEAD@{2}: commit: num.txt:456
  6. 301c090 HEAD@{3}: commit: num.txt:123
  7. b427164 HEAD@{5}: commit: new.txt:third
  8. 0584949 HEAD@{6}: commit: new.txt:second
  9. ece2dfd HEAD@{7}: commit: new.txt:first line
  10. e1112ac HEAD@{8}: commit: add new.txt
  11. 1a0d908 HEAD@{9}: commit (initial): 初始化
  12. [root@web2 project]# cat num.txt#查看文件是否为123
  13. 123
  14. [root@web2 project]# git reset --hard 7bba57b//将指针移动到内容为456的版本
  15. [root@web2 project]# cat num.txt#查看文件是否为456
  16. 456
4.模拟误删后的数据还原操作
利用指针还可以恢复误删除的文件,比如你在本地删除了某个版本的文件,如果你有做提交,你可以去Git服务器找到原版的文件,前提是你必须提交,如果你获得的是最新版本,你修改了这个版本的文件,但是你没有提交到Git服务器,此时你不小心删除了某个文件,那么你就无法恢复了.所以在你关机之前,应该养成提交服务器的习惯.

四、分支
Git支持按功能模块、时间、版本等标准创建分支,分支可以让开发分多条主线同时进行,每条主线互不影响,分支效果如图Git|Git入门,什么是git,如何使用git以及git分支概念
文章图片

MASTER分支(MASTER是主分支,是代码的核心)。
DEVELOP分支(DEVELOP最新开发成果的分支)。
RELEASE分支(为发布新产品设置的分支)。
HOTFIX分支(为了修复软件BUG缺陷的分支)。
FEATURE分支(为开发新功能设置的分支)。
所有分支都是从MASTER分支分离出去的,所以MASTER是整个版本的核心,比如说我在MASTER上做了一个DEVELOP分支以开发新版本,那么当我完成了整个开发,被开发出来的版本将作为MASTER版本取代之前老的版本
以上命名是规范命名,其实分支名可以由自己设定,为了统一,我们最好使用较为规范的分支命名

1.查看分支
如果你没有做过切换分支操作,那么默认分支都是master
[root@proxy2 project]# git status
# 位于分支 master
无文件要提交,干净的工作区

2.创建分支
  1. [root@web2 project]# git branch hotfix//创建两个版本的分支
  2. [root@web2 project]# git branch feature
  3. [root@web2 project]# git branch -v
  4. feature 0dc2b76 delete init.txt
  5. hotfix 0dc2b76 delete init.txt
  6. * master 0dc2b76 delete init.txt//*号代表当前分支
补充 git branch -d 可以删除分支
3.切换分支
  1. [root@web2 project]# git checkout hotfix//切换到hotfix
  2. [root@web2 project]# git branch -v
  3. feature 0dc2b76 delete init.txt
  4. * hotfix 0dc2b76 delete init.txt
  5. master 0dc2b76 delete init.txt
4.合并分支
 我们创建了一个hotfix分支并新建了一个文件,那么这个hotfix分支就是领先于master分支了,我们在合并分支,实际上就将hotfix作为了主分支
  1. [root@web2 project]# git checkout hotfix//切换到hotfix
  2. [root@web2 project]# echo "fix a bug" >> new.txt//在hotfix分支上创建一个文件
  3. [root@web2 project]# git add .
  4. [root@web2 project]# git commit -m "fix a bug"//不要提交到
  5. [root@web2 project]# git checkout master//切换到master分支 
  6. [root@web2 project]# cat new.txt#默认master分支中没有hotfix分支中的数据
  7. [root@web2 project]# git merge hotfix//合并分支 将hotfix 的新内容合并到master
  8. Updating 0dc2b76..5b4a755
  9. Fast-forward
  10. new.txt | 1 ++
  11. 1 file changed, 1 insertions(+)
  12. [root@web2 project]# git push //提交到Git服务器
5.版本分支的冲突问题
 假设我们有两个分支,master和hotfix,如果我们在这个两个分支下都对一个文件进行了修改,那么当我们做分支合并的时候,以哪个分支的内容为主呢?
  1. [root@web2 project]# git checkout hotfix
  2. [root@web2 project]# echo "AAA" > a.txt//在hotfix下的内容为AAA
  3. [root@web2 project]# git add .
  4. [root@web2 project]# git commit -m "add a.txt by hotfix"
  5. [root@web2 project]# git checkout master
  6. [root@web2 project]# echo "BBB" > a.txt//在master下的内容为BBB
  7. [root@web2 project]# git add .
  8. [root@web2 project]# git commit -m "add a.txt by master"
  9. [root@web2 project]# git merge hotfix//合并分支
  10. 自动合并 a.txt
  11. 冲突(添加/添加):合并冲突于 a.txt
  12. 自动合并失败,修正冲突然后提交修正的结果。 
可以看到系统会提示合并失败,这个时候需要我们手动去修改这个文件的内容,保证内容的一致性,这需要做协商,如果是一个团队的话我们就需要统一意见,因为程序是不知道你到底用哪个版本的内容.
我们将hotfix下的内容改为BBB,再尝试合并
  1. [root@web2 project]# git checkout hotfix
  2. [root@web2 project]# cat a.txt#该文件中包含有冲突的内容,你可以看到不同分支的内容用'=='隔开
  3. <<<<<<< HEAD
  4. BBB
  5. =======
  6. AAA
  7. >>>>>>> hotfix
  8. //你可以选择删除某分支的内容,如果你要删掉hotfix的内容记住要将=== >>>hotfix <<
  9. [root@web2 project]# git merge hotfix//合并分支

    推荐阅读