一、git的使用
1.git简介
1.1案例引入
如果你用Word写过毕业论文,那你一定有这样的经历:
想删除一个段落,又怕将来想恢复找不回来怎么办?有办法,先把当前文件“另存为……”一个新的Word文件,再接着改,改到一定程度,再“另存为……”一个新文件,这样一直改下去,最后你的Word文档变成了这样:
过了一周,你想找回被删除的文字,但是已经记不清删除前保存在哪个文件里了,只好一个一个文件去找,真麻烦。
看着一堆乱七八糟的文件,想保留最新的一个,然后把其他的删掉,又怕哪天会用上,还不敢删,真郁闷。
更要命的是,有些部分需要你的财务同事帮助填写,于是你把文件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/
可以删除一个远程标签。