• Git小玩





    早就听说了GitHub的强大. 一直没有机会去看, 在公司实习的几个月里也没机会接触SVN和Git, 

    可是抱着对Linus大神的崇敬, 和开源的崇敬之情. 

    趁着不忙的几天, 来学习一下Git. 希望以后可以用到. 

    事实上Git还是十分好学. 用不了多久, 你就能体会到它的高效简洁之美!

    这里我是在本地虚拟机Centos来学习. . . 仅仅是学习他的简单原理和操作, 并没有真正的尝试项目.

    同一时候借鉴了网上一些有经验的前辈们的理解.. 来自己操作和学习

    非常多地方简单的样例我都有做图解,,做PPT真的好难阿!!!

    而且花了两天时间来学习并编写这个小的文档.

    希望能有所收获!



    1. 介绍Git


    一款免费, 开源, 高效的分布式版本号控制系统 

    https://git-scm.com官网下载  支持命令行和GUI

    https://gitref.org 官方的帮助文档. 


    SVN和Git的主要差别:

    SVN是集中式版本号控制系统。版本号库是集中放在中央server的,而干活的时候,用的都是自己的电脑。

    所以首先要从中央server哪里得到最新的版本号,然后干活,干完后,须要把自己做完的活推送到中央server。

    集中式版本号

            Git是分布式版本号控制系统。那么它就没有中央server的,每一个人的电脑就是一个完整的版本号库,这样,工作的时候就不须要联网了,由于版本号都是在自己的电脑上。

    既然每一个人的电脑都有一个完整的版本号库,那多个人怎样协作呢?比方说自己在电脑上改了文件A,其它人也在电脑上改了文件A。

    这时,你们两之间仅仅需把各自的改动推送给对方,就能够互相看到对方的改动了。



    2. 全局配置git


    - 安装 : sudo apt-get install git

    - 查看版本号: git --version

    - 全局配置:

     git config --global user.name xxx
     git config --global user.email xxx
     git config --global color.ui true 
     配置username和邮箱是为了提交代码时的团队标识


     git config --list  查看git全局配置

     cat ~/.gitconfig   全局配置都保存在用户文件夹下这个.gitconfig隐藏文件里, 也能够vi编辑


     能够通过下面命令获取git帮助

     -- git help

     能够通过下面命令获取特定某个指定的的帮助

     -- git help 特定指令

     能够查看仓库提交的历史记录

     -- git log 




    3. 创建Repository


    - 初始化一个新的Git仓库

    git init : 初始化git文件夹环境(创建出新的空的repository) 并生成隐藏文件夹.git

    .git(Git仓库文件, 全部相关的数据都保存在这儿)

    $ ls -A  查看到隐藏文件.git  
    $ cd .git/


    还有一种方式:

    git clone https://github.com/kennethreitz/requests.git

    克隆网上的git项目,会自己主动创建repository



    4. Git的对象类型


    - Git中有四种基本对象类型,组成了Git更高级的数据结构:


    ● Blobs

    每一个blob代表一个(版本号的)文件,blob仅仅包括文件的数据,而忽略文件的其它元数据。如名字、路径、格式等。


    ● trees

    每一个tree代表了一个文件夹的信息。包括了此文件夹下的blobs。子文件夹(相应于子trees)。文件名称、路径等元数据。

    因此。对于有子文件夹的文件夹。git相当于存储了嵌套的trees。


    ● commits

    每一个commit记录了提交一个更新的全部元数据,如指向的tree,父commit。作者、提交者、提交日期、提交日志等。每次提交都指向一个tree对象,记录了当次提交时的文件夹信息。

    一个commit能够有多个(至少一个)父commits。


    ● tags

    tag用于给某个上述类型的对象指配一个便于开发人员记忆的名字, 通经常使用于某次commit。



    5. 提交及加入文件


    git status --查看git repository的状态

     

    Untracked files: 没有登记的文件


    a).加入

    git add hello.py命令进行加入

     

    b).提交

    git commit -m ‘init commit’

    (不加-m会默认打开vi, ‘ ’里面是操作的描写叙述,这里的init commit表示首次提交,)

     

    能够直接提交到仓库(不暂存)

    git commit -a -m (或-am) “modify hello.txt”

    注意: 

    1.事实上不是在暂存区不存, 而是帮我们跳过(git add暂存区)这一步骤.

    2.他不会自己主动提交 未追踪文件, 也就是新文件没有add过是不行的.





    - 关于这三个文件状态及工作区域:

    ● History 也能够说 Git repository(git仓库):

    终于确定的文件能保存到仓库, 成为一个新的版本号, 而且对他人可见


    ● Staging area (暂存区,Cache, Index):

    暂存已经改动的文件


    ● Working directory(工作区):

    编辑, 改动文件



    6. 查看git状态



    git status -s 列出简要状态信息

    文件前面有两个flag.  第一个是Staging area, 第二个是Working directory

    再次vi hello.py后查看状态:

     

    出现两个M, 第一个M表示Staging area里的文件发生变化, 第二个M表示Working directory发生了变化.

    两个区全然一致, 标志位就是空白, 有发生变化导致不一致, 标志位就是M

    再次进行commit, 三个区全然一致. 两个标志位都为空




    7. 查看文件区别


    git diff 是查看第二个flag(也就是Staging area和Working directory) 详细变化信息的命令

     


    在modify操作后能够用:

    git diff --staged   能够查看第一个flag(也就是Staging arae和History 之间的变化), 产生同样的效果

    git diff HEAD       能够看History 和 Working 之间的变化

    git diff --stat        后面加stat能够简化变化信息




    8. 撤销误操作



    9. 移除及重命名文件


    -删除文件

    1.系统级别删除

    rm filename

    2.从git中删除文件

    git rm filename

    3.提交操作

    git commit -m “delete filename”


    注意: 仅仅是删除当前版本号中的文件, 文件依旧被记录在Git仓库历史中

    git rm --cached filename , 删除Staking arae中的文件, 文件还存在Working directory中, 能够通过git add 或 git reset 恢复

    - 重命名文件

    git mv xxx new xxx

    git commit -m “rename xxx”


    重命名相当于运行了下面三条命令:

    1. mv xxx newxxx (先系统级别上改名mv)

    2. git rm xxx

    3. git add newxxx




    10. 暂存工作区



    假如出现这样的情况(MM), 工作区改动完(改动1)后add到暂存区, 还未commit到仓库中, 此时发现一个遗漏或紧急情况, 须要在工作区中在改动1之前做改动(改动2), 可是又不想放弃改动1, 此时能够暂存工作区后进行改动. 


    git stash 暂存工作区

     

    此时就回到了改动一之前的现场, 此时能够做自己的代码修复vi

    git commit -am ‘quick fix’

    改动完后就能够提交这个紧急修复

     

    git stash list  查看暂存工作区的列表

    能够看到一个

    git stash pop  弹出这个现场

    然后在进行add和commit后, 改动1和改动2的作用就同一时候生效了. 




    11. 图解commit对象


    为了理解HEAD,commit,和commit下对象之间的结构关系,  我们用图来理解:

     


    以下实际来看一下

    git log 后, 出现近期的操作日志例如以下: 

     

    每一个commit后面都有一个哈希码来唯一标识这个commit.

    HEAD默认指向第一个commit

    git cat-file -t : show object type


    git cat-file -p: print object’s content


    当然, 用commit 前的哈希值也能够看到这个对象. 

     

    这里就能够看到前面commit图解中的信息


    找到这个commit对象了, 我们再来看看这个对象中的tree里面有什么.

     

    也能够继续追踪下去. 这样你就能够自由的找到commit对象里面的全部内容.



    12. 理解tree-ish表达式


    在.git文件里有一个HEAD

    # cat HEAD
    # ref: refs/heads/master

    我们查看这儿

    # cat refs/heads/master

    # git log --oneline

    能够看到, 这个master分支就指向的是最新的commit

    git rev-parse HEAD

    能够看到, 这里HEAD和master的终于指向是一致的, 都是commit.

    -- git show 和 git cat -file -p类似, 能更简便的看到content


    假设要定位到commit下的tree. 能够用tree-ish表达式

    HEAD ~3^{tree}

    假设要定位到tree下的hello.py, 不用先定位到tree. 也能够用表达式

    HEAD~3:

    tree-ish表达式的引入, 让我们更方便的定位到随意一个对象和文件





    13. 创建及删除分支


    - 查看分支:

    # git branch
    * master

    - 新建一个分支:

    # git branch newBranch
    #git branch
    	* master
    	   newBranch

    - 切换分支:

    # git checkout newBranch
    创建分支和切换分支能够合并一步进行:
    # git checkout -b newBranch

    - 删除分支

    # git branch -d newBranch

    注意: 切换分支实际就是把head指向了不同的branch

     

    cd heads文件夹, 就会发现有两个分支,master和newBranch

    他们都指向一个commit

     



    14. 合并分支(上)


    这里我们介绍合并分支的做法, 和两种合并机制

    我们在新创建的分支newBranch中进行代码的升级(hello.py)提交后, 

    再删除newBranch, 会出现一个error. 

     

    这是由于newBranch原本指向的呢个新commit, 删除后, 这个新commit就没有被指向了. 如图:

     

    所以应该须要在删除newBranch之前让master指向新commit. 也就是进行分支合并, 合并后的效果如图:

     

    使用git merge newBranch

    然后就能够删除newBranch了

    这样的合并机制叫Fast-forword




    15. 合并分支(下)


    假设出现这样的情况: 在两个分支都出现了代码的改动

    两个分支master和bugFix

    在bugFix分支上做了两次fix (fix1和fix2) 并提交

     


    然后切换到master分支, 做一次Modify. 

     


    进行git merge bugFix后, 两个分支的操作都被合并了

     

    可是此时的合并方式就不是Fast-forwrd那么简单了. 而是还有一种机制3-way merge

    它的合并原理例如以下: 

     

    1. 先找到两个分支的共同分支对象

    2. 将fix code2和B进行比对, 形成对照信息.

    3. 然后将对照信息加入应用到Modify code上. 形成新的对象NEW. 

     master又一次指向NEW. 分支合并完成! 





    16. Git远程仓库


    远程仓库的实现:

    1. 使用现有的Git网络仓库服务

    Github: https://github.com (创建开源免费哦)

    Bitbucket: https://bitbucket.org

    2. 搭建自己的Git仓库server




  • 相关阅读:
    String.format in JavaScript
    dojo/domReady! 中感叹号的作用
    文本三剑客之sed的用法
    文本三剑客之grep的用法
    通配符与特殊符号
    文件属性信息
    文件属性及find命令总结
    linux系统常用命令
    系统优化
    vim编辑器 与etc目录
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7239366.html
Copyright © 2020-2023  润新知