一、前言

    还记得第一次接触到Git是在ubuntu的操作系统上面安装一个关于搭建SDN环境的时候,那个时候网络上面直接使用git clone后面加上具体的网址就可以下载其中的源代码了,当时一直以为git命令就是ubuntu操作系统上面的一个小命令,这时很快问题出来了,系统提醒我需要首先安装git,sudo apt-get install git,这时我确切的自以为git就是该Linux版本的一个类似于Vim的命令。直到最近在 http://git-scm.com/官网里面看见了官网教程,以及在github网站中下载了git shell的软件,能够在自己的本地工作区上面进行工作,就这样花费了一天的时间对git有了一定的认识,也将自己的几个比较的小代码上传到了自己的github的仓库(repository),当然git也是非常深入的,不过对于我而言,我觉着我已经够用了。

    在这里我推荐在github官网中去下载git shell和github的软件,这样比bash更加好用。

二、Git介绍

    git是分布式版本控制系统( Distributed Version Control System,简称 DVCS ),这里客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。而且相对于之前的SVC系统,git不需要联网就可以在自己的本地工作区里进行编辑。更棒的是,git还有提供分支的功能,你可以在master分支之外建立许多其它的分支,比如:feature分支、bug分支等,最后再将最后的分支合并为master分支,这样很有利于协作者之间相互之间利用各自的分支来敲写自己的代码,最后将进行合并。可以说以上这两个优点是git成功的主要原因。  

    在文件保存到Git之前,所有数据都要进行内容的校验和(checksum)计算,并将此结果作为数据的唯一标识和索引。即不可能在你修改了文件或目录之后,Git一无所知。这项特性作为Git的设计哲学,建在整体架构的最底层。所以如果文件在传输时变得不完整,或者磁盘损坏导致文件数据缺失,Git都能立即察觉。

    Git使用SHA-1算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个 SHA-1 哈希值,作为指纹字符串。该字串由 40 个十六进制字符(0-9 及 a-f)组成,看起来就像是:24b9da6552252987aa493b52f8696cd6d3b00373。Git的工作完全依赖于这类指纹字串,所以你会经常看到这样的哈希值。实际上,所有保存在Git数据库中的东西都是用此哈希值来作索引的,而不是靠文件名。   

    这里申明一下:所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。建议使用的window来学习Git的下载Notepad++代替记事本(因为记事本里面会在每个文件前面加了一个十六进制的字符),不但功能强大,而且免费!记得把Notepad++的默认编码设置为UTF-8 without BOM即可。

三、Git操作命令

   1、创建仓库

    初始化一个Git仓库,使用git init命令。

    添加文件到Git仓库,分两步:

       第一步,使用命令git add <file>,注意,可反复多次使用,添加多个文件;

       第二步,使用命令git commit,完成。 

    随时掌握工作区的状态,使用git status命令。如果git status告诉你有文件被修改过,可以利用git diff可以查看修改内容。

   2、版本回退

    HEAD指向的版本就是当前版本,因此,Git允许我们在新旧版本之间穿梭,使用命令git reset --hard commit_id穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。要回到现在,则用git reflog查看命令历史,以便确定要回到哪个版本。

    下面一幅图告诉你Git的三个状态:工作区、版本库(里面有暂存区):

 

    每次修改,如果不add到暂存区,那就不会加入到commit中。

   3、撤销修改

    情形1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

    情形2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

    情形3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考前面的版本回退,不过前提是没有推送到远程库(github)。

   4、关联远程库

    要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git关联后,使用命令git push -u origin master第一次推送master分支的所有内容;此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;

    当然要从远程库克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。其中Git支持多种协议,包括https,但通过ssh支持的原生git协议速度比较快。

   5、创建分支

    Git鼓励大量使用分支:

  • 查看分支:git branch
  • 创建分支:git branch <name>
  • 切换分支:git checkout <name>
  • 创建+切换分支:gitcheckout -b <name>
  • 合并某分支到当前分支:git merge <name>
  • 删除分支:git branch -d <name>

    当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。git log --graph命令可以看到分支合并图。Git分支十分强大,在团队开发中应该充分应用。合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

   5.1、bug分支和feature分支

    修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

    开发一个新feature,最好新建一个分支;如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

   5.2、分支协作处理

    查看远程库信息,使用git remote -v 本地新建的分支如果不推送到远程,对其他人就是不可见的;

    从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;

    在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

    建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name

  6、标签操作

   命令git tag<name>用于新建一个标签,默认为HEAD,也可以指定一个commit id

   git tag -a <tagname> -m"blablabla..."可以指定标签信息;

   git tag -s <tagname> -m"blablabla..."可以用PGP签名标签;

   git tag可以查看所有标签。

   git push origin <tagname>可以推送一个本地标签;

   git push origin --tags可以推送全部未推送过的本地标签;

   git tag -d<tagname>可以删除一个本地标签;

   git push origin :refs/tags/<tagname>可以删除一个远程标签。

  7、自定义GitHub

   在GitHub上,可以任意Fork开源仓库;自己拥有Fork后的仓库的读写权限;可以推送pullrequest给官方仓库来贡献代码。忽略某些文件时,需要编写.gitignore.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理。

   这里介绍一个小技巧,可以简写命令,如很多人都用co表示checkoutci表示commitbr表示branch

   

<span style="font-size:18px;">git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch</span>

以后提交就可以简写成:

<span style="font-size:18px;">git ci -m "worte a file..."</span>

以上是对Git的基本理解,如果在以后的研究中还需要继续加强的Git的学习的话,将在进一步的深究,目前仅仅理解了Git是什么,以及它的工作原理和基本操作。


   


Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐