学Git,用Git ①
本月开始接触到Git版本管理工具,觉得很有意思,在这里总结一下学习Git的一些心得体会。
要在Mac上完整的使用git进行版本管理,需要熟悉Mac终端操作命令和Git操作命令两种命令,索性两种命令加在一起也并不是很多,我在这里就一起总结了。
1.Mac终端操作命令
Git在使用中经常要用到Mac目录/文件管理的相关命令,主要包括查找目录/文件,并对目录/文件进行操作(增删查改)两大类别,再细分可分为以下几种小的类别:
(1)目录切换命令
-
- $ pwd 显示当前工作目录的路径 (我在哪里)
- $ ls 列出当前目录下文件 (我这里有什么)
- 添加 -l 显示文件详细信息(文件权限 包含文件数等)
- 添加 -a 显示目录下所有文件 (隐藏文件也会显示)
- $ cd <file name> 进入工作目录 (向前走)
- $ .. 表示当前目录的上一级目录 (配合命令3,向后退)
- $ cd ~ 进入当前登录账户目录下 (回到起点)
(2)目录操作命令
-
- $ mkdir <file name> 创建新目录(文件夹)
- $ rm -rf <file name>删除文件或目录
- $ rm -rf* <file name>强制删除当前目录下所有文件
- $ mv -f <file name> target 移动目录或文件
- $ cp -r <file name> 复制目录或文件
(3)文件操作命令
-
- $ touch <file name> 增加文件
- $ cat <file name> 进入文件
- $ stat <file name> 查看文件详细信息
(4)系统相关操作
-
- $ chmod <file name>更改指定目录或文件权限
- $ sudo 以root权限执行一次命令
- $ clear 清屏
- $ fn command t 新开终端窗口
- $ ps aux 静态查看进程
- $ kill 杀死进程
- $ kill -9 pid 杀死指定进程
2.Git 指令
简单介绍了Mac终端操作命令后,正式开始介绍Git技术,主要从以下几个部分介绍:
- 为什么使用Git
- 我如何看Git
- Git游戏存档
- Git游戏存档进化版--Git分支
- Git远程仓库
下面开始正文:
(1)为什么使用Git
我的答案是,因为Git优雅,简介,易懂。我之前没有用过SVN似的集中式版本管理工具,所以也无从比较两者的好坏,但是经过一段时间Git的使用,不用通过复制多个文件夹进行版本管理了,需要输入的命令屈指可数,完全满足管理需求,并且当输错时还总是有温馨的提示,而且整个Git大致想一遍也能大致理解其思路,这样用起来更加得心应手。总之Git令我很满意,因此我愿意在这里分享学习使用Git的一些心得和感想。
(2)我如何看Git
这里的“我如何看”是指,我如何理解Git操作,进一步说,是我对Git为什么设置这个功能,为什么这么用的一些小小的思考。
我将Git大致想象为游戏的存档系统,包含存档菜单:盛放存档的容器,存档器:用来存档,读档器:用来读档。仔细想想这三个构建也就是版本管理最核心的功能了吧,这么一想,游戏存档本身就是一个版本控制工具。那么现在问题来了,游戏的存档系统和开发环境中使用的版本控制系统有哪些不同:1.游戏存档信息可视化,2.游戏存档有数量限制,3.游戏存档不存在时间上的连贯性,即你可以同时玩多个角色并为他们分别在不同时期存档。这样想下去,其实有很多地方可以继续深究,但我们先就此打住,先来谈谈Git,我认为Git的核心功能在于以下三个部分:1.Git游戏存档,2.Git游戏存档升级版--Git分支,3.Git远程仓库,下面分别予以说明。
(3)Git游戏存档
因为Git使用起来实在和游戏存档系统太相似了,所以为Git的核心功能暂时取了个这样的名字。不过要详解Git游戏存档的细节,首先要掌握Git的一些基本知识,话不多说,一图胜千言
可以看到,当将一个文档目录(文件夹)设为git仓库时,git会在该目录下添加.git隐藏目录,里面存放git暂存区,分支,HEAD指针等众多重要的git构件,于是我们可以通过git仓库实现文件的版本管理。
Git游戏存档的主要玩法如下:
- 建立游戏存档系统:进入目标文件目录,使用命令 $ git init 初始化一个git仓库。
- 存档:
- $ git add <file name> 将修改文件拖入暂存区
- $ git commit -m '<msg>' 将暂存区文件拖入目标分支 (存档)
- 查询存档:$ git log 查询存档目录
- --pretty = oneline省略存档时间,作者,将存档名和备注整合为一行
- 读档:
- $ git reset -- hard HEAD^ 回退到上一个存档点
- $ git reset -- hard <save id> 读取指定id存档
以上几条命令就是git游戏存档功能的基础功能了,熟练掌握以上6条git操作,就可以实现用git进行游戏存档式版本管理功能。
OK,你现在可以将任何想要用git进行版本管理的目录变成git仓库进行管理(git init),可以通过git add和git commit命令迅速为你此次的改动“存档”,保存一个即时的快照,当你通过git log打开git的“存档目录”时,你可以清楚地看到你的每一次存档时间,存档人,存档id和相应的备注,当你决定要读取某个存档时,立即使用git reset指令加存档的唯一id,大功告成!整个git版本管理逻辑就如游戏存档一般简介明了。
但是,慢着。接下来的一些问题不知道你是否充满疑惑?
- 为什么“存档”时要执行两次操作?
- 我如何知道存档是否真的保存了?
- 我说,那个HEAD是什么?
- wow,我发现了一个bug!
- 等等,我还没存档,我想重头玩!
- 我删除了一些文件,要使用add命令吗?
- hey,说真的,存档名真难记。
别着急,我会逐一回答这些问题。
(1)为什么“存档”时要执行两次操作?
你是在说为什么存档在游戏中只用点击一次“存档”,而在git中要先git add一下修改的文件,然后还要git commit提交?这太复杂了,这两步有什么意义对吧。老实说我也刚明白不久,我想原因大概是,由于git会跟踪仓库内文件的"变动",而我们一般工作时,往往一个任务会牵扯众多文件的修改(比如,前端开发中新增一个web功能需要修改相应的HTML,CSS,JAVASCRIPT三个文件),因此一个文件存档一次显然是没有意义的(或者说,太过于浪费了),因此git允许我们将同一个功能的不同文件一个一个放入暂存区,然后统一提交至当前分支(关于分支之后再说),这样存档变得有意义多了,我们哪个功能完成的不好,就读档,修修补补,再提交。所以你应该明白该放入什么文件至暂存区了吧?
(2)我如何知道存档是否真的保存了?
hi,这真是一个好问题,简单的方法是使用刚才提到的git log查询存档目录。但我觉得你想知道的肯定不止这些,通常,我们经常使用$ git status这个指令查看目前工作目录的状态,git会贴心的告诉我们工作区的最新状态(一些文件被删除了?一些陌生的文件被添加进来了?一些文件有一些变动!)你可以清楚地知道你离“保存”还有多远的路要走。而当git告诉你文件有改动的时候,你还可以通过$ git diff指令查看所有文本文档的具体改动是什么。
(3)我说,那个HEAD是什么?
简单说,是一个指针,指向当前分支下最新的那个存档,所以你可以通过git reset --hard HEAD^(^表示上一个)回退到上一个存档点,但是HEAD指针的功用不只如此,实际上之所以git能够在各存档点不断跳转,就是因为git实际上只是在拨弄HEAD指针的缘故,当HEAD指针被拨到倒数第二个存档的位置后,git会隐藏掉HEAD指针之后的所有存档,让你有一种时光倒流的感觉,但是放心,之前的那些存档还在。
(4)wow,我发现了一个bug!
我知道你要说什么,使用git reset -- hard HEAD^^回退到上上一个存档后,再使用git log检查存档发现有两个最近的存档丢失了对吧?放心,我刚才预告过了,他们还在,不过你需要使用一点特别的方式找到他们,使用$ git reflog指令查看命令历史,你会发现每次有关存档的信息都在上面,当然包括每次存档的id!所以如果你真的难以割舍最新的两个存档,读档吧,我保证他们还在!
(5)等等,我还没存档,但我想重头玩!
我知道,这也是在所难免的事情,你add了修改的文件到暂存区,然后你拾起一份新的文件开始修修补补,但最后你却把一切弄得一团糟,怎么办呢,你想。读档吧,可是读档后暂存区的那些已经改好的文件就没有了,别着急,git里总有后悔药吃,此时的你需要$ git checkout -- <file name>指令,这个指令会帮你吧工作区的文件还原至时间上最近的一次提交,要么是暂存区的文件,要么是分支上的。嫌一个个输入文件名太烦?试试$ git checkout .指令如何,他会撤销工作区内所有的变动,当然放入暂存区的文件是安全的。
(6)我删除了一些文件,要使用add命令吗?
当然不,对于删除的文件,如果确定要删除,使用$ git rm <file name>指令。
(7)hey,说真的,存档名真难记!
恩,说实话,是这么回事,git为了避免在多人开发中存档名的重复导致管理混乱,并没有使用简单的序号来编排存档,而是使用一长串无规律的字母数字组成的字符串。但是好在git意识到了复杂存档名不容易被人记忆的问题,开发出了“标签”这个功能。你可以通过$ git tag <tag name>指令为最近的一次存档打上一个标签(PS:你可以同时给一个存档打上多个标签),并可以通过 -a <tag name>指定标签名,通过-m <msg>附加额外的说明文字。这样你可以轻松的通过标签识别出对你而言特别的存档,当然,你也可以通过标签迅速跳回到某个存档。恩 我听到你又开始心里嘀咕,要是想给之前的某个存档打上标签怎么办?答案是使用$ git tag <tag name> <id>的指令,只要在标签名后附加你想要打标签的存档id就可以了。
之后,我们可以通过$ git show <tag name>查看打上标签的存档信息,使用$ git tag -d <tag name>删除标签。
最后再总结一下,为了说明某个存档很“特别”,我们可以为他打上标签,并使用如下指令进行整个标签操作:
打标签:$ git tag <tag name> <id>
读标签:$ git show <tag name>
删除标签:$ git tag -d <tag name>
最后再免费附赠两个指令(别着急,后面我们会提到远程的事情):
推送标签至远程仓库:$ git push origin <tag name>
一次性推送所有标签至远程:$git push origin --tags
删除远程标签:$ git tag -d <tag name> 本地删除)+ $git push origin :refs/tags/<tag name>(远程删除)
不知不觉已经写到这里了,到达这里,你应该已经能够使用git的基本功能进行很酷的版本管理,但是git的功用还远不止如此,我将会在接下来的章节讨论git剩下的两个核心功能。希望你能跟上,bey~