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有以下功能:

1、从服务器上克隆完整的Git仓库(包括代码和版本信息)到单机上。

2、在自己的机器上根据不同的开发目的,创建分支,修改代码。

3、在单机上自己创建的分支上提交代码。

4、在单机上合并分支。

5、把服务器上最新版的代码fetch下来,然后跟自己的主分支合并。

6、生成补丁(patch),把补丁发送给主开发者。

7、看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一个人提交。如果主开发者可以自己解决,或者没有冲突,就通过。

8、一般开发者之间解决冲突的方法,开发者之间可以使用pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。

从主开发者的角度(假设主开发者不用开发代码)看,git有以下功能:

1、查看邮件或者通过其它方式查看一般开发者的提交状态。

2、打上补丁,解决冲突(可以自己解决,也可以要求开发者之间解决以后再重新提交,如果是开源项目,还要决定哪些补丁有用,哪些不用)。

3、向公共服务器提交结果,然后通知所有开发人员。

二、在Linux上使用Git

1.Git基本命令

Git入门,什么是git,如何使用git以及git分支概念_第1张图片

Git可以看做公有部分和私有部分,公有部分为Git服务器,其数据和程序版本等信息对外而言都是一致的

私有部分是一每个使用者为单位的部分,每一个使用者的电脑都可以作为一个私有部分.

公有部分和私有部分的关系是一对多的关系.

如图所示,远程服务器是一个公有部分,Git仓库,暂存区,工作区都是私有部分.但是并不是说Git服务器没有这些组成部分,其实每一台主机都可以作为一台Git服务器,但是我们一般不在Git服务器上做修改,所以我们只使用Git服务器的仓库部分,而一般的操作员都是一个人主机为基础进行操作,这就需要了解三个分区的概论和关系

Git入门,什么是git,如何使用git以及git分支概念_第2张图片

2.在Linux上安装Git

  我使用的CentOS系统

  1. [root@web1 ~]# yum -y install git
  2. [root@web1 ~]# git --version //查看版本

3.创建一个Git服务器

如图所示我们需要一个Git服务器,作为公共仓库

 

Git入门,什么是git,如何使用git以及git分支概念_第3张图片

  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 [email protected]:/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 "[email protected]"  //填写你的email地址和用户名
  2. [root@web2 project]# git config --global user.name "Your Name"
  3. [root@web2 project]# cat ~/.gitconfig   //查看一下配置信息
  4. [user]
  5.     email = [email protected]
  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. [email protected]'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.  
  5. [root@web2 project]# echo "first" >> new.txt      //对文件的第一次修改
  6. [root@web2 project]# git add .
  7. [root@web2 project]# git commit -m "new.txt:first line"
  8.  
  9. [root@web2 project]# echo "second" >> new.txt    //第二次修改
  10. [root@web2 project]# git add .
  11. [root@web2 project]# git commit -m "new.txt:second"
  12.  
  13. [root@web2 project]# echo "third" >> new.txt      //第三次修改
  14. [root@web2 project]# git add .
  15. [root@web2 project]# git commit -m "new.txt:third"
  16. [root@web2 project]# git push
  17.  
  18. [root@web2 project]# echo "123" > num.txt      //新建一个文件内容为123
  19. [root@web2 project]# git add .
  20. [root@web2 project]# git commit -m "num.txt:123"
  21.  
  22. [root@web2 project]# echo "456" > num.txt                      //修改内容为456
  23. [root@web2 project]# git add .
  24. [root@web2 project]# git commit -m "num.txt:456"
  25.  
  26. [root@web2 project]# echo "789" > num.txt       //修改内容为789
  27. [root@web2 project]# git add .
  28. [root@web2 project]# git commit -m "num.txt:789"
  29. [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分支概念_第4张图片

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.  
  6. [root@web2 project]# git checkout master
  7. [root@web2 project]# echo "BBB" > a.txt               //在master下的内容为BBB
  8. [root@web2 project]# git add .
  9. [root@web2 project]# git commit -m "add a.txt by master"
  10. [root@web2 project]# git merge hotfix             //合并分支
  11. 自动合并 a.txt
  12. 冲突(添加/添加):合并冲突于 a.txt
  13. 自动合并失败,修正冲突然后提交修正的结果。 

可以看到系统会提示合并失败,这个时候需要我们手动去修改这个文件的内容,保证内容的一致性,这需要做协商,如果是一个团队的话我们就需要统一意见,因为程序是不知道你到底用哪个版本的内容.

我们将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             //合并分支

 

你可能感兴趣的:(Git,git版本分支的冲突问题,git,怎么使用git,怎么样部署git服务器)