Git 安装与使用(一)

一、简介

   1.集中式版本控制系统(CVS):Svn
     * 版本库是集中存放在中央服务器中的,客户端需要先从中央服务器取得最新的版本,然后再干活,活干完后,再把自己的代码推送给中央服务器。
        中央服务器就好比是人事局,当你想要修改档案,得先从人事局把档案取出来,修改完,再还回人事局
     * 缺点:
       * 必须有网络才能协同工作,否则单机工作,那就乱套了
       * 当中央服务器出问题了,那所有人都得蒙逼

   2.分布式版本控制系统(DVCS):Git
     * 首先,没有“中央服务器”,每个客户端同时也是一个完整的版本库,这样工作的时候,就不需要联网了
     * 客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢         复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份.
     * 更进一步,许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。你可以根据需要设定不同的         协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的。

   3.分布式 VS 集中式
      * 安全性
         分布式:安全性更高,因为每个人电脑都有完整的版本库
         集中式:中央政策没了,企业就蒙逼了
      * 分支管理
        集中式:也有分支管理,但是谁TM会用,谁TM敢用,建立个分支,那个墨迹,可靠性太TM低
        分布式:操作简便,合并快捷,天下武功,唯快不破

二、原理

    1. 直接记录快照,而非差异比较

        Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而CVS(SVN)类系统则只关心文件内容的具体差异。Git 并不保存这些前后变化的差异数      据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这        次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。

    2.近乎所有操作都是本地执行

    3.时刻保持数据完整性

    4.文件的三种状态

       Git 内都只有三种状态:已提交(committed),已修改(modified)和 已暂存(staged)

       未被Git跟踪的状态为unstage状态; 已经被Git跟踪的状态为stage状态,因此包括staging状态和staged状态

       untrack files是指尚未被git所管理的文件;changed but not updated是指文件被git管理,并且发生了改变,但改动还没被git管理;这两种状态,都可以看成是改动还没被        git管理的状态,我们这里称非stage状态。

       changes to be commited是指进入stage状态的文件,stage是commit和未管理之间的一个状态,也叫index状态,也就是git已经管理了这些改动,但是还没完成提交。
      .gitignore(git忽略文件)中的文件,不会出现在以上三个状态中。

     5.基本的 Git 工作流程如下

        在工作目录中修改某些文件 -> 对修改后的文件进行快照,然后保存到暂存区域 -> 提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录中

 

三、安装与配置

       安装就不在叙述了,根据自己的环境进行下载版本安装即可,这里主要讲解一下初次运行 Git 前的配置

       右键 -> Git Bash Here  

       * 注册用户信息

       git config --global user.name "XXX"    

       git config --global user.email "XXX@XXX"   

       git config –-list              #查看用户信息   

      * 文本编辑器(默认会使用操作系统指定的默认编辑器Vi 或者 Vim)
      git config --global core.editor emacs      

      * 差异分析工具
        决合并冲突时使用哪种差异分析工具。比如要改用 vimdiff 的话:
      git config --global merge.tool vimdiff    

四、开始使用

      1.创建版本库

         版本库又名仓库(Repository),目录下的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,且还原

         创建一个空目录 —> 变成Git可以管理的仓库

           当前目录中,多了一个.git隐藏文件夹,这个目录是Git来跟踪管理版本库的,别动这个文件夹奥

         

     2.将文件添加到版本库中

        问:微信撩妹分几步走?分两步:找妹儿,加好友(添加到通讯录);点击妹儿头像->发送信息,进入聊天页面(告诉微信,我要开始发消息了)

        将文件从工作区添加到暂存区  ->  把文件提交到本地版本库 

       (为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件

        git add filename 添加单个文件到暂存区

        git add -A  添加当前文件夹下的所有文件

        git status   查看当前操作目录处于哪个分支 和 文件的状态

          

        git commit -m "描述信息"    将暂存区的文件提交到本地版本库

          clean 说明缓存区没有要提交的文件了

    3.时光穿梭机

       * 查看文件哪里变动了       git diff filename

         

      * 提交修改,同新增文件的用法一致(add -> commit)

      * 版本回退

         * 查看历史纪录   git log

           可以看到从最近到最远的提交记录,一大串码是commit id

        * 回退到上一个版本  git reset --hard HEAD^

          

        * 回退错了,我要回到3.0 ,  只要当前窗口没有关闭,因为你可以看见commit id,      git reset --hard commit id

            commit id 没必要写全,前几位就可以了,Git会自动去找

        * 那么问题来了,如果昨天大姨妈,心情不好,思维蒙逼了,回退到了某一个版本,但是今早醒来,疼痛去无踪,后悔回退版本了,咋整呀,别怕,老司机带你飞

           查看操作记录   git reflog

            

    4.管理修改

       * 提交修改

       举个例子, 修改了一个文件,然后add,并未commit,这个文件被提交到暂存区了,然后接着修改该文件,然后直接commit,最后版本区的文件是第一次修改的文件。

       第二次的修改为什么没在版本库中呀,我TM commit了,老妹儿,你说这是为什么呢?

       原因:commit只能将暂存区的文件提交到版本库,因为第二次修改没有add,暂存区中只保留着第一次修改后的文件,因为所以,自然道理

       解决办法: 方式一: 接着上一步, add -> commit

                       方式二: 再修改完第二次后,要先add,这样就将一次与第二次的修改合并了,然后提交到暂存去了。最后在 commit,搞定

       * 撤销修改

          如果不小心修改文件,而多加了一行 “妮,来耍一下子嘛”,咋整呀,被别人看见了咋办,敢自称老司机,自然有办法,

          使用命令    git checkout -- filename

          情况一:还未add , 想丢弃工作区的修改,也就是让工作区恢复到与版本库一致

          

           情况二:已经add , 想丢弃工作区与暂存区的修改

           

 

          情况四:已经add了,然后又修改了东西,想回到add后的状态,去掉后修改的东西

           

           情况四:已经commit了,那就 版本回退 

    5.删除文件

       情况一:未add,直接删除就好了 或者  rm filename

       情况二:已add,未commit 

                如果直接删除,工作区删除了文件,但是暂缓区不知道工作区删除了文件

                

                先恢复一下被删除的文件, git checkout -- filename

                工作区与暂存区都删除文件  git rm filename  ,然后还得add、commit   

       情况三:已commit

           

        情况四:已push,这里先不讲解,后续再说

                  要分成三步: git rm filename -> git commit -m "" -> git push

      5.远程仓库

        * 创建SSH Key

           第一步:

           ssh-keygen -t rsa -C "281345774@qq.com" , 然后一路回车

           

            id_ras是私钥,不能泄露

            id_rsa.pub是公钥,可以放心告诉任何人

            第二步:登陆github进行设置

               登陆GitHub,点击右上角的头像 -> 选择settings -> 选择“SSH and GPG keys”页面:

               点机“new SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:保存

               

           为什么要用ssh key?

           因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。

        * 添加远程库

           在本地已经创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,

           首先,登陆GitHub,然后,在右上角找到“+”按钮,创建一个新的仓库:

            

               可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联

               第一步: 关联:  在本地的git_test仓库下运行命令:

      $ git remote add origin git@github.com:xfz1987/git_test.git   后面的地址如途中所示   
 

第二步: 查看当前关联的远程库:
git remote -v

               第三步: 将本地已关联的库的内容推送到远程库中

               用git push命令,把当前本地分支master推送到远程库中的master分支上

               由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的                master分支关联起来,在以后的推送或者拉取时就可以简化命令,第一次 clone 或 push 时,会有一个警告,不予理睬,输入 yes 即可

               此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改

                 git push -u origin master    

               

               推送成功后,我们登陆github,就可以看见文件已经被推送至远程库上了

        

         * 从远程库克隆

            git clone githup远程库地址 [本地目录]    - 如果不写目录,默认为当前目录

            

             

           git的基本使用已经介绍完毕了, 下一篇 开始讲解git 的 分支管理 与 标签管理 及 一些扩展知识

 

    

 

 

 

原文地址:https://www.cnblogs.com/xfz1987/p/5672883.html