04-Git

一、git的使用

1.git简介

1.1案例引入

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

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

04-Git_第1张图片
文档库.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 "[email protected]"
  git config --global user.name "Your Name"

来设置您账号的缺省身份标识。
如果仅在本仓库设置身份标识,则省略 --global 参数。
fatal: 无法自动探测邮件地址(得到 'yangyang@yangyang-virtualmachine.(none)')
yangyang@yangyang-virtualmachine:~/Desktop/python  $ git config --global user.email "[email protected]"     #配置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 <[email protected]>
Date:   Fri Jun 29 10:31:55 2018 +0800

    222

commit 3af9e8eeb2d9d5dfb04e52968c255d0dd5e3e8ee
Author: yangyang-git <[email protected]>
Date:   Fri Jun 29 10:28:47 2018 +0800

    add 111

commit ce63cb0594622577d144372d8c48dcabee631973
Author: yangyang-git <[email protected]>
Date:   Fri Jun 29 10:05:22 2018 +0800

    create twofiles

commit 1f12c8b33abea0c7c0ae195aaa7ef18894681137
Author: yangyang-git <[email protected]>
Date:   Fri Jun 29 10:03:26 2018 +0800

    add hello

commit d4b0bde029497a68dcacb026fd299b90c0604116
Author: yangyang-git <[email protected]>
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 [email protected]

演示命令:
yangyang@yangyang-virtualmachine:~/Desktop/python  $ ssh-keygen  -t   rsa  -C    "[email protected]"      #生成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 [email protected]
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 [email protected]
5.2.将本地仓库和远程仓库联系起来

演示命令:

chenxushu@chenxushu:~$ cd Desktop/
chenxushu@chenxushu:~/Desktop$ cd python  /
chenxushu@chenxushu:~/Desktop/python  $ git remote add origin1 [email protected]: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 [email protected]:username/repoName.git
  • 关联成功之后 ,使用命令git push -u origin master第一次推送master分支的内容到远程仓库
  • 以后,每次本地提交之后,只需要使用命令git push origin master推送最新的修改【本地修改----》add到暂存区---》commit到本地仓库----》push到远程仓库】

5.3从远程仓库克隆

git clone [email protected]:username/repoName.git

演示命令:
chenxushu@chenxushu:~/Desktop/python  $ cd ..
chenxushu@chenxushu:~/Desktop$ git clone [email protected]: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    [email protected]:yangyang-git/day5Text.git (fetch) #抓取地址
origin    [email protected]: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 [email protected]: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 '[email protected]: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 用于新建一个标签,默认为HEAD,也可以指定一个commit id;
  • 命令git tag -a -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 <[email protected]>
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 可以推送一个本地标签;
  • 命令git push origin --tags可以推送全部未推送过的本地标签;
  • 命令git tag -d 可以删除一个本地标签;
  • 命令git push origin :refs/tags/可以删除一个远程标签。

你可能感兴趣的:(04-Git)