本月开始接触到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技术,主要从以下几个部分介绍:

  1. 为什么使用Git
  2. 我如何看Git
  3. Git游戏存档
  4. Git游戏存档进化版--Git分支
  5. 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游戏存档的主要玩法如下:

  1. 建立游戏存档系统:进入目标文件目录,使用命令 $ git init 初始化一个git仓库。
  2. 存档:
    1. $ git add <file name> 将修改文件拖入暂存区
    2. $ git commit -m '<msg>' 将暂存区文件拖入目标分支 (存档)
  3. 查询存档:$ git log 查询存档目录
    1. --pretty = oneline省略存档时间,作者,将存档名和备注整合为一行
  4. 读档:
    1. $ git reset -- hard HEAD^ 回退到上一个存档点
    2. $ 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版本管理逻辑就如游戏存档一般简介明了。

但是,慢着。接下来的一些问题不知道你是否充满疑惑?

  1. 为什么“存档”时要执行两次操作?
  2. 我如何知道存档是否真的保存了?
  3. 我说,那个HEAD是什么?
  4. wow,我发现了一个bug!
  5. 等等,我还没存档,我想重头玩!
  6. 我删除了一些文件,要使用add命令吗?
  7. 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~

学Git,用Git ①的更多相关文章

  1. 最近学到的Git知识,大厂的Git机制还是很方便的

    本文首发于微信公众号:程序员乔戈里 转载请注明:https://blog.csdn.net/WantFlyDaCheng/article/details/102538508 一.两次的 git com ...

  2. [Git] 还原Git上commit,但是没有push代码

    直接在Idea上操作2步解决: 1. 找到: 2. 在To Commit里面填写:HEAD^,表示将commit的信息还原为上一次的,需要多次直接reset多次即可: 使用命令行:原理一样 以下内容转 ...

  3. 命令行操作svn和git和git

    前几天在写代码的时候电脑突然坏掉,老大交代的任务没完成,非常痛恨自己用svn或者git保存代码,相信很多程序员遇到过,硬盘坏掉,存在硬盘中的代码丢失,无法找回的问题,svn和git可谓程序员界的福音, ...

  4. Git:Git初体验——Git安装配置

    作为即将成为一个程序员的男人,一直在听别人说Git多好多好,之前也随便了解了一些,但是始终没有决心去学会.现在大四了,只有毕设和一门开学六七周只去过一次课的全员必修课外,也没有什么事情做,何不去做这些 ...

  5. 使用Git、Git GUI和TortoiseGit

    1. 关于命令行 我一直建议在命令行中使用Git或者SVN.因为这样可能更加了解他们的工作方式,也不容易遗漏重要的问题和提醒. 在Windows习惯的驱使下,大多数人是不会看弹出的对话框中有什么信息的 ...

  6. git学习——git理解和仓库的创建

    一.git用的3个工作的状态的理解. 1. 工作区 workspace(modified); 2. 暂存区 stage(staged) ; 3. git本地仓库 repository(commited ...

  7. git format-patch & git apply & git clean

    一.打补丁 git format-patch & git apply 最近在工作中遇到打补丁的需求,一来觉得直接传文件有些low(而且我尝试了一下,差点把项目代码毁了) ,二来也是想学习一下, ...

  8. [git]图解git常用命令

    本文图解git中最常用的命令.如果你稍微理解git的工作原理,这篇文章能够让你理解的更透彻. 基本用法 约定 命令详解 Diff Commit Checkout Detached HEAD(匿名分支提 ...

  9. Android Studio配置Git及Git文件状态说明

    Android Studio配置Git还是比较简单的,麻烦的是可能中间出现各种问题.如果你想了解或感兴趣,请往下看. 首先你得下载Git客户端,网址:http://git-scm.com/downlo ...

  10. Git Server & Git Hook

    http://ju.outofmemory.cn/entry/16893 我喜欢 github,我现在的个人代码全部是托管在上面了,但是一些公司或者某些项目不适合放入github中,你希望能有一个完全 ...

随机推荐

  1. 可序列化对象和byte[]数组之间的互转

    /// <summary> /// 将可序列化对象转成Byte数组 /// </summary> /// <param name="obj">对 ...

  2. [iOS微博项目 - 4.4] - 会员标识

    github: https://github.com/hellovoidworld/HVWWeibo A.会员标识 1.需求 给vip会员打上会员标识 不同等级的vip会员使用不同的标识 使用橙色作为 ...

  3. 小程序 当button遇上Flex布局

    当需要将button按行排列,当超过一行时,可以换行,从左到右排列,想实现如下效果(实现的比较粗糙,能说明问题就行,呵~~~): 使用Flex布局,在设置主轴方向上对齐方式,使用justify-con ...

  4. VI乱码, cat 和 more正常

    今天在做一个东西的时候发现,vi乱码,cat,more这个文件汉字显示也正常,查了网上很多东西最后发现按一种说法改对了: 应该是格式化的问题! 比如man手册的文件有一些格式标记,你用man   ,c ...

  5. requests和bs4

    requests模块,仿造浏览器发送Http请求bs4主要对html或xml格式字符串解析成对象,使用find/find_all查找 text/attrs 爬取汽车之家 爬取汽车之家的资讯信息,它没有 ...

  6. 使用渐进式 JPEG 来提升用户体验

    原文出处: 标点符   今天才认识到原来JPEG文件有两种保存方式,分别是Baseline JPEG(标准型)和Progressive JPEG(渐进式).两种格式有相同尺寸以及图像数据,扩展名也是相 ...

  7. 日期Date 对象常用的方法

    var mydate = new Date();//通过new方法创建对象 //alert(Date()); // 返回一个完整的日期时间 // alert(mydate.getDay());//返回 ...

  8. Java-多线程基本

    Java-多线程基本 一 相关的概念 进程:是一个正在执行中的程序 每个进程都有一个执行的顺序,该顺序是一个执行路径,或者叫一个控制单元 线程:就是进程中的一个独立的控制单元,线程在控制着进程的执行 ...

  9. 浅析Android View(二)

    深入理解Android View(一) View的位置參数信息 二.View的绘制过程 View的绘制过程一共分为三个部分: - measure(測量View的大小) - layout(确定View的 ...

  10. mysql总结思维导图

    mysql总结思维导图.脑图 先整理了一个思维导图出来,到时候再继续补充并且深入挖掘一下,再写博文. 另外,看了很多优秀的博文,在这里先mark一下. https://www.cnblogs.com/ ...