最全的Linux教程,Linux从入门到精通
======================
-
linux从入门到精通(第2版)
-
Linux系统移植
-
Linux驱动开发入门与实战
-
LINUX 系统移植 第2版
-
Linux开源网络全栈详解 从DPDK到OpenFlow
第一份《Linux从入门到精通》466页
====================
内容简介
====
本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。
本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。
需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
1. 图中左侧为工作区,右侧为版本库。在版本库中标记为
index
的区域是暂存区(stage
,index
),标记为master
的是master
分支所代表的目录树。2. 图中我们可以看出此时
HEAD
指针实际是指向master
分支的一个“游标”。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。3. 图中的
objects
标识的区域为Git
的对象库,实际位于.git/objects
目录下。4. 当对工作区修改(或新增)的文件执行
git add
命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID
被记录在暂存区的文件索引中。5. 当执行提交操作
git commit
时,暂存区的目录树写到版本库(对象库)中,master
分支会做相应的更新。即master
指向的目录树就是提交时暂存区的目录树。6. 当执行
git reset HEAD
命令时,暂存区的目录树会被重写,被master
分支指向的目录树所替换,但是工作区不受影响。7. 当执行
git rm --cached <file>
命令时,会直接从暂存区删除文件,工作区则不做出改变。8. 当执行
git checkout .
或者git checkout -- <file>
命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。9. 当执行
git checkout HEAD .
或者git checkout HEAD <file>
命令时,会用HEAD
指向的master
分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
2. 基本命令
2.1. git config: 环境设置命令
通常情况下,安装完Git后的第一件事就是设置用户名称和邮件地址。每一个Git的提交都会使用这些信息,如果不设置则无法进行提交。
$ git config --global user.name "goto456" // 设置用户名称
$ git config --global user.email "goto456@126.com" // 设置邮件地址
使用
--global
参数表示设置了全局的环境,如果想对与特定的项目使用不同的用户名和邮件地址,则可已在该项目目录下不使用--global
参数设置不同的用户名和邮件地址。
git config --list
命令可以列出当前Git所有的配置信息。
2.2. git init: 初始化本地仓库
获取一个 Git 仓库有2中方法:
- 本地初始化一个仓库
- 从远程克隆一个仓库到本地
对于第1种方式,如果想对本地现有的一个项目用 Git 来管理,可以直接进入该项目的目录下执行如下命令,就可以将其初始化成一个 Git 仓库了。
$ git init
2.3. git clone: 克隆远程仓库到本地
对于第二种方式,也是最常用的方式,比如你在 GitHub 上(或者其他代码托管网站)已经建立了一个项目,你就可以将该项目从远程克隆到本地,这就有了该项目在本地的 Git 仓库。
$ git clone git@github.com:goto456/leetcode.git // 通过ssh方式克隆
$ git clone https://github.com/goto456/leetcode.git // 通过https方式克隆
以上2种方式有如下区别:
1. https方式:不管是谁,只要拿到该项目的 url 可以随便 clone,但是在 push 到远程的时候需要验证用户名和密码;
2. ssh方式:需要现将你电脑的SSH key(SSH公钥)添加到GitHub(或者其他代码托管网站)上,这样在 clone 项目和 push 项目到远程时都不需要输入用户名和密码。
如何生成SSH key
,参见下一条命令:ssh-keygen
2.4. ssh-keygen: 生成SSH公钥
生成公钥之前先检查系统中是否已经有了公钥,公钥一般在~/.ssh/
目录下。如果该目录下存在id_rsa.pub
文件,这就是公钥(id_rsa 文件是私钥);如果不存在此文件,甚至连.ssh
目录都不存在,则需要用 ssh-keygen 命令来生成。如下所示:
$ ssh-keygen // 然后一直按回车键
这就可以生成 SSH key 了,公钥id_rsa.pub
文件的内容大致如下所示:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/bdrJjo6HNCuzhpTZNVsTju5NnksTca2kRzfbZlFs+8S4bs8hTlo6aV/GJPkTT0zxJfuOgfd4B4O8Xh0NQg51Zl4yCsFdnIKFA0tgBOg/H5oi48Ypoo8h3LO+S8gd8HR5eqndjINx3kCrQx4gISCW25d7GKTm3c40YPoUCIL0Zg4+iuu2ioeVCpv+FSCKhlcrYew7c2aEe3p/oOmATT3UX9S4t94qzy8KkxRlnQ4a8zQ3OTRE23r7+PPHGN8oBAen//NQNn9COUhqU3pHfvtxqYrG1Blhf0t6HhkHz9Fd8StCUIDQv7yHHvuuPFumh3/8PNG8DDPQqWsqXmK2XozT goto456@126.com
2.5. git status 查看当前状态
可以在任何时候使用该命令查看当前的状态。一般会显示当前所处的分支,以及当前工作区是否干净,是否有文件要提交。
当你克隆远程仓库到本地后,通过该命令查看当前状态时,显示信息如下图所示:
当你修改了一个文件后,再用该命令查看当前状态,显示信息如下图所示:
它会提示你把当前的变更添加到暂存区或者丢弃该变更。
当你新增一个文件后,用该命令查看当前状态,显示信息如下图所示:
它会显示新增的文件状态是未跟踪,并且提示用git add
命令将其添加到暂存区。
2.6. git add: 添加到暂存区
无论你新增了一个文件或者对已有的文件进行了修改,都需要将其添加到暂存区,然后提交到版本库。
$ git add hello.txt //后面接文件名,表示将某个文件添加到暂存区
$ git add . //后面接一个点,表示将全部文件添加到暂存区
分别执行上述2条命令后,如下图所示:
将新增/修改的文件添加到暂存区后,并未提交到版本库,还需要通过git commit
命令提交到版本库。
2.7. git commit: 提交到版本库
该命令是将添加到暂存去的变更提交到版本库,主要有一下几个常用的:
$ git commit -m "变更的说明信息" //标准用法,提交到版本库并填写相关说明信息
$ git commit -am "变更的说明信息" //加上-a参数,则不需要上一步的git add过程,可以直接将修改过的变更直接提交到版本库,但不会把新增的文件提交
分别执行上述2条命令后,如下图所示:
注:第2条命令一般在不想把新增的文件提交到版本库时用的比较多
执行完git commit命令提交到版本库后,一次简单的流程就算走完了。接下来可以通过git log命令来查看所有的提交历史。
2.8. git log: 查看提交历史
如果发现提交了一个错误版本,想回退到上个版本时,就可以通过该命令来查看所有的历史版本,以选择回退到历史的哪个版本。
$ git log //查看历史版本
$ git log --graph //以图形的方式查看历史(这个我比较常用,能很好的显示各个分支之间的关系)
执行后,如下图所示:
可以看出第2个图的左边显示出了分支的图形
2.9. git diff: 显示变更内容
当你对文件进行了修改,想查看进行了哪些修改时,可以通过该命令查看。
git diff
命令会显示修改的文件中哪些内容进行了修改,包括新增了哪些内容,删除了哪些内容。
$ git diff //后面不接参数,表示显示所有修改文件的变更
$ git diff README.md //后面接文件名,表示只显示该文件的变更
例如:我对 README.md
文件进行了修改,删除了1行,新增了2行,然后用该命令查看进行了哪些修改,如下图所示: (“+”
表示新增的内容,“-”
表示删除的内容)
2.10. git reset: 回退版本
常用于回退版本或者在各个版本间进行跳跃切换。
我们可以先用 git log
看一下当前历史版本,如下图所示:
如果要回退到前一个版本,则只需要输入:git reset HEAD~1
,执行完再看一下历史版本:
我们已经回退到前一个版本了。
如果需要回退到前2个版本,命令是:git reset HEAD~2
,回退到前n个版本就是:git reset HEAD~n
注意:在 Git 中,用 HEAD
表示指向当前版本的指针
如果需要回退到任何一个版本,则需要替换成该版本的 commit id
就可以了,例如:git reset a8336834b50daafa0793370
,执行完再看一下历史:
发现我们已经回退到该版本了。
一般情况下会加一个 --hard
参数:git reset --hard HEAD~1
或 git reset --hard a8336834b50daafa0793370
,表示回退到某个版本并且丢弃调工作区进行的修改,而不加该参数表示回退到某个版本但保留工作区的修改。
2.11. git push: 推送本地分支到远程
当修改完成,本地的改动都已经提交到本地库,则可以将本地分支推送到远程代码库了。
命令:git push origin master
origin
表示远程代码库的一个别名(也可以修改为其他名字,可通过 git remote
修改),master
表示需要推送的分支名称。
如果,push 的过程中提示当前分支进度落后于远程的分支,则需要通过 git pull
命令来拉取远程最新状态和本地分支进行合并,完成之后再 push 到远程就可以了。
2.12. git pull: 拉取远程分支到本地并合并
一般是本地分支的进度落后于远程分支时,需要使用该命令。
命令:git pull origin master
origin
表示远程代码库的一个别名(也可以修改为其他名字,可通过 git remote
修改),master
表示需要拉取合并的分支名称。
常用 git pull --rebase origin master
用 rebase 的方式进行,不会产生 merge 保持分支干净、整洁
3. 分支管理
3.1. git branch: 分支操作
命令:git branch
用于显示本地所有分支以及当前所在哪个分支。
图中显示本地有 master
和 dev
两个分支,并且正处在 master
分支上。
命令:git branch branchName
用于新建名为 branchName 的新分支。
图中新建了一个名为 test 的新分支。
命令:git branch -d branchName
用于删除名为 branchName 的分支。
图中删除了一个名为 test 的分支。
命令:git branch -D branchName
用于强制删除分支。
3.2. git checkout: 分支间切换
该命令除了进行分支间切换功能外,还可以用来丢弃工作区中的修改内容,这里就不作介绍了,仅介绍分之间的切换功能。
命令:git checkout branchName
用于从当前分支切换到名为 branchName 的分支上。
图中先显示在 master 分支上,后来切换到了 dev 分支上。
命令:git checkout -b branchName
用于新建名为 branchName 的分支并切换到该分支上。
图中新建了 test 分支并切换到了该分支上。
注意与 git branch
新建分支的区别,此处除了新建分支外还进行了切换操作
3.3. git merge: 合并分支
该命令用于合并两个分支。
命令:git merge branchName
用于将名为 branchName 的分支合并到当前分支。
有两种合并方式:
- fast-forward 方式合并:
命令:git merge dev
- 非fast-forward 方式合并:
命令:git merge dev
注意两种方式的区别:fast-forward 方式仅仅是移动了 HEAD 指针,而非 fast-forward 方式则是新建了一个节点
3.4. git rebase: 分支的变基
命令:git rebase master
将当前分支 rebase 到 master 分支
命令:git rebase master dev
将 dev 分支 rebase 到 master 分支
这种操作很难用语言解释,我用一个图来说明其与 merge 操作的区别:
由图可知,rebase 操作相当于将 C3 节点拿下来换了一个位置重新放置。最后不会产生合并的痕迹,所有分支都是同一条直线。
我们来看一个详细的例子:
你从 master 分支的 C2 上创建了一个新分支 server,为服务端添加了一些功能,提交了 C3 和 C4。 然后从 C3 上创建了特性分支 client,为客户端添加了一些功能,提交了 C8 和 C9。 最后,你回到 server 分支,又提交了 C10。
假设你希望将 client 中的修改合并到主分支并发布,但暂时并不想合并 server 中的修改,因为它们还需要经过更全面的测试。这时,你就可以使用 git rebase 命令的 –onto 选项,选中在 client 分支里但不在 server 分支里的修改(即 C8 和 C9),将它们在 master 分支上重放:
最后的话
最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!
资料预览
给大家整理的视频资料:
给大家整理的电子书资料:
如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!
资料预览
给大家整理的视频资料:
[外链图片转存中…(img-7v8ju0c7-1715159328434)]
给大家整理的电子书资料:
[外链图片转存中…(img-808esKlj-1715159328434)]
如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!