2019-04-09 Git 本地的工作原理和基本操作

一. git 的安装

        https://git-scm.com/download/linux

二. git的三个本地工作区:


working directory: 

    原始目录(working tree)。项目的本地开发目录。

    管理命令:

        A. git init                初始化空的Repository。声明当前目录是working directory,并交由git管理。

        B. git rm <文件名>                       它内联了git status(不检查untracked文件),即“检查相比较文档库内最新版本,变更是否发生在working directory的文件,是否有 staging area 树信息没有commit”, 如果都没有,则删除staging area的索引,删除working directory的文件。文档库的同一版本的文件则会在下一次“git commit”时被删掉,但历史版本仍将保留。

staging area:

    1. 索引区(stage / cache / index)

    2. track list

    1+2 一起追踪(track)文件变更用

    临时的追踪文件树,即还没有commit过的当前working directory 的修改,但只要add过了这一修改,文件信息就会记录在这。一旦commit,这将清除该信息,仅留在tracked类(track list)上

    管理命令:

        A. git add  <文件名>     检查和同步一切修改 从 working directory --> staging area , 并把文件归入tracked类(track list)

            <文件名>支持:1. 多文件(空格分隔);2. 目录;3. 通配符‘*

            参数支持: 

                1. -A   作用在被删除的,更改的,新增的文件

                2.  .    作用在更改的,新增的文件

                3.  -u  作用在更改的,被删除的文件

           * 当working directory 没有相对staging area的变更,git add 无效。

        B. git status            检查相比较文档库内最近版本,变更是否发生在working directory的tracked文件,是否有 staging area 树信息没有commit,是否有untracked文件。

            ignored的文件(目录)不会被检查

            ignored的文件(目录)在 <working directory>/.gitignore里逐行定义 (记住要包括它自己)。子目录也可以有.gitignore。

            .gitignore 格式:支持通配符 *;‘!’排出指定文件,即重加入tracked scope;注释 ‘#’

            untracked的文件(目录)是指:

            相比较文档库最新版本,检查到 有变更发生在了working directory的文件,但该文件却没有被加入staging area        

        C. git rm --cache <文件名>        从staging area树上删除,并把文件归入untracked类(track list)

             a. 如果之前这个文件已经commit过,那在这个命令以后不会再有这个文件的新版本被提交到版本库了,但老版本仍保留在版本库

             b. 如果这个文件从没commit过,这是一个完美的撤销“错误add”的操作

            git rm --cache <文件名>    <--反向动作 -->   git add <文件名>

                    ||                                                                ||

            unstage 文件,使它untracked                   stage 文件,使它tracked

        D. git rm <文件名>                       它内联了git status(不检查ignored文件),即“检查相比较文档库内作新版本,变更是否发生在working directory的文件,是否有 staging area 树信息没有commit”, 如果都没有,则删除staging area的索引,删除working directory的文件。文档库的同一版本的文件则会在下一次“git commit”时被删掉,但历史版本仍将保留。

            git rm 生效的情况  =  rm file && git add -A .

        E. git mv <source_filename> <target_filename>        在working directory里mv文件,并git add -A .来更新staging area,让他知道新文件生成,就文件删除 。git commit后文档库会更新。

        **注意: 改变staging area的命令,不只add和rm (mv)这一对逆操作。还有 reset, checkout.

            reset 默认的--mix参数,会把staging area一起恢复到指定的commit节点的版本

            checkout 旧版本(非HEAD节点)的文件时,会在staging area记录这个版本为下一次commit的版本, 所以这个checkout操作,应该紧跟一个 git reset HEAD来清除这个干扰索引

Repository

    文件库。项目所有提交过的数据的最终存放区。

    它是一个文件,位于working directory的 子目录 .git/

    管理命令:

        A.  git init                初始化空的Repository。声明当前目录是working directory,并交由git管理。

        B. git commit <文件名>        检查和同步一切修改 从 staging area  --> Repository, 并删掉staging area 树的文件内容(不是从删掉track list上删掉)

            <文件名>支持:1. 多文件(空格分隔);2. 目录;3. 通配符‘*’;4. '.' , 代表目录内所有文件(目录)

            参数支持: 1. -m  <comments>;  2. --author=<author_name  email>

        C. git commit --amend <文件名> -m <comments> --author=<>         修改上一次commit的说明

            *  说明内容 保存在 <repository>/.git/COMMIT_EDITMSG

         D. git reset <commit节点标识符或节点标签>            将文档库恢复到这个commit节点的状态

              参数支持:1. --soft    只改变文档库; 2. --mixed(默认)   staging area也同步到该节点对应的状态; 3. --hard  working directory和staging area都同步到该节点对应的状态

        E. git checkout <commit节点标识符或节点标签>  <文件名>        从指定的commmit节点取回某文件 到working directory。

            checkout 旧版本(非HEAD节点)的文件时,会在staging area记录这个版本为下一次commit的版本, 所以这个checkout操作,应该紧跟一个 git reset HEAD来清除这个干扰索引。 (这个设计,是为了checkout命令服务分支切换功能而设计的)

            如果指定的commit节点没有该文件,会自动回溯更老的版本。

            * 如果不指定<文件名>,操作变成了分支切换 --  HEAD指向此commit节点,形成detach head状态,长出无名分支。

        F. git slash <选项>            暂存当前工作

             选项: 1. save  记录tracked所有文件 与HEAD的差异 , 然后把这些文件还原成HEAD的版本

                         2. list    列出HEAD的commit节点标识符。 这个很重要,标签不行因为是相对的而后面会再次commit,所以需要绝对的标识符

                         3. pop 或 apply    取出来自save的暂存修改的记录,合并到working directory

                实际使用时,在2和3之间,通常作一些其他突然来的变更任务,在commit后:            

                            a. git checkout <2的commit节点> .            取回该版本所有tracked的数据

                            b. git reset HEAD                                        清理这个版本的索引吗??

        G. git gc        整理并清理文档库里不用的数据

            参数支持:    1. --aggressive  仔细清理        2. --auto 清理前先检查 有容忍度        3. --no-prune 只整理不清楚

三. git的三个配置文件

    优先级由高到低

    1. 对本Reporsitory的操作有效    <working directory>/.git/config 

    2. 对本用户的操作有效                 <home directory>/.gitconifg

    3. 对本系统内所有用户和文档库都有效    <git安装目录>/etc/.gitconifg        

    管理命令:

        A. git config

            选项: 

                1.    -l                列出 高优先级的配置在末尾

                2.    空选项        设置配置。ex:  git config user.name 'Josie'; git config user.email 'jox@nnit.com'

                3.    alias.<别名>   定义git命令别名。 ex: git config alias.con 'conifg -l'     即 git con = git config -l

                4.    --unset        删除配置或别名。ex: git config --unset user.name; git config --unset alias.con

               5.    作用范围: --system   -->  2 本用户  ;  --global  -->  3 所有用户和文档库  


四. 察看git的文档库

    图形模式

        gitk

    命令行模式

            节点标签 ,比节点标识符(SHA1 ID) 友好。

                节点表示符可以只用前4bit

                HEAD可以简写为‘@’

                管理命令:

                    A. git tag  <自定义节点标签>  <commit节点标签或默认节点标识符>        自定义节点标签

                    B. git tag -d <commit节点标签或默认节点标识符>                删除自定义节点标签

            察看commit信息的命令

                A. git log 

                支持参数:

                    1. --graph             commit 节点的演进图

                    * 格式:        

                        <节点标签或节点标识符>^n           // '^' 表示上一层的父commit节点,n表示选哪个父commit节点

                        <节点标签或节点标识符>~m          // ‘~’表示上m层的父节点

                    2. --oneline                             只显示 commit节点标识符  comments  增删改的行数

                    3. --author="A"                        只显示author以大写字母A开的人的commit

                    4. --after (--since)  --before (--until)        只显示指定日期间的commit

                    5. 其它参数 --stat  --numstat  --shortstat

                B. git show HEAD                               最新commit节点的详细数据

                C. git show <节点标签或节点标识符>:<文件名>        指定commit节点的该文件的内容

                D. git grep  <字符串> <commit节点标识符或节点标签>            从指定的commmit节点查找某字符串

                    参数支持:  1. -e    多字符串查找  (or)    ex :git grep -e  <字符串1>  -e <字符串2><commit节点标识符或节点标签>

                                        2. -e --and  多字符串查找(and)    ex:git grep -e  <字符串1>  --amd  -e <字符串2><commit节点标识符或节点标签>

                E. git blame <文件名>            察看该文件每行最后谁修改的

                    参数支持: -L start_line,end_line            指定察看范围

                F. git shortlog                        列出每个author的commit的次数和说明

    报告模式

            GitStats 工具   以来python 2 和 gnuplot 绘图软件包 http://www.gnuplot.info/

            下载:https://github.com/hoxu/gitstats

            安装: 解压 

            运行:python  gitstats.py <git 文档库路径>  <存储html文件路径>

            结果:


五.  git 三个工作区数据的对比

管理命令:

    A. git diff       包括了两步对比:

        step1.  对比working directory  VS  staging area    //如果相同,则进入下一步 

        step2.  对比working directory  VS  repository

    输出:

        --- a-version_of_repository_or_cache            // 指明 文件版本a 以下用 - 代表

        +++ b-verison_of_working_directory             // 指明 文件版本b 以下用 + 代表

        @@  -<n>,<l>,+<m>,<p> @@                       // @@ 指明变更发生自,从a(-)第n行起,数l行,对应b(+)第m行起,数p行

        - xxxxxxxx                                                       // 指明变更内容  a文件删除(-)了xxxxx

        yyyyyyyy                                                         // NA

        + zzzzzz                                                          // 指明变更内容  a文件增加(+)了zzzzz

        @@  -<q>,<r>,+<s>,<t> @@                         // 另一段变更的描述

        - uuu

        vvv

        wwww

    B. git diff  <commit节点标识符或节点标签1>  <commit节点标识符或节点标签2>  <文件名>       对比该文件在两个commit节点的数据

        ex: git diff HEAD HEAD^ .        // 比较当前版本commit节点和他上一层父commit节点的所有数据

    C. git diff --no-index <文件名1> <文件名2>        对比working directory的两个文件

    D. git diff --cached  <文件名>        对比staging area和repository里当前commit节点的这个文件数据

    E. git diff <commit节点标识符或节点标签>  <文件名>    对比working directory和repository某commit节点的这个文件数据

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容