一、上堂回顾
1.文件管理
find:按照指定命令搜索文件【文件名称,大小】
locate:全局查找文件
sort:给文件内容排序
cut:分隔,提取指定内容
tee:从外部获取内容
sed:增删改查,可以结合正则表达式使用
tar/gzip:打包,压缩
2.vim编辑器
命令模式,编辑模式和末行模式之间的切换
a 或者i :从命令模式切换到编辑模式
esc:从编辑模式切换到命令模式
: 从命令模式切换到末行模式
:wq/:q,退出
3.用户管理
useradd/userdel:添加或者删除用户
注意:添加,每个用户都有一个用户主目录
删除,必须保证用户没有在使用状态【注销】
groupadd/groupdel:用户组添加或者删除
注意:-g,表示对某个用户指定用户组【主组】
删除,如果要删除主组,则首先需要删除用户
passwd:设置用户的密码
usermod:修改用户的信息
chmod:修改文件权限【字母法和数字法】
二、常用命令
1.与用户账号有关的系统文件
1>/etc/passwd文件
Linux系统中的每个用户都在/etc/passwd文件中有一个对应的记录行,它记录了这个用户的一些基本属性,这个文件对所有用户都是可读的
注意:如果要修改该文件,则需要使用root权限,修改完成之后,需要使用:wq!保存退出
sam:x:200:50:Sam san:/usr/sam:/bin/sh 一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段 用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
注意:/etc/shadow中的记录行与/etc/passwd中的一一对应,是由/etc/passwd中的数据自动产生的
2>/etc/group文件
将用户分组是Linux 系统中对用户进行管理及控制访问权限的一种手段
每个用户都属于某个用户组;一个组中可以有多个用户,一个用户也可以属于不同的组
当一个用户同时是多个组中的成员时,在/etc/passwd文件中记录的是用户所属的主组,也就是登录时所属的默认组,而其他组称为附加组【次要组】
用户要访问属于附加组的文件时,必须首先使用newgrp命令使自己成为所要访问的组中的成员
2.系统管理
1>date 显示当前日期
-s:设置时间,注意:只有root权限才能设置,其他只能查看
日期格式化 %Y year %m month (01..12) %d day of month (e.g., 01) %H hour (00..23) %I hour (01..12) %M minute (00..59) %S second (00..60) 演示命令: wyq@Wyq:~$ date 2019年 02月 28日 星期四 09:26:33 CST wyq@Wyq:~$ date +"%Y-%m-%d %H:%M:%S" 2019-02-28 09:28:03 wyq@Wyq:~$ date -s 20071010 date: 无法设置日期: 不允许的操作 2007年 10月 10日 星期三 00:00:00 CST
2>cal 显示一个日历
cal cal -y cal 2006
3>ps 报告当前系统的进程状态,是最常用的是用于监控后台进程的工作情况
进程是处于执行期的程序以及它所包含的所有资源的总称,包括虚拟处理器,虚拟空间,寄存器,堆栈,全局数据段等。
针对用户进程,又可以分为交互进程、批处理进程和守护进程三类。
(1) 交互进程:由一个shell终端启动的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行在后台。
(2) 批处理进程:该进程是一个进程集合,负责按顺序启动其他的进程。
(3) 守护进程:守护进程是一直运行的一种进程,经常在linux系统启动时启动,在系统关闭时终止。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。例如httpd进程,一直处于运行状态,等待用户的访问。还有经常用的crond进程,这个进程类似与windows的计划任务,可以周期性的执行用户设定的某些任务。
ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的 -a:显示当前终端机下的所有进程(包括其他用户的进程)
-u:用户以及其他详细信息
-x:显示没有控制终端的进程
-ef:显示所有进程服务
#ps为了查看某个应用程序的工作状态
4>kill 删除执行中的程序或工作
格式:kill 进程号【pid】
-a:当处理当前进程时,不限制命令名和进程号的对应关系;
-l <信息编号>:若不加<信息编号>选项,则-l参数会列出全部的信息名称;
-p:指定kill 命令只打印相关进程的进程号,而不发送任何信号;
-s <信息名称或编号>:指定要送出的信息;
-u:指定用户#通过ps查看进程【pid:进程号】,如果想要结束进程的话,则可以使用kill杀死进程
5>df 显示磁盘分区上的可使用的磁盘空间
注意:默认显示单位为KB
可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息
df df -h df -a
6>du 显示文件的内存大小
注意:与df命令不同的是du命令是对文件和目录磁盘使用的空间的查看
du du -a
7>crontab 提交和管理用户的需要周期性执行的任务
注意:当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务
8>free 显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区
-b:以Byte为单位显示内存使用情况;
-k:以KB为单位显示内存使用情况;
-m:以MB为单位显示内存使用情况;
-o:不显示缓冲区调节列;
-s<间隔秒数>:持续观察内存使用状况;
-t:显示内存总和列;
-V:显示版本信息
free -m
9>mode 权限标记
mode由三部分组成:操作对象,操作符,权限 操作对象:u[user,当前用户],g[group,和当前用户在同一个用户组中的其他用户],o[other,其他用户组中的用户],a[all,所有用户] 操作符:+【增加权限】 -【撤销权限】 =【设定权限】 权限:r[可读],w【可写】 x[可执行]
10>alias 给命令起别名
格式:alias 别名=原名
演示命令: alias ll='ls -al' alias d='date' #注意:只能临时使用,如果要永久有效,则必须在.bashrc中添加 sudo vim .bashrc source .bashrc #使得修改的文件生效 #在终端 wyq@Wyq:~$ date 2019年 02月 28日 星期四 09:53:03 CST wyq@Wyq:~$ d 2019年 02月 28日 星期四 09:53:05 CST
11>关机重启
#reboot 重启 shutdown -h now 立即关机 shutdown -r now 立即重启 shutdown -h +1 一分钟之后重启 init 0 关机 init 6 重启 telinit 0 关机 logout 注销
三、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有什么特点?简单来说就是:高端大气上档次!
SVN
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是分布式版本控制系统
集中式:版本库【项目或者文件】是集中存放在中央服务器上的,而工作的时候,首先需要将版本库从中央服务器上获取下来,然后开始工作【增加内容,删除内容或者修改内容等】,当工作完成之后,则需要将版本库推送给中央服务器【缺点:必须联网才能工作,如果遇到网速慢的情况,非常耗时】
分布式:根本没有中央服务器,每个人的电脑上都是一个完整版本库,在不联网的情况下就可以工作,如果是团队开发,两个人在各自的电脑上修改了同一个文件,双方只需要把各自的修改推送给对方
和集中式版本控制系统比较,分布式版本控制系统安全级别较高,而集中式版本控制系统只要重要服务器出现故障,则无法工作
实际使用分布式版本控制系统:很少在两个人的电脑之间进行推送修改,因为两个人可能不在同一个局域网中,某个人的电脑暂时不工作等,一般情况下,也得有一台充当“中央服务器”的电脑,该电脑的作用仅仅用来交换每个人的修改
2.安装git
sudo apt-get install git
可能会出现的问题: E:无法获得锁 /var/lib/dpkg/lock open(资源不可用) E:无法锁定管理目录(/var/lib/dpkg),是否有进程在占用它? 原因: 上次不正常关机导致资源一直未被释放 解决办法: sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock 演示命令: wyq@Wyq:~$ sudo apt-get install git [sudo] wyq 的密码: 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 git 已经是最新版 (1:2.17.1-1ubuntu0.4)。 升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 152 个软件包未被升级。
3.版本库
3.1什么是版本库
版本库:仓库,英文为respository
初期理解:目录,该目录下所有的文件和子目录都可以被git管理,每个文件的修改,删除,添加等,git都能跟踪,时刻跟踪以前的版本
3.2创建版本库
演示命令: wyq@Wyq:~/桌面/python1807$ mkdir learngit1807 #目录不要使用中文和特殊符号 wyq@Wyq:~/桌面/python1807$ ls learngit1807 wyq@Wyq:~/桌面/python1807$ cd learngit1807/ wyq@Wyq:~/桌面/python1807/learngit1807$ pwd /home/wyq/桌面/python1807/learngit1807 wyq@Wyq:~/桌面/python1807/learngit1807$ git init 已初始化空的 Git 仓库于 /home/wyq/桌面/python1807/learngit1807/.git/ #区别于普通目录:其中有一个隐藏的git目录,该目录是git来跟踪管理版本库的,不要随便修改其中的内容 wyq@Wyq:~/桌面/python1807/learngit1807$ ls wyq@Wyq:~/桌面/python1807/learngit1807$ ls -a . .. .git #注意:不一定必须在空目录下创建git仓库,尽量采用空目录 #注意:.git是版本库【仓库】,learngit1807是工作区 演示命令: wyq@Wyq:~$ cd 桌面 wyq@Wyq:~/桌面$ mkdir python1807 wyq@Wyq:~/桌面$ cd python1807/ wyq@Wyq:~/桌面/python1807$ mkdir learngit1807 wyq@Wyq:~/桌面/python1807$ ls learngit1807 wyq@Wyq:~/桌面/python1807$ cd learngit1807/ wyq@Wyq:~/桌面/python1807/learngit1807$ pwd /home/wyq/桌面/python1807/learngit1807 wyq@Wyq:~/桌面/python1807/learngit1807$ git init 已初始化空的 Git 仓库于 /home/wyq/桌面/python1807/learngit1807/.git/ wyq@Wyq:~/桌面/python1807/learngit1807$ ls wyq@Wyq:~/桌面/python1807/learngit1807$ ls -a . .. .git
3.3把文件添加到仓库
所有的版本控制系统,其实跟踪文件的改动
git add 文件名
git commit -m “提交说明”
""" 把一个text.txt文件添加到仓库 1.在工作区中修改文件 2.通过git add text.txt从工作区添加到暂存区 3.通过git commit -m "提交说明"将修改从暂存区提交到版本库【注意:将暂存区中的所有修改一次性提交到版本库,所以可以执行多次add,只执行一次commit】 """ #可能会出现的问题:执行git commit会报错,需要配置git用户和邮箱 #解决方案 git config --global user.name "自己的git的账户名" git config --global user.email "自己的git的邮箱" 作用:将当前的用户名和邮箱会全局配置给该台设备上的所有项目 #建议:如果是配置自己的项目,尽量采用自己的账户;如果是公司项目,尽量采用公共账户 #如果一个项目配置一个账户,执行命令: git config user.name "自己的git的账户名" git config user.email "自己的git的邮箱" 演示命令: wyq@Wyq:~/桌面/python1807/learngit1807$ touch text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ ls text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ vim text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git add text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git commit 终止提交因为提交说明为空。 wyq@Wyq:~/桌面/python1807/learngit1807$ git commit -m "create a file named text.txt" [master (根提交) 80f4470] create a file named text.txt 1 file changed, 1 insertion(+) create mode 100644 text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ ls text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ vim text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git add text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ touch a1.txt wyq@Wyq:~/桌面/python1807/learngit1807$ vim a1.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git add a1.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git commit -m "add content at text.txt and create new file nameda1.txt" [master 8c4322a] add content at text.txt and create new file nameda1.txt 2 files changed, 2 insertions(+) create mode 100644 a1.txt
4.时光穿梭机【覆水可收】
1>git status:查看仓库当前的状态
说明:获取版本库和工作区之间的差异,如果工作区和版本库保持同步,则执行该命令得到的结果为“干净的工作区”
演示命令: wyq@Wyq:~/桌面/python1807/learngit1807$ git status 位于分支 master 无文件要提交,干净的工作区 wyq@Wyq:~/桌面/python1807/learngit1807$ vim text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git status 位于分支 master 尚未暂存以备提交的变更: #工作区中作了修改,还未添加到暂存区 (使用 "git add <文件>..." 更新要提交的内容) (使用 "git checkout -- <文件>..." 丢弃工作区的改动) 修改: text.txt 修改尚未加入提交(使用 "git add" 和/或 "git commit -a") wyq@Wyq:~/桌面/python1807/learngit1807$ git add text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git status 位于分支 master 要提交的变更: #只是添加到了暂存区,但是还未提交到版本库 (使用 "git reset HEAD <文件>..." 以取消暂存) 修改: text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git commit -m "add third" [master 6016c09] add third 1 file changed, 1 insertion(+) wyq@Wyq:~/桌面/python1807/learngit1807$ git status 位于分支 master 无文件要提交,干净的工作区
2>git diff:查看工作区 和暂存区之间的具体差异【修改了哪些内容】
wyq@Wyq:~/桌面/python1807/learngit1807$ vim text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git status 位于分支 master 尚未暂存以备提交的变更: (使用 "git add <文件>..." 更新要提交的内容) (使用 "git checkout -- <文件>..." 丢弃工作区的改动) 修改: text.txt 修改尚未加入提交(使用 "git add" 和/或 "git commit -a") wyq@Wyq:~/桌面/python1807/learngit1807$ git diff diff --git a/text.txt b/text.txt index ff6e6b1..0fec44c 100644 --- a/text.txt +++ b/text.txt @@ -1,3 +1,4 @@ first second third +four wyq@Wyq:~/桌面/python1807/learngit1807$ git add text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git diff wyq@Wyq:~/桌面/python1807/learngit1807$ git diff wyq@Wyq:~/桌面/python1807/learngit1807$ git status 位于分支 master 要提交的变更: (使用 "git reset HEAD <文件>..." 以取消暂存) 修改: text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git commit -m "xxx" [master 5147f54] xxx 1 file changed, 1 insertion(+) wyq@Wyq:~/桌面/python1807/learngit1807$ git status 位于分支 master 无文件要提交,干净的工作区 wyq@Wyq:~/桌面/python1807/learngit1807$
随时掌握工作区的状态,则使用git status命令
如果git status命令告诉你有文件被修改过,则可以通过git diff查看具体修改的内容
4.1版本回退
注意:每次commit的时候,就会产生一个commit id【提交号,是唯一的】
git log:查看日志
git log --pretty=oneline
需求:回退到上一个版本
思路:如果要回退版本,需要知道版本号,在git中,使用HEAD表示最新版本,上一个版本HEAD,上上一个版本HEAD^…其余的版本一般都使用commit id识别
回退到上一个版本:git reset --hard HEAD^
回退到一个指定版本:git reset --hard [commit id]
工作原理:git之所以能够回退版本或者回到未来的版本,因为git的内部有一个指向最新版本的指针HEAD,当回退版本的时候,只需要将HEAD指针指向需要回退的版本
git reflog:查看git中执行过的历史命令,确定需要回到未来的哪个版本
演示命令: wyq@Wyq:~/桌面/python1807/learngit1807$ git log commit 02ac1022bca3e9dacd6a5291314c2efeb0391b48 (HEAD -> master) Author: yangyang-git <lm> Date: Thu Feb 28 11:59:23 2019 +0800 modify text and a1 commit 5147f5404010578ce2a5a8d947f53c99120977ff Author: lm <lm> Date: Thu Feb 28 11:52:23 2019 +0800 xxx commit 6016c09277469f90714ac500dc2a37547256043f Author: lm <lm> Date: Thu Feb 28 11:47:43 2019 +0800 add third commit eb669959460c8c52e1a3428a9db637ecd4f5567c Author: lm <lm> Date: Thu Feb 28 11:42:24 2019 +0800 add abc at a1.txt commit 8c4322a0e7e24767adb73b6d290439570946548b Author: lm <lm> Date: Thu Feb 28 11:35:56 2019 +0800 wyq@Wyq:~/桌面/python1807/learngit1807$ git reset --hard HEAD^ #回退到上一个版本 HEAD 现在位于 5147f54 xxx wyq@Wyq:~/桌面/python1807/learngit1807$ git log commit 5147f5404010578ce2a5a8d947f53c99120977ff (HEAD -> master) Author: lm <lm> Date: Thu Feb 28 11:52:23 2019 +0800 xxx commit 6016c09277469f90714ac500dc2a37547256043f Author: lm <lm> Date: Thu Feb 28 11:47:43 2019 +0800 add third commit eb669959460c8c52e1a3428a9db637ecd4f5567c Author: lm <lm> Date: Thu Feb 28 11:42:24 2019 +0800 add abc at a1.txt commit 8c4322a0e7e24767adb73b6d290439570946548b Author: lm <lm> Date: Thu Feb 28 11:35:56 2019 +0800 add content at text.txt and create new file nameda1.txt commit 80f44708965677b25e9bbab239ea1ebb811b40af Author: lm <lm> Date: Thu Feb 28 11:10:04 2019 +0800 wyq@Wyq:~/桌面/python1807/learngit1807$ cat text.txt first second third four wyq@Wyq:~/桌面/python1807/learngit1807$ vim text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git status 位于分支 master 尚未暂存以备提交的变更: (使用 "git add <文件>..." 更新要提交的内容) (使用 "git checkout -- <文件>..." 丢弃工作区的改动) 修改: text.txt 修改尚未加入提交(使用 "git add" 和/或 "git commit -a") wyq@Wyq:~/桌面/python1807/learngit1807$ git add text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git status 位于分支 master 要提交的变更: (使用 "git reset HEAD <文件>..." 以取消暂存) 修改: text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git commit -m "add five" [master b101c03] add five 1 file changed, 1 insertion(+) wyq@Wyq:~/桌面/python1807/learngit1807$ cat text.txt first second third four five wyq@Wyq:~/桌面/python1807/learngit1807$ git log commit b101c03e4d772f09433889b3664ebce1331a8c41 (HEAD -> master) Author: yangyang-git <lm> Date: Thu Feb 28 14:46:13 2019 +0800 add five commit 5147f5404010578ce2a5a8d947f53c99120977ff Author: lm <lm> Date: Thu Feb 28 11:52:23 2019 +0800 xxx commit 6016c09277469f90714ac500dc2a37547256043f Author: lm <lm> Date: Thu Feb 28 11:47:43 2019 +0800 add third commit eb669959460c8c52e1a3428a9db637ecd4f5567c Author: lm <lm> Date: Thu Feb 28 11:42:24 2019 +0800 add abc at a1.txt commit 8c4322a0e7e24767adb73b6d290439570946548b Author: lm <lm> Date: Thu Feb 28 11:35:56 2019 +0800 wyq@Wyq:~/桌面/python1807/learngit1807$ git reset --hard HEAD^ HEAD 现在位于 5147f54 xxx wyq@Wyq:~/桌面/python1807/learngit1807$ git log commit 5147f5404010578ce2a5a8d947f53c99120977ff (HEAD -> master) Author: lm <lm> Date: Thu Feb 28 11:52:23 2019 +0800 xxx commit 6016c09277469f90714ac500dc2a37547256043f Author: lm <lm> Date: Thu Feb 28 11:47:43 2019 +0800 add third commit eb669959460c8c52e1a3428a9db637ecd4f5567c Author: lm <lm> Date: Thu Feb 28 11:42:24 2019 +0800 add abc at a1.txt commit 8c4322a0e7e24767adb73b6d290439570946548b Author: lm <lm> Date: Thu Feb 28 11:35:56 2019 +0800 add content at text.txt and create new file nameda1.txt commit 80f44708965677b25e9bbab239ea1ebb811b40af Author: lm <lm> Date: Thu Feb 28 11:10:04 2019 +0800 wyq@Wyq:~/桌面/python1807/learngit1807$ cat text.txt first second third four wyq@Wyq:~/桌面/python1807/learngit1807$ git log --pretty=oneline 5147f5404010578ce2a5a8d947f53c99120977ff (HEAD -> master) xxx 6016c09277469f90714ac500dc2a37547256043f add third eb669959460c8c52e1a3428a9db637ecd4f5567c add abc at a1.txt 8c4322a0e7e24767adb73b6d290439570946548b add content at text.txt and create new file nameda1.txt 80f44708965677b25e9bbab239ea1ebb811b40af create a file named text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git reset --hard b101c03e4d #回到未来版本 HEAD 现在位于 b101c03 add five wyq@Wyq:~/桌面/python1807/learngit1807$ cat text.txt first second third four five wyq@Wyq:~/桌面/python1807/learngit1807$ git reflog b101c03 (HEAD -> master) HEAD@{0}: reset: moving to b101c03e4d 5147f54 HEAD@{1}: reset: moving to HEAD^ b101c03 (HEAD -> master) HEAD@{2}: commit: add five 5147f54 HEAD@{3}: reset: moving to HEAD^ 02ac102 HEAD@{4}: commit: modify text and a1 5147f54 HEAD@{5}: commit: xxx 6016c09 HEAD@{6}: commit: add third eb66995 HEAD@{7}: commit: add abc at a1.txt 8c4322a HEAD@{8}: commit: add content at text.txt and create new
4.2撤销修改
a.第一种情况:修改了工作区中的文件内容,但是还将其添加到暂存区
注意:在工作区中作了修改,虽然可以通过删除恢复,但是,对于git而言,已经追踪到了一个修改,必须通过命令实现
git checkout – filename :丢弃工作区的改动
演示命令: wyq@Wyq:~/桌面/python1807/learngit1807$ cat text.txt first second third four five stupid~~~~~~ wyq@Wyq:~/桌面/python1807/learngit1807$ git status 位于分支 master 尚未暂存以备提交的变更: (使用 "git add <文件>..." 更新要提交的内容) (使用 "git checkout -- <文件>..." 丢弃工作区的改动) 修改: text.txt 修改尚未加入提交(使用 "git add" 和/或 "git commit -a") wyq@Wyq:~/桌面/python1807/learngit1807$ git checkout -- text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ cat text.txt first second third four five wyq@Wyq:~/桌面/python1807/learngit1807$ git status 位于分支 master 无文件要提交,干净的工作区
b.第二种情况:修改了工作区中的文件内容,将其添加到了暂存区
第一步:git reset HEAD filename 取消暂存
第二步:git checkout – filename 丢弃工作区的改动
演示命令: wyq@Wyq:~/桌面/python1807/learngit1807$ cat text.txt hello first second third four five wyq@Wyq:~/桌面/python1807/learngit1807$ git add text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git status 位于分支 master 要提交的变更: (使用 "git reset HEAD <文件>..." 以取消暂存) 修改: text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git reset HEAD text.txt 重置后取消暂存的变更: M text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git status 位于分支 master 尚未暂存以备提交的变更: (使用 "git add <文件>..." 更新要提交的内容) (使用 "git checkout -- <文件>..." 丢弃工作区的改动) 修改: text.txt 修改尚未加入提交(使用 "git add" 和/或 "git commit -a") wyq@Wyq:~/桌面/python1807/learngit1807$ git checkout -- text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ cat text.txt first second third four five
c.第三种情况:修改了工作区中的文件内容,将其添加到了暂存区,并且提交到了版本库
演示命令: wyq@Wyq:~/桌面/python1807/learngit1807$ vim text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git add text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git commit -m "gshjg" [master 46571a6] gshjg 1 file changed, 1 insertion(+) wyq@Wyq:~/桌面/python1807/learngit1807$ git reset --hard HEAD^ HEAD 现在位于 b101c03 add five wyq@Wyq:~/桌面/python1807/learngit1807$ cat text.txt first second third four five
4.3工作区暂存区版本库
工作区:working Directory
暂存区:stage/index
版本库:respository
git会自动创建一个master【主分支】,实际上指针HEAD指向的是当前正在工作 的分支上的时间节点,默认指向master分支
演示命令: wyq@Wyq:~/桌面/python1807/learngit1807$ touch b1.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git status 位于分支 master 未跟踪的文件: (使用 "git add <文件>..." 以包含要提交的内容) b1.txt 提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪) wyq@Wyq:~/桌面/python1807/learngit1807$ git add b1.txt wyq@Wyq:~/桌面/python1807/learngit1807$ vim b1.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git status 位于分支 master 要提交的变更: (使用 "git reset HEAD <文件>..." 以取消暂存) 新文件: b1.txt 尚未暂存以备提交的变更: (使用 "git add <文件>..." 更新要提交的内容) (使用 "git checkout -- <文件>..." 丢弃工作区的改动) 修改: b1.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git add b1.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git commit -m "b1.txt" [master 6b0e946] b1.txt 1 file changed, 1 insertion(+) create mode 100644 b1.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git log commit 6b0e9462132230007ecdda16d659972beb2bf2b6 (HEAD -> master) Author: yangyang-git <lm> Date: Thu Feb 28 15:35:20 2019 +0800 b1.txt
4.4删除文件
注意:在git中,删除文件或者删除文件内容都属于一个修改
步骤:
第一步:删除工作区中的文件:rm -rf filename
第二步:删除版本库中的文件:git rm filename
第三步:提交,git commit -m “xxx”
演示命令: yq@Wyq:~/桌面/python1807/learngit1807$ git status 位于分支 master 无文件要提交,干净的工作区 wyq@Wyq:~/桌面/python1807/learngit1807$ rm -rf b1.txt wyq@Wyq:~/桌面/python1807/learngit1807$ ls a1.txt text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git status 位于分支 master 尚未暂存以备提交的变更: (使用 "git add/rm <文件>..." 更新要提交的内容) (使用 "git checkout -- <文件>..." 丢弃工作区的改动) 删除: b1.txt 修改尚未加入提交(使用 "git add" 和/或 "git commit -a") wyq@Wyq:~/桌面/python1807/learngit1807$ git rm b1.txt rm 'b1.txt' wyq@Wyq:~/桌面/python1807/learngit1807$ git status 位于分支 master 要提交的变更: (使用 "git reset HEAD <文件>..." 以取消暂存) 删除: b1.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git commit -m "delete b1.txt" [master d99810e] delete b1.txt 1 file changed, 1 deletion(-) delete mode 100644 b1.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git status 位于分支 master 无文件要提交,干净的工作区
5.远程仓库
git是分布式版本控制系统
有了远程仓库之后,不同的电脑可以从远程仓库克隆
5.1添加远程仓库的准备工作
步骤:
第一步:创建github账号【http://github.com】
第二步:生成ssh key
作用:是远程仓库和电脑之间的唯一标识
a.以前用过:cd到 /home/普通用户/.ssh,找到id_rsa.pub文件
b.从未用过:ssh-keygen -t rsa -C “git注册邮箱地址”
第三步:检测是否连接成功
ssh -T git@github.com
演示命令: wyq@Wyq:~$ cd .ssh/ wyq@Wyq:~/.ssh$ ls id_rsa id_rsa.pub known_hosts wyq@Wyq:~/.ssh$ cat id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDGEpMDrsH5pYxhzqMOSxkNlySrS9uOfAV7n42g5pZYGb67lzOl8QGiWr9hrTfOGTNGt+R+gh4iFJ7kdST73Jx0HE0vZ0sVjt6mDkcbeuoLXNXJ7z4BaQQwQXE5oap+XICQiNZCjxoQFs+LRwZR24WN7k/9e2+kbaDgb4tZEg6fnRKO6GxiitHLPWxJAkUo5pqQS7CI66EMEkUpEF25z94CfGdItOmkU7nWTQW7yC000HYt6bj6xK34wOnGAnw034eB31lB9ysleqqRjpkLQitxJqt3rhZFfSzHa0F9hJZQrB89VE9zGXMTRpRpXyCqAKDzJ1+Ek1ebRHdc5mjQ/E3z lm wyq@Wyq:~/.ssh$ cd .. wyq@Wyq:~$ pwd /home/wyq wyq@Wyq:~$ ssh-keygen -t rsa -C "18501970795@163.com" Generating public/private rsa key pair. Enter file in which to save the key (/home/wyq/.ssh/id_rsa): /home/wyq/.ssh/id_rsa already exists. Overwrite (y/n)? y Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/wyq/.ssh/id_rsa. Your public key has been saved in /home/wyq/.ssh/id_rsa.pub. The key fingerprint is: SHA256:9sC4tGjUmffT6R0cLM0P9PpmNcnvOMt7SXQUTdbUwbs 18501970795@163.com The key's randomart image is: +---[RSA 2048]----+ | .=X| | o=| | ...| | . = = +.| | . * S . O =| | . o = + . + E.| | o o + o = *| | . o o.==| | . *Oo| +----[SHA256]-----+ wyq@Wyq:~$ cd .ssh/ wyq@Wyq:~/.ssh$ ls id_rsa id_rsa.pub known_hosts wyq@Wyq:~/.ssh$ cat id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5l8SAtYGRmpSSCNOvCgw2EnXtfILEruieQE1nbDxHn+iRaoP1QAU1X0I4UC+Cy36Au97YbKZa21LXyjWfG5r7GRspWE2jMvCoPy/35kz+Xt/Y4di2bIoMPCATfQ4JUm0yUSREgV14k7CZH2BG+Zh1nhPYFcsY2gbY1N9BHgymtFIIj376GKOH4+YWXcx8iV6ZfUhEfxx3y1Nkj16YB4IypfgvEsapc4BsW3+NaFP1qeCK0BVqDEwDFQ5oIp27zMUMasJ1iU6shQlYgx3uFnQUg5P/BQ5oKOdPghjtmEz7zH5fXgWXU1SxBd5ncF3bPFgllly64dc0ySysGw8+ME7j 18501970795@163.com wyq@Wyq:~/.ssh$ ssh -T git@github.com #检测是否连接成功 Warning: Permanently added the RSA host key for IP address '13.229.188.59' to the list of known hosts. Hi yangyang-git! You've successfully authenticated, but GitHub does not provide shell access.
5.2添加远程仓库【先有本地仓库】
第一步:git remote add origin git@github.com:yangyang-git/learngit1807.git #建立了本地仓库和远程仓库之间的连接 #本地的master推送到远程,origin是自定义的,表示远程的名称 第二步:git push -u origin master 将本地仓库中的内容推送到远程仓库 #说明:只有第一次推送的时候添加-u,不但为了将本地仓库中的内容推送到远程仓库,而且键本地的master分支和远程的master分支联系起来 第三步:如果修改了本地仓库,使用git push origin master直接推送到远程 演示命令: wyq@Wyq:~/桌面/python1807$ cd learngit1807/ wyq@Wyq:~/桌面/python1807/learngit1807$ ls a1.txt text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ ls -a . .. a1.txt .git text.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git remote add origin git@github.com:yangyang-git/learngit1807.git wyq@Wyq:~/桌面/python1807/learngit1807$ git push -u origin master 对象计数中: 23, 完成. 压缩对象中: 100% (14/14), 完成. 写入对象中: 100% (23/23), 1.78 KiB | 909.00 KiB/s, 完成. Total 23 (delta 0), reused 0 (delta 0) To github.com:yangyang-git/learngit1807.git * [new branch] master -> master 分支 'master' 设置为跟踪来自 'origin' 的远程分支 'master'。 wyq@Wyq:~/桌面/python1807/learngit1807$ touch file1.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git add file1.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git commit -m "create file1" [master d3db2ad] create file1 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 file1.txt wyq@Wyq:~/桌面/python1807/learngit1807$ git push origin master 对象计数中: 3, 完成. 压缩对象中: 100% (2/2), 完成. 写入对象中: 100% (3/3), 285 bytes | 285.00 KiB/s, 完成. Total 3 (delta 0), reused 0 (delta 0) To github.com:yangyang-git/learngit1807.git d99810e..d3db2ad master -> master
5.3克隆仓库【先有远程仓库】
第一步:创建远程仓库,注意:勾选Initialize this repository with a README
第二步:克隆远程仓库
找到一个合适的位置,执行命令:git clone git@github.com:git的账户名/远程项目名称.git
第三步:在本地工作进行工作,提交到本地仓库,执行命令:git push origin master将本地仓库中修改推送到远程仓库
演示命令: wyq@Wyq:~/桌面/python1807$ git clone git@github.com:yangyang-git/clonegit1807.git 正克隆到 'clonegit1807'... remote: Enumerating objects: 3, done. remote: Counting objects: 100% (3/3), done. remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 接收对象中: 100% (3/3), 完成. wyq@Wyq:~/桌面/python1807$ ls clonegit1807 learngit1807 wyq@Wyq:~/桌面/python1807$ cd clonegit1807/ wyq@Wyq:~/桌面/python1807/clonegit1807$ ls README.md wyq@Wyq:~/桌面/python1807/clonegit1807$ touch a1.txt wyq@Wyq:~/桌面/python1807/clonegit1807$ vim a1.txt wyq@Wyq:~/桌面/python1807/clonegit1807$ git add a1.txt wyq@Wyq:~/桌面/python1807/clonegit1807$ git commit -m "a1" [master 6645051] a1 1 file changed, 1 insertion(+) create mode 100644 a1.txt wyq@Wyq:~/桌面/python1807/clonegit1807$ git push origin master 对象计数中: 3, 完成. 压缩对象中: 100% (2/2), 完成. 写入对象中: 100% (3/3), 249 bytes | 249.00 KiB/s, 完成. Total 3 (delta 0), reused 0 (delta 0) To github.com:yangyang-git/clonegit1807.git 5581c0a..6645051 master -> master