04-Git

作者: 郑元吉 | 来源:发表于2018-11-17 17:12 被阅读44次

    一、git的使用

    1.git简介

    1.1案例引入

    如果你用Word写过毕业论文,那你一定有这样的经历:

    想删除一个段落,又怕将来想恢复找不回来怎么办?有办法,先把当前文件“另存为……”一个新的Word文件,再接着改,改到一定程度,再“另存为……”一个新文件,这样一直改下去,最后你的Word文档变成了这样:

    文档库.png

    过了一周,你想找回被删除的文字,但是已经记不清删除前保存在哪个文件里了,只好一个一个文件去找,真麻烦。

    看着一堆乱七八糟的文件,想保留最新的一个,然后把其他的删掉,又怕哪天会用上,还不敢删,真郁闷。

    更要命的是,有些部分需要你的财务同事帮助填写,于是你把文件Copy到U盘里给她(也可能通过Email发送一份给她),然后,你继续修改Word文件。一天后,同事再把Word文件传给你,此时,你必须想想,发给她之后到你收到她的文件期间,你作了哪些改动,得把你的改动和她的部分合并,真困难。

    于是你想,如果有一个软件,不但能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以,岂不是很方便?

    这个软件用起来就应该像这个样子,能记录每次文件的改动:

    版本 文件名 用户 说明 日期
    1 service.doc 张三 删除了软件服务条款5 7/12 10:38
    2 service.doc 张三 增加了License人数限制 7/12 18:09
    3 service.doc 李四 财务部门调整了合同金额 7/13 9:51
    4 service.doc 张三 延长了免费升级周期 7/14 15:17

    这样,你就结束了手动管理多个“版本”的史前时代,进入到版本控制的20世纪。

    Git是目前世界上最先进的分布式版本控制系统(没有之一)。

    Git有什么特点?简单来说就是:高端大气上档次!

    1.2git的由来

    ​ 很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。

    ​ Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?

    ​ 事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!

    ​ 你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。

    ​ 不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。

    ​ 安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。

    ​ Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:

    ​ Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下。

    ​ Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。

    历史就是这么偶然,如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了

    1.3集中式和分布式

    ​ SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢?

    ​ 集中式版本控制系统:版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。例如:中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆【缺点:必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊】

    ​ 分布式版本控制系统:根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。如果是一个团队合作工作,比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了

    ​ 二者之间的区别:和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。

    ​ 实际情况:使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

    ​ 当然,Git的优势不单是不必联网这么简单,后面我们还会看到Git极其强大的分支管理,把SVN等远远抛在了后面。

    2.安装git

    git:查看是否已经安装

    sudo apt-get install git :安装

    3.创建版本库

    3.1什么是版本库

    版本库又被称为仓库,【repository】,初期可以理解为一个目录,这个目录里面管理的文件都可以被称为被git管理起来的,每个文件的修改,删除等的操作git都能进行跟踪

    3.2创建版本库

    git init:将一个普通目录变成版本库

    演示命令:
    yangyang@yangyang-virtualmachine:~$ cd Desktop/
    yangyang@yangyang-virtualmachine:~/Desktop$ mkdir python  
    yangyang@yangyang-virtualmachine:~/Desktop$ cd python  /
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ pwd
    /home/yangyang/Desktop/python  
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git init
    已初始化空的 Git 仓库于 /home/yangyang/Desktop/python  /.git/
    #就创建一个git仓库【版本库】,
    
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ ls
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ ls -a
    .  ..  .git
    #.git是一个目录,就是用来跟踪管理版本库
    
    #注意:也不一定目录是空的,但是为了安全起见,最好以一个空的目录作为版本库
    
    3.3把文件添加到版本库

    注意:所有的版本控制系统都是跟踪的是文件的改动

    git add filename :将文件添加到缓存区

    git commit -m "日志" :提交文件到版本库【仓库】

    演示命令:
    angyang@yangyang-virtualmachine:~/Desktop/python  $ touch text.txt
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ vim text.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git add text.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git commit -m "create a new file and init"
    
    *** 请告诉我你是谁。      #不知道主人是谁,则需要配置用户名和邮箱
                           #注意:用户名和邮箱来自github上的注册
    
    运行
    
      git config --global user.email "you@example.com"
      git config --global user.name "Your Name"
    
    来设置您账号的缺省身份标识。
    如果仅在本仓库设置身份标识,则省略 --global 参数。
    fatal: 无法自动探测邮件地址(得到 'yangyang@yangyang-virtualmachine.(none)')
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git config --global user.email "18501970795@163.com"     #配置github上的邮箱
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git config --global user.name "yangyang-git"             #配置github上的用户名
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git commit -m "create a new file and init"   
    #-m后面输入的是本次提交的说明【就是所谓的日志】,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录
    [master(根提交) d4b0bde] create a new file and init
     1 file changed, 1 insertion(+)
     create mode 100644 text.txt
    #git commit命令执行成功后会告诉你,1 file changed:1个文件被改动(我们新添加的readme.txt文件);3 insertions:插入了一行内容
    
    #再次修改文件,则重复git add和git commit命令
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ vim text.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git add text.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git commit -m "add hello" 
    [master 1f12c8b] add hello
     1 file changed, 1 insertion(+)
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ 
    

    问题:为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,如下:

    演示命令:
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ touch text1.txt
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ touch text2.txt
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git add text1.txt
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git add text2.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git commit -m "create twofiles"
    [master ce63cb0] create twofiles
     2 files changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 text1.txt
     create mode 100644 text2.txt
      
      #总结:add一次添加一个文件,commit可以一次提交多个文件
    

    4.时光穿梭机【覆水可收】

    git status:查看仓库当前的状态

    git diff filename:查看仓库具体的改动

    演示命令:
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ vim text.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git add text.txt
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git status
    位于分支 master
    要提交的变更:
      (使用 "git reset HEAD <文件>..." 以取消暂存)
    
      修改:     text.txt
    
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git commit -m "add 111"
    [master 3af9e8e] add 111
     1 file changed, 1 insertion(+)
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git status
    位于分支 master
    无文件要提交,干净的工作区
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ vim text.txt
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git diff text.txt
    diff --git a/text.txt b/text.txt
    index 4892bab..cbb039d 100644
    --- a/text.txt
    +++ b/text.txt
    @@ -1,3 +1,3 @@
     this is a text
     hello
    -1111
    +11112222
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git add text.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git commit -m "222"
    [master 55804ad] 222
     1 file changed, 1 insertion(+), 1 deletion(-)
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git diff text.txt
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ 
    
    4.1版本回退

    工作原理:每当修改一个文件,并且使用commit提交之后,其实就相当于保存了一个快照

    需求:回退到上一个版本

    补充:要回退版本,首先需要知道当前处于哪个版本,在git中,用HEAD表示当前版本,上一个版本是HEAD,上上个版本是HEAD^,如果向上找100个版本,则表示为HEAD~100

    git reset --hard 版本号【commit id】

    演示命令:
    yangyang@yangyang-virtualmachine:~/Desktop/python$ git log
    commit 55804ad1c9bca1d98d366e28e50ecbfac2c82597 (HEAD -> master)
    Author: yangyang-git <18501970795@163.com>
    Date:   Fri Jun 29 10:31:55 2018 +0800
    
        222
    
    commit 3af9e8eeb2d9d5dfb04e52968c255d0dd5e3e8ee
    Author: yangyang-git <18501970795@163.com>
    Date:   Fri Jun 29 10:28:47 2018 +0800
    
        add 111
    
    commit ce63cb0594622577d144372d8c48dcabee631973
    Author: yangyang-git <18501970795@163.com>
    Date:   Fri Jun 29 10:05:22 2018 +0800
    
        create twofiles
    
    commit 1f12c8b33abea0c7c0ae195aaa7ef18894681137
    Author: yangyang-git <18501970795@163.com>
    Date:   Fri Jun 29 10:03:26 2018 +0800
    
        add hello
    
    commit d4b0bde029497a68dcacb026fd299b90c0604116
    Author: yangyang-git <18501970795@163.com>
    Date:   Fri Jun 29 10:00:33 2018 +0800
    
        create a new file and init
    
    yangyang@yangyang-virtualmachine:~/Desktop/python$ git log --pretty=oneline
    55804ad1c9bca1d98d366e28e50ecbfac2c82597 (HEAD -> master) 222
    3af9e8eeb2d9d5dfb04e52968c255d0dd5e3e8ee add 111
    ce63cb0594622577d144372d8c48dcabee631973 create twofiles
    1f12c8b33abea0c7c0ae195aaa7ef18894681137 add hello
    d4b0bde029497a68dcacb026fd299b90c0604116 create a new file and init
    yangyang@yangyang-virtualmachine:~/Desktop/python$ git reset --hard HEAD^
    HEAD 现在位于 3af9e8e add 111
    yangyang@yangyang-virtualmachine:~/Desktop/python$ cat text.txt 
    this is a text
    hello
    1111
    yangyang@yangyang-virtualmachine:~/Desktop/python$ git log --pretty=oneline
    3af9e8eeb2d9d5dfb04e52968c255d0dd5e3e8ee (HEAD -> master) add 111
    ce63cb0594622577d144372d8c48dcabee631973 create twofiles
    1f12c8b33abea0c7c0ae195aaa7ef18894681137 add hello
    d4b0bde029497a68dcacb026fd299b90c0604116 create a new file and init
    yangyang@yangyang-virtualmachine:~/Desktop/python$ git reset --hard 55804ad1
    HEAD 现在位于 55804ad 222
    yangyang@yangyang-virtualmachine:~/Desktop/python$ cat text.txt 
    this is a text
    hello
    11112222
    yangyang@yangyang-virtualmachine:~/Desktop/python$ git reset --hard HEAD^
    HEAD 现在位于 3af9e8e add 111
    yangyang@yangyang-virtualmachine:~/Desktop/python$ git reflog
    3af9e8e (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
    55804ad HEAD@{1}: reset: moving to 55804ad1
    3af9e8e (HEAD -> master) HEAD@{2}: reset: moving to HEAD^
    55804ad HEAD@{3}: commit: 222
    3af9e8e (HEAD -> master) HEAD@{4}: commit: add 111
    ce63cb0 HEAD@{5}: commit: create twofiles
    1f12c8b HEAD@{6}: commit: add hello
    d4b0bde HEAD@{7}: commit (initial): create a new file and init
    yangyang@yangyang-virtualmachine:~/Desktop/python$ git reset --hard 55804ad
    HEAD 现在位于 55804ad 222
    

    总结:

    • HEAD指向的是当前版本,所以,git在历史的版本之间来回切换,使用git reset --hard commit id
    • 切换版本前,可以使用git log查看提交历史记录,以便于确定回到哪个历史版本
    • 要重返未来,用git reflog查看历史执行过的git操作,从上往下寻找第一个commit的操作,则是未来的最新的版本
    4.2工作区和暂存区

    工作区:working Driectory,就是你电脑中的能看到的目录

    版本库:工作区中有一个隐藏的目录.git,该目录就是git中的版本库

    ​ 版本库中存放了很多的数据,其中包括暂存区【缓存区,stage或者index】,还有git为我们自动创建的第一个分支master【主分支】,以及指向master的一个指针HEAD

    往git版本库中添加文件,分为两步:

    ​ a.git add,实际是将文件添加到暂存区中

    ​ b.git commit .实际是将暂存区的文件提交到当前分支【主分支】

    演示命令:
    #a.修改text.txt文件
    yangyang@yangyang-virtualmachine:~/Desktop/python$ vim text.txt 
    #b.在工作区中新增一个check.txt文本文件
    yangyang@yangyang-virtualmachine:~/Desktop/python$ touch check.txt
    #c.在check.txt文件中新增内容
    yangyang@yangyang-virtualmachine:~/Desktop/python$ vim check.txt
    #d.使用git status查看一下当前的状态
    yangyang@yangyang-virtualmachine:~/Desktop/python$ git status
    位于分支 master
    尚未暂存以备提交的变更:
      (使用 "git add <文件>..." 更新要提交的内容)
      (使用 "git checkout -- <文件>..." 丢弃工作区的改动)
    
      修改:     text.txt
    
    未跟踪的文件:
      (使用 "git add <文件>..." 以包含要提交的内容)
    
      check.txt
    
    修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
    #Git非常清楚地告诉我们,text.txt被修改了,而check.txt还从来没有被添加过,所以它的状态是未跟踪
    
    #e.将两个文件都添加到暂存区
    yangyang@yangyang-virtualmachine:~/Desktop/python$ git add text.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python$ git add check.txt 
    #f.再次查看
    yangyang@yangyang-virtualmachine:~/Desktop/python$ git status
    位于分支 master
    要提交的变更:
      (使用 "git reset HEAD <文件>..." 以取消暂存)
    
      新文件:   check.txt
      修改:     text.txt
    #g.将两个文件提交到分支
    yangyang@yangyang-virtualmachine:~/Desktop/python$ git commit -m "modify textxt and create a new file named check"
    [master 9885393] modify textxt and create a new file named check
     2 files changed, 2 insertions(+)
     create mode 100644 check.txt
    #h.再次查看
    yangyang@yangyang-virtualmachine:~/Desktop/python$ git status
    位于分支 master
    无文件要提交,干净的工作区
    yangyang@yangyang-virtual
    
    #一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是干净的
    
    4.3管理修改

    注意:git跟踪管理的是修改,并非文件

    演示命令:
    3af9e8e (HEAD -> master) HEAD@{2}: reset: moving to HEAD^
    55804ad HEAD@{3}: commit: 222
    3af9e8e (HEAD -> master) HEAD@{4}: commit: add 111
    ce63cb0 HEAD@{5}: commit: create twofiles
    1f12c8b HEAD@{6}: commit: add hello
    d4b0bde HEAD@{7}: commit (initial): create a new file and init
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git reset --hard 55804ad
    HEAD 现在位于 55804ad 222
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ vim text.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ touch check.txt
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ vim check.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git status
    位于分支 master
    尚未暂存以备提交的变更:
      (使用 "git add <文件>..." 更新要提交的内容)
      (使用 "git checkout -- <文件>..." 丢弃工作区的改动)
    
      修改:     text.txt
    
    未跟踪的文件:
      (使用 "git add <文件>..." 以包含要提交的内容)
    
      check.txt
    
    修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git add text.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git add check.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git status
    位于分支 master
    要提交的变更:
      (使用 "git reset HEAD <文件>..." 以取消暂存)
    
      新文件:   check.txt
      修改:     text.txt
    
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git commit -m "modify textxt and create a new file named check"
    [master 9885393] modify textxt and create a new file named check
     2 files changed, 2 insertions(+)
     create mode 100644 check.txt
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git status
    位于分支 master
    无文件要提交,干净的工作区
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ cat text.txt 
    this is a text
    hello
    11112222
    3333
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ vim text.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git add text.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git status
    位于分支 master
    要提交的变更:
      (使用 "git reset HEAD <文件>..." 以取消暂存)
    
      修改:     text.txt
    
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ vim text.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git commit -m "add 44 & 55"
    [master ad2c692] add 44 & 55
     1 file changed, 1 insertion(+)
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git status
    位于分支 master
    尚未暂存以备提交的变更:
      (使用 "git add <文件>..." 更新要提交的内容)
      (使用 "git checkout -- <文件>..." 丢弃工作区的改动)
    
      修改:     text.txt
    
    修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git diff HEAD -- text.txt
    diff --git a/text.txt b/text.txt    
    index e1fd18b..4ae8e5f 100644
    --- a/text.txt
    +++ b/text.txt
    @@ -3,3 +3,4 @@ hello
     11112222
     3333
     44444
    +55555
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git add text.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git commit -m "add 55"
    [master e233f10] add 55
     1 file changed, 1 insertion(+)
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git diff HEAD -- text.txt
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ 
    
    4.4撤销修改

    a.修改了文件内容,但是还没有添加到暂存区

    (注意:已经提交过的文件修改后没有提交暂存区的用git checkout -- 文件名来丢弃本次修改;新增的文件修改后没有提交暂存区的用rm 文件名来丢弃本次修改)

    演示命令:
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git status
    位于分支 master
    尚未暂存以备提交的变更:
      (使用 "git add <文件>..." 更新要提交的内容)
      (使用 "git checkout -- <文件>..." 丢弃工作区的改动)
    
      修改:     text.txt
    
    修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ cat text.txt 
    this is a text
    hello
    11112222
    3333
    44444
    55555
    stupid boss
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git checkout -- text.txt或git checkout --ff text.txt 表示强制检出(丢弃本地修改)#回到最近一次git commit或git add时的状态
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ cat text.txt
    this is a text
    hello
    11112222
    3333
    44444
    55555
    

    b.不但修改了内容,还添加到了暂存区,但是还没有提交(只能回退到保存时的状态)

    演示命令:
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ vim text.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git add text.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git status
    位于分支 master
    要提交的变更:
      (使用 "git reset HEAD <文件>..." 以取消暂存)
    
      修改:     text.txt
    
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git reset HEAD text.txt
    重置后取消暂存的变更:        #把暂存区的修改撤销掉
    M text.txt
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git status
    位于分支 master
    尚未暂存以备提交的变更:
      (使用 "git add <文件>..." 更新要提交的内容)
      (使用 "git checkout -- <文件>..." 丢弃工作区的改动)
    
      修改:     text.txt
    
    修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git checkout -- text.txt     #丢弃工作区的修改
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git status
    位于分支 master
    无文件要提交,干净的工作区
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ cat text.txt 
    this is a text
    hello
    11112222
    3333
    44444
    55555
    

    c.直接将修改的内容提交到了版本库

    实质:版本回退

    演示命令:
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ vim text.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git add text.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git commit -m "fehj"
    [master 8ac0ac4] fehj
     1 file changed, 1 insertion(+)
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git reset --hard HEAD~1
    HEAD 现在位于 e233f10 add 55
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ cat text.txt 
    this is a text
    hello
    11112222
    3333
    44444
    55555
    
    4.5删除文件(删除完文件后也需要把删除的文件进行暂存--提交--)

    在git中,删除文件也是一个修改操作

    演示命令:
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ touch newfile.txt
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git add newfile.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git commit -m "create new file"
    [master f86d2bd] create new file
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 newfile.txt
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ rm newfile.txt 
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git status
    位于分支 master
    尚未暂存以备提交的变更:
      (使用 "git add/rm <文件>..." 更新要提交的内容)
      (使用 "git checkout -- <文件>..." 丢弃工作区的改动)
    
      删除:     newfile.txt
    
    修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git commit -m "delete newfile"
    [master d41fc15] delete newfile
     1 file changed, 0 insertions(+), 0 deletions(-)
     delete mode 100644 newfile.txt
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ git status
    位于分支 master
    无文件要提交,干净的工作区
    

    5.远程仓库

    5.1建立远程仓库的准备工作

    步骤:

    a.创建github账号

    b.生成ssh key【秘钥,建立本地和网络之间的连接】

    ​ 命令:ssh-keygen -t rsa -C "github的注册邮箱"

    c.添加到github

    d.检测是否添加成功

    ​ 命令:ssh -T git@github.com

    演示命令:
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ ssh-keygen  -t   rsa  -C    "18501970795@163.com"      #生成ssh key
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/yangyang/.ssh/id_rsa): 
    #Created directory '/home/yangyang/.ssh'.
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /home/yangyang/.ssh/id_rsa.
    Your public key has been saved in /home/yangyang/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:o/KqM3kWKnQBZL8xGGyxhO6n82YJpN6YQfTcZMbp/3E 18501970795@163.com
    The key's randomart image is:
    +---[RSA 2048]----+
    |+*. . .          |
    |+==  *           |
    |+o++*            |
    | + ++o           |
    |=  .. . S        |
    |.= o.  o o E     |
    |o Xoo.. . o      |
    |.*==oo   .       |
    | .*B...          |
    +----[SHA256]-----+
    yangyang@yangyang-virtualmachine:~/Desktop/python  $ cd ../..
    yangyang@yangyang-virtualmachine:~$ cd .ssh/
    yangyang@yangyang-virtualmachine:~/.ssh$ ls
    id_rsa  id_rsa.pub
    yangyang@yangyang-virtualmachine:~/.ssh$ cat id_rsa.pub      #查看生成的公钥
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCwiwfMpduAI7BP7ItaoZ8iyqWwN4io6ErpF9wNWLHXHrKSgR5A/tcVW5T90/q7v/HDgMQ8uBcF+WLBKamYVG31mj43yu2io/FRmEoSHKbRW0Q5aBtlu9bnvUsiJVI4F8eI9O9/b1iiAaQBta5swEkUUqJ6e2ZpKxeye5HU5Hgm36zEjT4EIflMr4ox/+WQmVYLf9lA7IMvYpmRd3cqtoGoxCdcmUu3T/hi9anYhlrsUxda46w+XC2ckZ1K0ZE3lrQOs0HQX9f4HQrKZupar8+GYst3dBQZz+V1YP7QmfMlSB0sM2s32SurSSO4ae2A3Oho8TPvuhJLp6Oufr+McK4j 18501970795@163.com
    
    5.2.将本地仓库和远程仓库联系起来

    演示命令:

    chenxushu@chenxushu:~$ cd Desktop/
    chenxushu@chenxushu:~/Desktop$ cd python  /
    chenxushu@chenxushu:~/Desktop/python  $ git remote add origin1 git@github.com:chenxushu1025/python  .git   #建立连接
            
    chenxushu@chenxushu:~/Desktop/python  $ git push -u origin1 master
    对象计数中: 22, 完成.        #推送master分支并与远程master产生关联
    Delta compression using up to 2 threads.
    压缩对象中: 100% (13/13), 完成.
    写入对象中: 100% (22/22), 1.79 KiB | 918.00 KiB/s, 完成.
    Total 22 (delta 2), reused 0 (delta 0)
    remote: Resolving deltas: 100% (2/2), done.
    To github.com:chenxushu1025/python  .git
     * [new branch]      master -> master
    分支 'master' 设置为跟踪来自 'origin1' 的远程分支 'master'。
    chenxushu@chenxushu:~/Desktop/python  $ ls
    text1.txt  text2.txt  text.txt
    chenxushu@chenxushu:~/Desktop/python  $ vim text1.txt 
    chenxushu@chenxushu:~/Desktop/python  $ git add text1.txt 
    chenxushu@chenxushu:~/Desktop/python  $ git commit -m "modify text1.txt"
    [master 69f0343] modify text1.txt
     1 file changed, 1 insertion(+)
    chenxushu@chenxushu:~/Desktop/python  $ git push origin1 master
    对象计数中: 3, 完成.
    Delta compression using up to 2 threads.
    压缩对象中: 100% (2/2), 完成.
    写入对象中: 100% (3/3), 308 bytes | 308.00 KiB/s, 完成.
    Total 3 (delta 0), reused 0 (delta 0)
    To github.com:chenxushu1025/python180
    

    总结:

    • 要关联一个远程仓库,使用命令 git remote add origin git@github.com:username/repoName.git
    • 关联成功之后 ,使用命令git push -u origin master第一次推送master分支的内容到远程仓库
    • 以后,每次本地提交之后,只需要使用命令git push origin master推送最新的修改【本地修改----》add到暂存区---》commit到本地仓库----》push到远程仓库】

    5.3从远程仓库克隆

    git clone git@github.com:username/repoName.git

    演示命令:
    chenxushu@chenxushu:~/Desktop/python  $ cd ..
    chenxushu@chenxushu:~/Desktop$ git clone git@github.com:chenxushu1025/clonegithub.git   #从远程仓库克隆
    正克隆到 'clonegithub'...
    remote: Counting objects: 3, done.
    remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
    接收对象中: 100% (3/3), 完成.
    chenxushu@chenxushu:~/Desktop$ cd clonegithub/
    chenxushu@chenxushu:~/Desktop/clonegithub$ ls
    README.md
    chenxushu@chenxushu:~/Desktop/clonegithub$ vim README.md 
    chenxushu@chenxushu:~/Desktop/clonegithub$ git add README.md 
    chenxushu@chenxushu:~/Desktop/clonegithub$ git commit -m "modefy"[master 4d3b04a] modefy
     1 file changed, 2 insertions(+), 1 deletion(-)
    chenxushu@chenxushu:~/Desktop/clonegithub$ git push origin master
    Warning: Permanently added the RSA host key for IP address '52.74.223.119' to the list of known hosts.
    对象计数中: 3, 完成.
    写入对象中: 100% (3/3), 258 bytes | 258.00 KiB/s, 完成.
    Total 3 (delta 0), reused 0 (delta 0)
    To github.com:chenxushu1025/clonegithub.git
       24ee8e4..4d3b04a  master -> master
        
    #克隆到本地之后,就可以任意修改本地工作区中的文件,修改完成之后,首先将修改add到暂存区,然后将暂存区中的修改提交到本地仓库,最后将本地仓库中的修改推送到远程仓库
    

    二、 分支和标签

    6.分支管理

    6.1.创建和合并分支
    演示命令:                             #创建并切换分支
    chenxushu@chenxushu:~/Desktop/clonegithub$ git checkout -b dev
    切换到一个新分支 'dev'
                                          #查看所有分支
    chenxushu@chenxushu:~/Desktop/clonegithub$ git branch
    * dev
      master
    chenxushu@chenxushu:~/Desktop/clonegithub$ git checkout master
    切换到分支 'master'
    您的分支与上游分支 'origin/master' 一致。
    chenxushu@chenxushu:~/Desktop/clonegithub$ git branch
      dev
    * master
    chenxushu@chenxushu:~/Desktop/clonegithub$ git checkout dev
    切换到分支 'dev'
    chenxushu@chenxushu:~/Desktop/clonegithub$ vim README.md 
    chenxushu@chenxushu:~/Desktop/clonegithub$ git add README.md 
    chenxushu@chenxushu:~/Desktop/clonegithub$ git commit -m "111"
    [dev 122ae1f] 111
     1 file changed, 1 insertion(+)
    chenxushu@chenxushu:~/Desktop/clonegithub$ git checkout master
    切换到分支 'master'
    您的分支与上游分支 'origin/master' 一致。
    chenxushu@chenxushu:~/Desktop/clonegithub$ cat README.md 
    # clonegithub
    hello
    chenxushu@chenxushu:~/Desktop/clonegithub$ git merge dev
    更新 4d3b04a..122ae1f
    Fast-forward
     README.md | 1 +
     1 file changed, 1 insertion(+)
    chenxushu@chenxushu:~/Desktop/clonegithub$ cat README.md 
    # clonegithub
    hello
    1111
    chenxushu@chenxushu:~/Desktop/clonegithub$ git branch -d dev
    已删除分支 dev(曾为 122ae1f)。
    

    总结:

    • git鼓励大量使用分支
    • 查看分支:git branch
    • 创建分支:git checkout -b name 【-b创建分支并且同时切换到子分支下】
    • 切换分支:git checkout name
    • 合并某个子分支到当前分支:git merge name
    • 删除分支:git branch -d name
    6.2解决冲突
    演示命令:
    chenxushu@chenxushu:~/Desktop/clonegithub$ git checkout -b feature1
    切换到一个新分支 'feature1'
    chenxushu@chenxushu:~/Desktop/clonegithub$ vim README.md 
    chenxushu@chenxushu:~/Desktop/clonegithub$ git add README.md 
    chenxushu@chenxushu:~/Desktop/clonegithub$ git commit -m "add hello and hi"
    [feature1 0296b41] add hello and hi
     1 file changed, 1 insertion(+)
    chenxushu@chenxushu:~/Desktop/clonegithub$ git checkout master
    切换到分支 'master'
    您的分支领先 'origin/master' 共 1 个提交。
      (使用 "git push" 来发布您的本地提交)
    chenxushu@chenxushu:~/Desktop/clonegithub$ vim README.md 
    chenxushu@chenxushu:~/Desktop/clonegithub$ git add Re
    fatal: 路径规格 'Re' 未匹配任何文件
    chenxushu@chenxushu:~/Desktop/clonegithub$ git add README.md 
    chenxushu@chenxushu:~/Desktop/clonegithub$ git commit -m "add hello & hi"
    [master 594d625] add hello & hi
     1 file changed, 1 insertion(+)
    chenxushu@chenxushu:~/Desktop/clonegithub$ git merge feature1
    自动合并 README.md
    冲突(内容):合并冲突于 README.md
    自动合并失败,修正冲突然后提交修正的结果。
    chenxushu@chenxushu:~/Desktop/clonegithub$ git status
    位于分支 master
    您的分支领先 'origin/master' 共 2 个提交。
      (使用 "git push" 来发布您的本地提交)
    
    您有尚未合并的路径。
      (解决冲突并运行 "git commit")
      (使用 "git merge --abort" 终止合并)
    
    未合并的路径:
      (使用 "git add <文件>..." 标记解决方案)
    
      双方修改:   README.md
    
    修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
    chenxushu@chenxushu:~/Desktop/clonegithub$ vim README.md 
    chenxushu@chenxushu:~/Desktop/clonegithub$ git add README.md 
    chenxushu@chenxushu:~/Desktop/clonegithub$ git commit -m "fix conflict"
    [master 5b37524] fix conflict
    chenxushu@chenxushu:~/Desktop/clonegithub$ git log  --graph#合并后,我们用git log看看分支历史
    

    总结:

    • 当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
    • 解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
    • 用git log --graph命令可以看到分支合并图
    6.3分支合并策略

    ​ 合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息

    ​ 如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息

    演示命令:
    chenxushu@chenxushu:~/Desktop/clonegithub$ git checkout -b dev
    切换到一个新分支 'dev'
    chenxushu@chenxushu:~/Desktop/clonegithub$ vim README.md 
    chenxushu@chenxushu:~/Desktop/clonegithub$ git add README.md 
    chenxushu@chenxushu:~/Desktop/clonegithub$ git commit -m "222"
    [dev 8337c54] 222
     1 file changed, 1 insertion(+)
    chenxushu@chenxushu:~/Desktop/clonegithub$ git checkout master
    切换到分支 'master'
    您的分支领先 'origin/master' 共 4 个提交。
      (使用 "git push" 来发布您的本地提交)
    chenxushu@chenxushu:~/Desktop/clonegithub$ git merge --no-ff -m "222-1" dev
    #准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward
    #因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
    Merge made by the 'recursive' strategy.
     README.md | 1 +
     1 file changed, 1 insertion(+)
    chenxushu@chenxushu:~/Desktop/clonegithub$ git log --graph
    

    总结:

    • master分支应该是非常稳定的,仅仅使用master分支发布版本,平时不在上面干活
    • 比如:每个人都在dev的分支上干活,每个人都有自己的分支,时不时的向dev上合并代码就可以了
    • 比如:发布1.0版本,再把dev上的代码合并到master上面
    • 合并分支时,加上--no-ff参数表示使用普通模式进行合并,合并之后可以查看历史 记录,而Fast-Forword快速模式没有历史记录
      二、git

    6.分支管理

    6.4bug分支

    一般情况下,每个bug都需要使用一个分支来进行解决,解决后,分支删除

    git stash:可以把当前工作现场储存起来,然后先进行其他额的工作,完成工作之后,可以解封继续工作

    演示命令:
    rock@rockrong:~/Desktop$ cd day5Text/
    rock@rockrong:~/Desktop/day5Text$ git branch
    * master
    rock@rockrong:~/Desktop/day5Text$ vim README.md   #假如有工作未完成
    rock@rockrong:~/Desktop/day5Text$ git stash           #封存工作现场
    保存工作目录和索引状态 WIP on dev: e742319 Initial commit
                                    #创建bug分支
    rock@rockrong:~/Desktop/day5Text$ git checkout -b bug-01
    切换到一个新分支 'bug-01'
    rock@rockrong:~/Desktop/day5Text$ vim README.md 
    rock@rockrong:~/Desktop/day5Text$ git add README.md 
    rock@rockrong:~/Desktop/day5Text$ git commit -m "fixed a bug"
    [bug-01 235be14] fixed a bug
     1 file changed, 2 insertions(+), 1 deletion(-)
    rock@rockrong:~/Desktop/day5Text$ git checkout master
    切换到分支 'master'                #bug修复 合并
    rock@rockrong:~/Desktop/day5Text$ git merge --no-ff -m "merge bug-01" bug-01
    Merge made by the 'recursive' strategy.
     README.md | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
                                #删除bug分支
    rock@rockrong:~/Desktop/day5Text$ git branch -d bug-01
    已删除分支 bug-01(曾为 235be14)。
                               #查看封存列表
    rock@rockrong:~/Desktop/day5Text$ git stash list
    stash@{0}: WIP on dev: e742319 Initial commit
                               #解开封存.这时会冲突,解决冲突
    rock@rockrong:~/Desktop/day5Text$ git stash pop
    

    总结:

    ​ 修复bug时,创建一个新的分支,进行bug的修复,然后合并,最后删除

    ​ 当手头的工作没有完成的时候,使用git stash 将内容封存,然后取修复bug,当bug修复完成之后,则使用命令git stash pop解封

    具体步骤:在当前用户下用git stash封存现场-->生成并切换到修复bug的新分支下进行bug修复-->分支进行代码提交-->切换回当前用户-->合并分支修复bug的文件-->删除分支-->解封现场文件git stash pop-->手工删除修复后文件的冲突部分。

    6.5feature分支
    演示命令:
    rock@rockrong:~/Desktop/day5Text$ git branch
      dev
    * master
    rock@rockrong:~/Desktop/day5Text$ git checkout -b feature1
    切换到一个新分支 'feature1'
    rock@rockrong:~/Desktop/day5Text$ touch a.txt
    rock@rockrong:~/Desktop/day5Text$ git add a.txt 
    rock@rockrong:~/Desktop/day5Text$ git commit -m "create a.txt"
    [feature1 120a22f] create a.txt
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 a.txt
    rock@rockrong:~/Desktop/day5Text$ git status
    位于分支 feature1
    无文件要提交,干净的工作区
    rock@rockrong:~/Desktop/day5Text$ vim a.txt 
    rock@rockrong:~/Desktop/day5Text$ git add a.txt 
    rock@rockrong:~/Desktop/day5Text$ git status
    位于分支 feature1
    要提交的变更:
      (使用 "git reset HEAD <文件>..." 以取消暂存)
    
      修改:     a.txt
    
    rock@rockrong:~/Desktop/day5Text$ git commit -m "add hello"
    [feature1 af31c25] add hello
     1 file changed, 1 insertion(+)
    rock@rockrong:~/Desktop/day5Text$ git checkout dev
    切换到分支 'dev'
    rock@rockrong:~/Desktop/day5Text$ git branch -d feature1  #正常删除
    error: 分支 'feature1' 没有完全合并。
    如果您确认要删除它,执行 'git branch -D feature1'。
    rock@rockrong:~/Desktop/day5Text$ git branch -D feature1  #强制删除
    已删除分支 feature1(曾为 af31c25)。
    

    总结:

    ​ 每开发一个新的功能【版本迭代】,最好新建一个分支来进行操作

    ​ 如果需要丢弃一个还没有被合并的分支,使用命令 git branch -D branch-name

    6.6多人协作

    当你从远程仓克隆时,实际上git将本地的master和远程的master对应起来了,并且远程仓库的默认的名字为origin

    演示命令:
    rock@rockrong:~/Desktop/day5Text$ git remote     #查看远程库的信息
    origin
    rock@rockrong:~/Desktop/day5Text$ git remote -v
    origin    git@github.com:yangyang-git/day5Text.git (fetch) #抓取地址
    origin    git@github.com:yangyang-git/day5Text.git (push)  #推送地址
    
    1>推送分支

    推送分支:把该分支上的所有的本地提交推送到远程库,推送时,要指定本地分支

    演示命令:
    rock@rockrong:~/Desktop/day5Text$ git branch
    * dev
      master
                                  #推送到主分支
    rock@rockrong:~/Desktop/day5Text$ git push origin master
    对象计数中: 4, 完成.
    Delta compression using up to 2 threads.
    压缩对象中: 100% (2/2), 完成.
    写入对象中: 100% (4/4), 340 bytes | 340.00 KiB/s, 完成.
    Total 4 (delta 1), reused 0 (delta 0)
    remote: Resolving deltas: 100% (1/1), done.
    To github.com:yangyang-git/day5Text.git
       e742319..cc4bef3  master -> master
                                  #创建子分支
    rock@rockrong:~/Desktop/day5Text$ git checkout -b dev
                                  #推送到子分支
    rock@rockrong:~/Desktop/day5Text$ git push origin dev
    Total 0 (delta 0), reused 0 (delta 0)
    To github.com:yangyang-git/day5Text.git
     * [new branch]      dev -> dev
    

    总结:

    ​ 并不是所有的分支都需要推送到远程仓库

    ​ a.master分支时主分支,因此要时刻与远程保持同步

    ​ b.dev是一个开发分支,团队所有的成员都在上面工作,所以也需要推送到远程仓库

    ​ c.bug分支只是修复一个bug,就没必要推送到远程

    ​ d.先本地删除分支,再删除远程分支git push origin --delete dev

    2>抓取分支
    演示命令:
    #老王和老李,在做同一个项目
    rock@rockrong:~/Desktop/day5Text$ cd ..
    rock@rockrong:~/Desktop$ mkdir other
    rock@rockrong:~/Desktop$ cd other/
    rock@rockrong:~/Desktop/other$ git clone git@github.com:yangyang-git/day5Text.git
    正克隆到 'day5Text'...
    remote: Counting objects: 10, done.
    remote: Compressing objects: 100% (3/3), done.
    remote: Total 10 (delta 2), reused 6 (delta 1), pack-reused 0
    接收对象中: 100% (10/10), 完成.
    处理 delta 中: 100% (2/2), 完成.
    rock@rockrong:~/Desktop/other$ cd day5Text/
                                       #老王抓取下来只有master
    rock@rockrong:~/Desktop/other/day5Text$ git branch
    * master
                          #但是老王需要在dev上工作,所以创建dev分支
    rock@rockrong:~/Desktop/other/day5Text$ git checkout -b dev origin/dev
    分支 'dev' 设置为跟踪来自 'origin' 的远程分支 'dev'。
    切换到一个新分支 'dev'
    rock@rockrong:~/Desktop/other/day5Text$ git branch
    * dev
      master
    rock@rockrong:~/Desktop/other/day5Text$ touch b.txt
    rock@rockrong:~/Desktop/other/day5Text$ vim b.txt 
    rock@rockrong:~/Desktop/other/day5Text$ git add b.txt 
    rock@rockrong:~/Desktop/other/day5Text$ git commit -m "b"
    [dev b08d6ec] b
     1 file changed, 1 insertion(+)
     create mode 100644 b.txt
                                      #老王推送到远程仓库
    rock@rockrong:~/Desktop/other/day5Text$ git push origin dev    #推送分支
    对象计数中: 3, 完成.
    Delta compression using up to 2 threads.
    压缩对象中: 100% (2/2), 完成.
    写入对象中: 100% (3/3), 274 bytes | 274.00 KiB/s, 完成.
    Total 3 (delta 0), reused 0 (delta 0)
    To github.com:yangyang-git/day5Text.git
       ae20ec5..b08d6ec  dev -> dev
    
    #过一阵子,老李也推送远程仓库.这个时候推送失败,因为冲突了.
    $ git push origin dev
    To github.com:michaelliao/learngit.git
     ! [rejected]        dev -> dev (non-fast-forward)
    error: failed to push some refs to 'git@github.com:michaelliao/learngit.git'
    hint: Updates were rejected because the tip of your current branch is behind
    hint: its remote counterpart. Integrate the remote changes (e.g.
    hint: 'git pull ...') before pushing again.
    hint: See the 'Note about fast-forwards' in 'git push --help' for details.
     
    #解决办法是,把远程最新代码拿来下,在本地合并,再push
    #抓取失败,根据提示操作,原因是没有指定本地dev分支与远程origin/dev分支的链接
    rock@rockrong:~/Desktop/day5Text$ git pull
    remote: Counting objects: 3, done.
    remote: Compressing objects: 100% (2/2), done.
    remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
    展开对象中: 100% (3/3), 完成.
    来自 github.com:yangyang-git/day5Text
       ae20ec5..b08d6ec  dev        -> origin/dev
    当前分支没有跟踪信息。
    请指定您要合并哪一个分支。
    详见 git-pull(1)。
    
        git pull <远程> <分支>
    
    如果您想要为此分支创建跟踪信息,您可以执行:
    
        git branch --set-upstream-to=origin/<分支> dev
    #设置本地和远程都有dev,就可以pull了
    rock@rockrong:~/Desktop/day5Text$ git branch --set-upstream-to=origin/dev dev
    分支 'dev' 设置为跟踪来自 'origin' 的远程分支 'dev'。        #设置跟踪
    rock@rockrong:~/Desktop/day5Text$ git pull       #抓取分支
    更新 ae20ec5..b08d6ec
    Fast-forward
     b.txt | 1 +
     1 file changed, 1 insertion(+)
     create mode 100644 b.txt
      
    #此时,两个小伙伴之间就可以各自工作了,然后只需要将各自的修改每次提交到dev分支
    rock@rockrong:~/Desktop/day5Text$ vim b.txt
    rock@rockrong:~/Desktop/day5Text$ git add b.txt 
    rock@rockrong:~/Desktop/day5Text$ git commit -m "hello"
    [dev 61c1d88] hello
     1 file changed, 1 insertion(+)
    rock@rockrong:~/Desktop/day5Text$ git push origin dev
    对象计数中: 3, 完成.
    Delta compression using up to 2 threads.
    压缩对象中: 100% (2/2), 完成.
    写入对象中: 100% (3/3), 284 bytes | 284.00 KiB/s, 完成.
    Total 3 (delta 0), reused 0 (delta 0)
    To github.com:yangyang-git/day5Text.git
       b08d6ec..61c1d88  dev -> dev
    rock@rockrong:~/Desktop/day5Text$ cd ..
    rock@rockrong:~/Desktop$ cd other/day5Text/
    rock@rockrong:~/Desktop/other/day5Text$ git pull
    remote: Counting objects: 3, done.
    remote: Compressing objects: 100% (2/2), done.
    remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
    展开对象中: 100% (3/3), 完成.
    来自 github.com:yangyang-git/day5Text
       b08d6ec..61c1d88  dev        -> origin/dev
    更新 b08d6ec..61c1d88
    Fast-forward
     b.txt | 1 +
     1 file changed, 1 insertion(+)
    rock@rockrong:~/Desktop/other/day5Text$ cat b.txt 
    fghajdfja
    hello
    
        
     #注意:如果合并有冲突,需要手动解决,解决的方法和分支管理中的解决冲突完全一样。解决后,提交,再push
    #实际的工作流程是:先pull[抓取],后push[推送]
    

    总结:

    ​ a.查看远程库的信息,使用git remote -v

    ​ b.本地新建的分支如果不推送到远程,对其他人都是不可见的

    ​ c.从本地推送分支,使用命令git push origin branchname,如果推送失败,则先用git pull抓取

    ​ d.在本地创建于远程分支的连接,使用命令git checkout -b branchname origin/branchname

    ​ e。从远程抓取分支,使用git pull,如果有冲突,则要先解决冲突

    7.标签管理

    7.1创建标签
    演示命令:
    rock@rockrong:~/Desktop/day5Text$ git tag v1.0    #创建标签,默认创建的是当前最新提交的标签
    rock@rockrong:~/Desktop/day5Text$ git tag
    v1.0
    rock@rockrong:~/Desktop/day5Text$ git tag v0.2 ae20ec5    #为指定commit id创建标签
    rock@rockrong:~/Desktop/day5Text$ git tag
    v0.2
    v1.0
    

    总结:

    • 命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
    • 命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
    • 命令git tag可以查看所有标签。
    7.2操作标签
    演示命令:
    rock@rockrong:~/Desktop/day5Text$ git show v1.0   #查看指定标签的详细信息
    commit 61c1d8863fd7df3d20c156ace3bfa1d7882b636c (HEAD -> dev, tag: v1.0, origin/dev)
    Author: yangyang-git <18501970795@163.com>
    Date:   Mon Jul 2 10:52:50 2018 +0800
    
        hello
    
    diff --git a/b.txt b/b.txt
    index 9022bb8..4bc9d07 100644
    --- a/b.txt
    +++ b/b.txt
    @@ -1 +1,2 @@
     fghajdfja
    +hello
    #创建标签,携带标签的描述信息
    rock@rockrong:~/Desktop/day5Text$ git tag -a v0.1 -m "version 0.1" e7423195
      
    rock@rockrong:~/Desktop/day5Text$ git tag #查看当前分支下的标签
    v0.1
    v0.2
    v1.0
    rock@rockrong:~/Desktop/day5Text$ git tag -d v0.1 
    已删除标签 'v0.1'(曾为 97026a8)
    rock@rockrong:~/Desktop/day5Text$ git push origin --tags  #将本地仓库中的标签推送到远程仓库
    Total 0 (delta 0), reused 0 (delta 0)
    To github.com:yangyang-git/day5Text.git
     * [new tag]         v0.2 -> v0.2
     * [new tag]         v1.0 -> v1.0
    rock@rockrong:~/Desktop/day5Text$ git tag -d v0.2     #删除本地仓库中的标签
    已删除标签 'v0.2'(曾为 ae20ec5)
    rock@rockrong:~/Desktop/day5Text$ git push origin :refs/tags/v0.2
        #删除远程仓库中的指定标签
    remote: warning: Deleting a non-existent ref.
    To github.com:yangyang-git/day5Text.git
     - [deleted]         v0.2To
    

    总结:

    • 命令git push origin <tagname>可以推送一个本地标签;
    • 命令git push origin --tags可以推送全部未推送过的本地标签;
    • 命令git tag -d <tagname>可以删除一个本地标签;
    • 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

    相关文章

      网友评论

          本文标题:04-Git

          本文链接:https://www.haomeiwen.com/subject/szhifqtx.html