Git——基本操作
Shell
基本概念
- shell俗称壳,为使用者提供使用界面,例如DOS下command以及后来的cmd.exe
- shell分类
- 图形界面shell,提供友好的可视化界面,例如windows操作界面,Linux系统上的GNOME
- 命令行shell,通过键盘输入的方式调用应用程序,例如windows下的cmd.exe、windows powershell,Linux系统的Bourne Shell(sh)、Bourne Again shell ( bash)等
- shell通过指令操作Kernel,Kernel又去操作计算机硬件
Git
- 在windows下使用bash可以安装Git,此软件集成了大多数bash命令
- 右键Git上边框空白处,会有Options选项可以进行基本设置
- Text设置:根据设置的字体大小,Git操作界面会随之变大变小
- Window设置:可以单独界面大小
- 桌面右键会出现Git Bash Here,此功能可以快速访问被右键的文件夹,如果没有也可以通过主动添加的方式 http://blog.csdn.net/novav/article/details/53820443
Bash常见命令
- 命令 [-options] [参数],这是命令的基本形式
- pwd (Print Working Directory) 查看当前目录
- cd (Change Directory) 切换目录,如 $ cd e:
- $ cd e: 代表切换到e盘符下
- $ cd works 代表切换到e盘符下的works文件夹
- $ cd c:/user 代表切换到c盘符下的user文件夹
- $ cd .. 代表切换到上一级目录,一个点代表当前目录,两个点代表上一级目录
- ls (List) 查看当前目录下内容,如 $ ls -a
- $ ls images,这表示查看当前工作目录下的images文件夹的内容,需要注意这并没有切换目录
- 查看目录下内容有时候会多出两个隐藏的文件夹 $RECYCLE.BIN/ 和 System Volume Information/ 这个我们不需要去管它
- $ ls -a 代表查看当前工作目录的所有内容,其中包括隐藏目录,还有./ 和 ../ ,这都不用管它
- $ ls -l 代表以列表形式查看当前工作目录的内容,详细列表包括权限、文件大小、创建时间、文件名称,文件总数
- $ ls -a -l 代表以上综合,还可以这样写$ ls -al
- $ ls -al images 代表查看images下的所有内容,而且是列表形式展现,注意images参数在最后
- mkdir (Make Directory) 创建目录,如$ mkdir blog,也可以创建多个文件夹,中间用空格隔开,例如$ mkdir css js images
- touch 创建文件,如$ touch index.html,也可以在目录下指定文件夹创建文件,例如$ mkdir js/app.js
- cat 查看文件全部内容,如 $ cat index.html
- more可以查看全部信息,但是windows下不支持
- less可以查看部分信息,例如$ less index.html,但是敲击键盘回车键或者空格可以往下继续查看剩余信息,键盘Q可以退出查看
- rm (remove) 删除文件,如$ rm index.html
- rmdir (Remove Directory) 删除文件夹,只能删除空文件夹,不常用,例如 $ rmdir css
- rm -r 可以删除文件夹下的所有文件,包括此文件夹,例如$ rm -r js,会删除js文件夹,即使文件夹内有内容,-r是递归的意思
-
mv (move) 移动文件或重命名,如 mv index.html ./demo/index.html
- $ mv index.html images/index.html 第一个参数是被剪切的文件,第二个参数是移动到哪里,中间用空格隔开
- $ mv index.html images/mo.html,在剪切到指定目录下的同时,也可以对原文件重命名
- $ mv index.html mo.html,剪切到当前,这完全就是重命名的操作
- cp (copy) 复制文件,基本操作同上的mv,在复制过程中也对文件重命名
-
head 查看文件前几行,如$ head -n 5 index.html,也可以简写 $ head -5 index.html
- tail 查看文件后几行 –n,如 $ tail -n 5 index.html、$ tail -5 index.html
-
tab 自动补全,连按两次会将所有匹配内容显示出来
-
history 查看操作历史 $ history
- >和>>都是重定向的符号,可讲输出结果保存到指定目录下的文件中
- 定向的过程其实就输出的过程,好比我们$ ls 查看当前任务目录下的内容,它的结果会打印在当前界面
- $ ls > ../index.html,index.html中的内容将被输出的结果完全替换
- $ echo i love you>>../index.html,会将输出的结果追加到index.html中
- weget是下载的意思,但是windows不支持
- tar是解压的意思,但是此指令无法解压zip和rar,有专门执行解压zip的指令unzip
- curl网络请求,可以指定get请求还是post请求,以及参数,可以通过发送请求,将接收的数据重定向到指定文件中,例如$ curl http://www.baidu.com >> index.html
- whoami查看当前用户 $ whoami
-
| 管道符可以将多个命令连接使用,上一次(命令)的执行结果当成下一次(命令)的参数。
-
grep 匹配内容,一般结合管道符使用,$ grep i index.html 在文件index.html中匹配有i的字符串,$ ls | grep i 在ls输出的结果中匹配有i的字符串
Vi编辑器
基本概念
- 如同windows下的记事本,vi编辑器是linux下的标配,通过它我们对文件进行编辑
- vi编辑器提供了三种模式,命令模式、插入模式、底行模式,每种模式下的操作的作用都不一样
- 命令模式主要是中转的作用
- 在命令行模式下输入i和a之后就会进入插入模式,此时可以对文件进行编辑
- 如果此时想去底行模式,那么就需要先esc进入命令行模式,再shift+:进入底行模式
基本使用
- 命令模式
- i进入编辑模式,当前光标处插入
- a进入编辑模式,当前光标后插入
- A进入编辑模式,光标移动到行尾
- o进入编辑模式,当前行下面插入新行
- O进入编辑模式,当前行上面插入新行
- ZZ保存并退出
- u撤销操作,可多次使用
- dd删除当前行
- yy复制当前行
- p粘贴复制内容
- ctrl+f向前翻页
- ctrl+b向后翻页
- 底行模式
- w保存,w index.html 是将文件另存为,此时当前文件并没有保存
- q退出
- wq保存并退出
- e!撤销更改并返回到上次保存的状态
- q!不保存强制退出
- set nu设置行号
- 编辑模式
- 编辑模式下与windows编辑器相似
SSH
基本概念
- SHH是一种网络传输协议,用于计算机之间的加密登录
- SHH属于非对称性加密,需要两个密钥来进行加密和解密,分别是公钥和私钥
工作原理
- 在第一次登录时,服务器会将公钥发送过来,我们通过这个公钥将自己的数据进行加密
- 服务器接收数据后,通过自己的私钥对数据进行解密
基本操作
- $ ssh student@192.168.0.1,git内提供了ssh命令,student是用户,ip地址是服务器的地址
- 若是连接成功,会在用户目录下会多新建一个ssh文件夹,里面存储的就是服务器发来的公钥
- 当我们根据提示要求输入密码的时候,就会根据公钥进行加密传输
- 成功登录之后,我们可以进行操作,$ scp index.html student@192.168.0.1:/home/work,将本地的index.html文件复制到了服务器下的work目录
版本控制器
基本概念
- 版本控制(Version Control Systems)是记录若干文件变化,以便查阅特定版本修订的情况,这个系统可以自动帮我们备份文件的每一次更改,并且可以方便的恢复到任意版本的备份状态
版本分类
- 本地版本控制系统,功能单一,现在很少使用,无法完成多人协同开发
- 集中式版本控制系统,通过单一的集中管理的服务器达到多人协同开发,其代表就是SVN
- 分布式版本控制系统,不需要中央服务器,每个协同开发者都有一个完整的版本库,这样即使协同开发者的服务器出现故障,也可以通过使用其他的协同开发人员的本地仓库恢复
git工作原理
基本概念
- gi管理分为三种状态:已提交(committed)、已修改(modified),已暂存(staged),由此引入三个工作区域的概念:git仓库、工作目录、暂存区域
- git仓库是用来保存项目的元数据和对象数据库的地方,从其他计算机克隆仓库的时候,就是从这里拷贝的数据
- 工作目录是我们能看的见,是我们使用和修改的地方
- 暂存区域是一个保存了我们将要提交的文件列表数据,一般在git仓库的目录下
工作流程
- 在工作目录中修改文件
- 将文件放入暂缓区域
- 讲暂缓区域文件提交到git仓库
基本使用
-
配置用户信息
- 配置用户信息的原因是记录开发者信息,以便在版本控制中记录开发者的操作行为
- $ git config --global user.name wqx 记录用户名
- $ git config --global user.email wqx0714@163.com 记录用户邮箱
- $ git config --list 查看配置信息中是否存储了用户的信息,也可以通过桌面查看用户的文件夹,里面会有.gitconfig的配置文件
- --global是配置当前用户所有仓库
- --system配置当前计算机上的所有用户的仓库
- 配置操作只需要一次,可以重复使用
-
初始化仓库
- $ git init,在进入项目的根目录,例如work,执行$ git init,就会创建一个.git隐藏目录,可以通过$ ls -a 查看,这个.git目录就是仓库,会存储我们提交的各个历史版本的数据
-
查看状态
- $ git status 会显示工作区域下文件的状态
- 在首次没有执行add命令,工作区域的文件会出现红色Untracked files(下图1),这些都是没有被跟踪的目录,此时这种状态下,你修改的文件是不会被跟踪的,所以我们需要先将工作区执行add操作
- $ git add -A 执行之后,执行status命令,上面红色文件就被显示绿色(下图2),表示已经在暂存区域可以被提交,此时再去修改文件就会显示此文件被修改
- 当我们再次在工作区域的根目录下创建一个文件夹时候,执行status命令,又会显示一个没有跟踪被红色标注的红色文件(下图3),注意文件夹若是空的git会直接忽略
-
添加文件到缓存区
- $ git add -A 或者 $ git add * 都是文件提交到暂缓区的命令,也可以$ git add index.html 提交指定路径下的文件
- $ git checkout index.html 可以将缓存区的文件还原到工作区,达到撤销更改的目的
-
提交文件
- $ git commit -m '备注信息' 可以将暂缓区的文件全部提交到仓库存储
- $ git log 可以查看之前提交仓库的信息,如下图
- $ git reset --hard 提交ID 可以回到之前保存的状态,再次$ git log会发现最后一次的状态变成了我们回退的状态
- 当我们第二天再去对工作区进行修改时,不需要进行add命令,因为之前已经提交了一个版本的数据
- 忽略文件
- 一些文件可以不被跟踪,当然也可以不提交
- 在工作区根目录下创建.gitignore文件,在里面输入不需要跟踪的文件,注意格式是用回车换行隔开
git分支
基本概念
- 在实际开发中,在我们专注于某一个功能比如支付功能进行开发时,可能还需要应急的去改动原来版本中的bug,或者应急的在原来版本添加一个小功能例如评论功能,现在我们已经在写支付功能当然是没写完,此时如果去应急修改完提交上去,也会把半半拉拉的支付功能的代码提交上去,这样显然是不合适,所以这里引出了git创建分支的概念,它能够解决一人多任务的问题
- 在实际开发中,其实所有的提交都是在分支基础上提交的
基本使用
- 在初始化仓库git init之后,至少提交commit一次,系统才会默认创建一个master的分支
- git branch money,创建一个money分支,分支在原有版本的节点上创建的,称为子分支
- git checkout money,切换分支,此时工作区就是在money这个分支上,工作区所有的修改会提交到money上
- git branch 查看分支,带*号,表示此时工作目录处于对应分支上
- git merge master 合并分支,在处于money分支的时候,执行此命令是将master的数据融合到money上
- 需要注意的是money分值与master分支是继承关系,money分支上具有master分支上的所有存盘点
- git branch -d money 删除money分支,-D是强制删除
git共享仓库
基本概念
- 上面是本地的git操作,可以达到一人多任务的要求,但是多人协同该怎么办呢。比如自己和同事同时开发,但是同时写的是评论功能,自己写的是支付功能,当自己想要拿到同事的登录的时候应该怎么办呢?此时就引出了git共享仓库的概念,借助一个共享(远程)仓库,大家把自己开发的功能的代码放进去,别人需要的时候就可以去这个仓库拿。
基本使用
- 共享仓库的创建,可以使用ssh,具体操作如上介绍,在公司服务器上创建一个.git结尾的文件夹,比如是work.git,之后执行git init --bare命令,这就创建了一个裸仓库
- 假设自己电脑上有一个项目,我们init,add,commit之后,git push student@192.168.0.1:/home/work.git master 就将我们分支master发送到了共享仓库中,共享仓库中$ ls 是查看不到上传的文件的,只能让同事去取
- 同事那边目前是还没有数据的,但是需要init,保证是一个空仓库,但是不需要add,commit操作,之后执行git pull student1@192.168.0.1:/home/work.git master,此时我们就拿到了student1上传的数据
- 同事拿到了数据,发现只是初始化了项目,还没有功能,此时同事需要开发一个登录功能,于是git branch login 创建login分支(分支策略),之后切换到login分支,对工作区进行修改,最后add,commit,最后完成登录功能
- git push student1@192.168.0.1:/home/work.git login 同事最后将开发好的登录功能上传到共享仓库,此时共享仓库又多了一个login的存盘点,必须是上传login分支,因为你只在login分支上进行了工作区的修改
- git pull student1@192.168.0.1:/home/work.git login 自己从共享仓库中拿到了同事上传的login分支,login分支的数据替换了自己的master分支的数据
- 长串的远程地址,可以用别名代替,git remote add ball student1@192.168.0.1:/home/student/work.git,下次再向共享仓库提交或者下载数据就用ball这个别名代替就行了
克隆
- 接着上面的说,如果还有个同事也要参与这个项目,那么可以克隆clone方式
- 执行git clone sudent1@192.168.0.1:/home/work.git 这里不需要init操作,结尾也不需要指定分支,此时这个同事就会拿到整个远程仓库的数据,而且工作区的目录就是work,所以clone操作就等于mkdir+cd目录下+git init+pull操作
- 工作区根目录名称想要修改的话,只需要结尾后空格写上自己的命名就行了 git clone sudent1@192.168.0.1:/home/work.git selfname
- 克隆后的数据,有个优势就是再次向共享仓库提交分支数据的时候,无需定义远程别名,系统默认设置origin就是远程地址,git push origin ..