从 git bash 命令行中窥探人生(三)

简介: 众所周知,现实世界和计算机世界是不同的,但是计算机作为人类对现实世界的抽象模拟,在一定程度上,具备了现实世界的基本特征,本文将以哲学角度对比分析现实世界和计算机世界,试图以浅显易懂的方式感受现实世界和计算机世界的联系。

在命令行操作中的基本哲学理念是”没有消息就是好消息”,输入命令没有任何反馈的话,操作一般都成功了,如果操作失败都会有报错提示的。

虽然我们是在 windows 电脑上演示命令行操作,但命令行的逻辑不像 windows 可视化操作那样,新建文件会提示新建成功,移动文件也会提示移动成功,而命令行逻辑确实 linux 系统那一套逻辑。

没有消息就是好消息,在命令行交互的过程中可能没有那么多操作反馈,因而要求我们熟知命令作用,清楚明白自己在干什么!

既然 git add <file> 没有消息反馈就说明我们操作成功了,下一步我们应该运行什么命令才能将这些目标问价添加到网盘呢?

外事不决问谷歌,内事不决问百度,而我们却有一个智能小秘书—git status ,大多数情况下提供了足够多的信息告诉我们下一步操作。

  • 又见智能小秘书: 查看文件状态

刚刚我们运行 git add 命令添加了一些目标文件,故意留下了 ../.swp 文件,这种名字一看就算不是我们主动创建的文件,八成是系统或者编辑器什么的自动创建的,因而我们不需要备份这文件。

此时运行 git status 命令告诉我们目标文件已添加但还没提交,此时可以撤销(unstage)到未添加状态,还有一个文件未被追踪提示我们可以使用 git add 添加到待提交文件列表中。

目前为止,文件经历了两个阶段,最初尚未被追踪状态,使用 git add 命令添加文件转变成已追踪状态,此时再次运行 git status 提示我们已追踪到文件变化还未被提交,因此我们可以预测有一种命令能够提交文件,但是这个命令是谁呢?

$ git status
# 仍然处于 `master` 主干分支
On branch master
# 目前仍然没有提交(版本)
No commits yet
# 即将要被提交的更改: `Changes` 翻译为更改,`committed` 翻译为被提交,即文件的更改将要被提交,提示我们下一步操作是提交文件
Changes to be committed:
# (使用 `git rm --cached <file>` 来清空缓存: 注意 `unstage` 并不是 `commit` ,所以并不是提交操作而是撤销操作,即下述文件既可以进行下一步提交也可以回到上一步撤销文件.)
(use "git rm --cached <file>..." to unstage)
new file: ../cup.txt
new file: git.md
new file: ../goal.md
new file: ../markdown/courseware.md
new file: ../markdown/markdown.md
# 未被追踪的文件列表: 使用 `git add <file>...` 添加文件
Untracked files:
(use "git add <file>..." to include in what will be committed)
../.swp
snowdreams1006@home MINGW64 /g/workpace/git-bash-demo/git (master)
  • 不想见就删了吧: 删除文件

rm [OPTION] [FILE] : remove 翻译为”删除”,即删除问价.

上一步中运行 git add 后再次运行 git status 命令没有提示我们如何进行提交文件操作,只告诉我们 git rm --cached <file> 来撤销已被追踪的文件,可能是由于还有文件 ../.swp 文件没有被追踪,所以小助手猜想我们可能还没操作完毕,故而没有告诉我们如何提交?

不想见它就删了吧,通过命令行命令删除这个令人讨厌的家伙,看看会发生什么事情。

$ rm ../.swp

依然没有消息反馈,应该删除成功了吧,看一下该文件还在不在以及当前文件的状态如何。

snowdreams1006@home MINGW64 /g/workpace/git-bash-demo/git (master)
$ ls
git.md
snowdreams1006@home MINGW64 /g/workpace/git-bash-demo/git (master)
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: ../cup.txt
new file: git.md
new file: ../goal.md
new file: ../markdown/courseware.md
new file: ../markdown/markdown.md

好吧,依然没有告诉我们提交文件的命令,只有只能亲自动手直接告诉你,这个命令就是 git commit ,估计你也猜个八九不离十,毕竟 commit 出现频率如此之高!

  • 兢兢业业上班中: 提交文件

git commit : 即提交文件,将已跟踪的文件清单变化全部提交到版本库.

git add 命令帮助我们打包好待上传文件,git commit 命令则执行上传操作,现在文件已经加入本地网盘了,妈妈再也不用担心文件丢失了呢!

# 提交文件并添加备注信息,其中 `-m` 是 `-message` 的缩写,表示备注信息
$ git commit -m "init git-bash-demo"
[master (root-commit) 128d0d0] init git-bash-demo
4 files changed, 59 insertions(+)
create mode 100644 cup.txt
create mode 100644 git/git.md
create mode 100644 goal.txt
create mode 100644 markdown/markdown.md

现在已经提交了文件,我们再次请来小秘书查看一下当前文件状态。

$ git status
On branch master
# 没有什么文件需要提交,工作区很干净.
nothing to commit, working tree clean

working tree clean 告诉我们现在工作区很干净,这里的工作区可以简单理解为当前所处的工作目录。

  • 告诉我你的历史: 提交历史

git log : 即查看提交历史,每一次的提交都能记得清清楚楚,不然怎么配得上兢兢业业上班中的标题.

每一次的提交都是一个版本,一段时间后提交历史会越来越多,查看提交历史时想要知道当初提交的基本信息就要看上一步 git commit -m <message> 提供的备注信息。

$ git log
# 版本号: `128d0d0367096c41a6716ff30b4aec5876239343`,每一次提交都会产生唯一的版本号,作为提交记录的标识.
commit 128d0d0367096c41a6716ff30b4aec5876239343 (HEAD -> master)
# 提交作者的信息,`snowdreams1006` 是用户名,`snowdreams1006@163.com` 是邮箱,是安装 `git` 后配置的信息.
Author: snowdreams1006 <snowdreams1006@163.com>
Date: Tue Apr 30 09:44:39 2019 +0800
# 提交备注: `init git-bash-demo`
init git-bash-demo
  • 命令太多记不住: 操作历史

git reflog : reflog 翻译为”回流”,即翻阅命令.

版本号默认是一串无意义的字符串,主要用于定位确定唯一提交版本,所以查找指定版本号时可以缩短只要能找到版本号就可以。

正如下面的 128d0d0 代表的版本号就是 128d0d0367096c41a6716ff30b4aec5876239343.

HEAD@{0} 作为高级用法时很重要,简单基础的命令并不会用到,作为扩展知识点了解即可。

$ git reflog
# `128d0d0` 是 `128d0d0367096c41a6716ff30b4aec5876239343` 的前7位,理论上能唯一定位到某个提交版本就好,所以可以缩短版本号.
128d0d0 (HEAD -> master) HEAD@{0}: commit (initial): init git-bash-demo

现在我们回忆一下 git 的基本流程,文件是如何上传到本地网盘?

  1. git init 初始化项目,创建本地网盘.
  2. git add 添加文件,挑选出待上传到网盘的文件,准备上传.
  3. git commit 提交文件,将已目标文件上传到网盘进行备份.
  4. git status 查看文件状态,本地网盘创建完毕后随时随地呼唤小秘书查看文件状态.
  5. git log 查看提交历史,同一个文件运行多次上传,每一次的文件都能识别,总览上传记录.
  6. git reflog 查看回流历史,存储重要操作命令结果,高级进阶必备知识点.

重要知识点我都帮你总结好了,还不拿出小本本赶紧记下来?

$ echo "git 的基本流程" > git.md
$ echo "1. `git init` 初始化项目,创建本地网盘." >> git.md
$ echo "2. `git add` 添加文件,挑选出待上传到网盘的文件,准备上传." >> git.md
$ echo "3. `git commit` 提交文件,将已目标文件上传到网盘进行备份." >> git.md
$ echo "4. `git status` 查看文件状态,本地网盘创建完毕后随时随地呼唤小秘书查看文件状态." >> git.md
$ echo "5. `git log` 查看提交历史,同一个文件运行多次上传,每一次的文件都能识别,总览上传记录." >> git.md
$ echo "6. `git reflog` 查看回流历史,存储重要操作命令结果,高级进阶必备知识点." >> git.md

小笔记已经保存,现在开始将文件保存到网盘中,再次体验下 git 的工作流程,准备好了吗?

Administrator@snowdreams1006 MINGW64 /f/workspace/git-bash-demo/git (master)
# 列出当前文件: 当前工作目录位于 `git` 目录,存在学习笔记 `git.md`.
$ ls
git.md
Administrator@snowdreams1006 MINGW64 /f/workspace/git-bash-demo/git (master)
# 查看文件状态: 学习笔记 `git.md` 尚未被追踪,提示我们可以使用 `git add` 命令添加进来.
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
git.md
nothing added to commit but untracked files present (use "git add" to track)
Administrator@snowdreams1006 MINGW64 /f/workspace/git-bash-demo/git (master)
# 添加文件: 将学习笔记 `git.md` 添加到追踪文件清单.
$ git add git.md
warning: LF will be replaced by CRLF in git.md.
The file will have its original line endings in your working directory
Administrator@snowdreams1006 MINGW64 /f/workspace/git-bash-demo/git (master)
# 再次查看文件状态: 此时学习笔记 `git.md` 已添加到跟踪文件清单,显示这是一个新文件,如需提交可运行 `git commit` 提交到本地仓库.
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: git.md
Administrator@snowdreams1006 MINGW64 /f/workspace/git-bash-demo/git (master)
# 提交文件: 将跟踪文件清单的更改全部提交到本地仓库,此时跟踪清单只有我们的学习笔记 `git.md` ,所以显示只有一个文件被改变.
$ git commit -m "add git learn note"
[master (root-commit) 08cbe61] add git learn note
1 file changed, 9 insertions(+)
create mode 100644 git.md
Administrator@snowdreams1006 MINGW64 /f/workspace/git-bash-demo/git (master)
# 再次查看文件状态: 文件已经全部提交到本地版本库,相当于网盘已经有最新文件了.
$ git status
On branch master
nothing to commit, working tree clean

一次新增文件之旅就这么轻松愉快,赶紧记到笔记鼓励下自己吧!

Administrator@snowdreams1006 MINGW64 /f/workspace/git-bash-demo/git (master)
$ echo "git is so easy" >> git.md
Administrator@snowdreams1006 MINGW64 /f/workspace/git-bash-demo/git (master)
$ cat git.md
git 的基本流程
1. `git init` 初始化项目,创建本地网盘.
2. `git add` 添加文件,挑选出待上传到网盘的文件,准备上传.
3. `git commit` 提交文件,将已目标文件上传到网盘进行备份.
4. `git status` 查看文件状态,本地网盘创建完毕后随时随地呼唤小秘书查看文件状态.
5. `git log` 查看提交历史,同一个文件运行多次上传,每一次的文件都能识别,总览上传记录.
6. `git reflog` 查看回流历史,存储重要操作命令结果,高级进阶必备知识点.
git is so easy

每一次文件内容发生重大更改时都应该被记录以便后续查看当时文件状态,那现在也提交到本地仓库吧!

Administrator@snowdreams1006 MINGW64 /f/workspace/git-bash-demo/git (master)
# 查看文件状态: 和以往不同的是,这次小助手给我们提供了两个建议,`git add` 和 `git checkout` ,其中 `git add` 是更新将要提交文件的内容,而 `git checkout` 则是丢弃本次更改内容.
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: git.md
no changes added to commit (use "git add" and/or "git commit -a")
Administrator@snowdreams1006 MINGW64 /f/workspace/git-bash-demo/git (master)
# 添加文件: 按照上一步提示,我们希望的是准备提交文件,因此运行 `git add` 命令进行添加文件.
$ git add git.md
warning: LF will be replaced by CRLF in git.md.
The file will have its original line endings in your working directory
Administrator@snowdreams1006 MINGW64 /f/workspace/git-bash-demo/git (master)
# 提交文件: 和往常一样,每一次的提交都要有提交备注,方便查看提交历史时提醒自己文件内容.
$ git commit -m "git is so easy"
[master 0b0657b] git is so easy
1 file changed, 1 insertion(+)
Administrator@snowdreams1006 MINGW64 /f/workspace/git-bash-demo/git (master)
# 再次查看文件状态: 正如我们所料,小助手告诉我们工作区是干净的,这表示目标文件都已添加到版本库中,接下来让恪尽职责的 `git` 帮我们管理文件吧.
$ git status
On branch master
nothing to commit, working tree clean
Administrator@snowdreams1006 MINGW64 /f/workspace/git-bash-demo/git (master)
# 查看提交历史: 提交历史按照时间倒排顺序依次显示,最新的提交历史在终端的上面,有我们的提交备注等信息.
$ git log
commit 0b0657b7db02f1f5c6e8d5ac3f1307156c15ce08 (HEAD -> master)
Author: snowdreams1006 <snowdreams1006@163.com>
Date: Tue Apr 30 11:55:07 2019 +0800
git is so easy
commit 08cbe61c2a635ec6f70ae7a50842ae308cd95fee
Author: snowdreams1006 <snowdreams1006@163.com>
Date: Tue Apr 30 11:16:19 2019 +0800
add git learn note

目前为止,这种操作好像和普通的网盘没有什么不同,选择文件,添加文件,那我为什么要使用 git 呢?

  • 开启时间穿梭机: 版本控制

git checkout : 即检出文件,切换到指定版本状态.

假如你正在学习 git 知识,认真跟着教程边练习边做笔记,学着学着犯困了趴在电脑上睡着了,于是笔记变成了下面这样了。

$ cat git.md
git 的基本流程
1. `git init` 初始化项目,创建本地网盘.
2. `git add` 添加文件,挑选出待上传到网盘的文件,准备上传.
3. `git commit` 提交文件,将已目标文件上传到网盘进行备份.
4. `git status` 查看文件状态,本地网盘创建完毕后随时随地呼唤小秘书查看文件状态.
5. `git log` 查看提交历史,同一个文件运行多次上传,每一次的文件都能识别,总览上传记录.
6. `git reflog` 查看回流历史,存储重要操作命令结果,高级进阶必备知识点.
git is so easy
lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
,pasdad,;qwd;lqwe1233333333333333333333333333333333333,;qwe
qwewewewewewewewewewewewewewewewewewewewewewewewewewewewe

很显然,下面的内容绝对是无意之举,碰到键盘乱按的,这时候怎么删除无意义的文字呢?

当然你可以选择手动删除,当然是一种方法但不是优雅的方法,下面介绍下 git 对这种情况的解决方案。

还记得我们的小助手吗,有事没事问问它能给我们什么意见就对了,git status 闪亮登场!

$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: git.md
no changes added to commit (use "git add" and/or "git commit -a")

工作目录的文件发生修改后,如果是正确的修改那我们运行的都是 git add 命令,假如是意外内容的话(比如这次瞌睡打盹产生的乱码),肯定就不能采纳第一种建议了。

第二种建议说使用 git checkout -- <file> 来丢弃工作目录的更改,不妨试一下会发生什么吧!

Administrator@snowdreams1006 MINGW64 /f/workspace/git-bash-demo/git (master)
# 丢弃工作区更改: 恢复到最近一次版本管理状态
$ git checkout -- git.md
Administrator@snowdreams1006 MINGW64 /f/workspace/git-bash-demo/git (master)
# 查看文件状态: 工作区是干净的,就像我们执行完 `git commit`命令一样.
$ git status
On branch master
nothing to commit, working tree clean
Administrator@snowdreams1006 MINGW64 /f/workspace/git-bash-demo/git (master)
# 查看文件内容: 神奇回到了上次文件状态
$ cat git.md
git 的基本流程
1. `git init` 初始化项目,创建本地网盘.
2. `git add` 添加文件,挑选出待上传到网盘的文件,准备上传.
3. `git commit` 提交文件,将已目标文件上传到网盘进行备份.
4. `git status` 查看文件状态,本地网盘创建完毕后随时随地呼唤小秘书查看文件状态.
5. `git log` 查看提交历史,同一个文件运行多次上传,每一次的文件都能识别,总览上传记录.
6. `git reflog` 查看回流历史,存储重要操作命令结果,高级进阶必备知识点.
git is so easy

仅仅需要 git checkout -- <file> 一条命令就能轻松撤销文件更改,so easy!

  • 穿越到过去看看: 回到过去

git reset --hard <commit> : 即重置到某个版本.

正如之前不经意间提到的版本概念,每一次提交文件都会产生一长串无意义的字符串,那个字符串就是版本号。

git 实现的网盘功能可不是百度云网盘,普通的网盘只能保存最新文件,相同名称的文件不允许再次上传会被自动替换或者重命名。

然而,git 却可以多次保存文件,比如我们的学习笔记 git.md 就不止保存过一次,现在看一下该文件的提交历史吧!

Administrator@snowdreams1006 MINGW64 /f/workspace/git-bash-demo/git (master)
$ git log
# 第二次提交记录: 当时写下了git is so easy
commit 0b0657b7db02f1f5c6e8d5ac3f1307156c15ce08 (HEAD -> master)
Author: snowdreams1006 <snowdreams1006@163.com>
Date: Tue Apr 30 11:55:07 2019 +0800
git is so easy
# 第一次提交记录: 当时记录了git 的学习笔记
commit 08cbe61c2a635ec6f70ae7a50842ae308cd95fee
Author: snowdreams1006 <snowdreams1006@163.com>
Date: Tue Apr 30 11:16:19 2019 +0800
add git learn note

你可能会问了,记录了这么多版本历史有什么用呢?

用处可大了,比如我们可以穿越到第一次提交记录的那一刻去,感受怀念一下旧时光。

相关文章
|
3月前
|
前端开发 算法 开发工具
Git分支批量清理利器:自定义命令行插件实战
Git分支批量清理利器:自定义命令行插件实战
50 0
|
7月前
|
移动开发 小程序 Linux
【Linux】Linux和Window下\r与\n的区别、git命令行的使用
目录 1. 回车换行符在Window下和在Linux下的区别: 1.1回车换行符: 1. 2.行缓冲区打印: 1.3进度条小程序 :
111 0
|
7月前
|
存储 安全 网络安全
关于使用 git 命令行时遇到的错误消息 unable to get local issuer certificate
关于使用 git 命令行时遇到的错误消息 unable to get local issuer certificate
153 0
|
11天前
|
Shell Linux
【Linux】Bash支持各种指令选项的原理:命令行参数
【Linux】Bash支持各种指令选项的原理:命令行参数
|
1月前
|
Shell 开发工具 git
【Github】git bash将本地工程上传至github
【Github】git bash将本地工程上传至github
|
2月前
|
开发工具 git
git简易的命令行入门教程
git简易的命令行入门教程
13 0
|
2月前
|
开发工具 git
git简易的命令行入门教程
git简易的命令行入门教程
31 0
|
5月前
|
Shell
Shell(如Bash)命令行技巧
Shell(如Bash)命令行技巧
28 2
|
5月前
|
Linux 开发工具 数据安全/隐私保护
3.5、Linux:命令行git的使用
3.5、Linux:命令行git的使用
39 0
|
6月前
|
编解码 Shell
将条件判断写在bash命令行
将条件判断写在bash命令行