Linux-Day3笔记

一、上堂回顾

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文档变成了这样:

lots-of-docs

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

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

更要命的是,有些部分需要你的财务同事帮助填写,于是你把文件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 [email protected]

演示命令:
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  "[email protected]"
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 [email protected]
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 [email protected]
wyq@Wyq:~/.ssh$ ssh -T [email protected]   #检测是否连接成功
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  [email protected]: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  [email protected]: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 [email protected]:git的账户名/远程项目名称.git

第三步:在本地工作进行工作,提交到本地仓库,执行命令:git push origin master将本地仓库中修改推送到远程仓库

演示命令:
wyq@Wyq:~/桌面/python1807$ git clone [email protected]: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

猜你喜欢

转载自blog.csdn.net/qq_41470296/article/details/88038449