• Git(一)之基本操作详解


    工作中一直都是用Git作为版本控制,只是知道简单的几个命令,没有去了解它的内部原理。所以周末有时间来系统学习。

      现在的公司基本上都是用Git作为版本控制,当然也有SVN的。

      Git是目前世界上最先进的分布式版本控制系统。那什么是版本控制系统呢?

        如果你用Microsoft Word写过长篇大论,那你一定有这样的经历:

        想删除一个段落,又怕将来想恢复找不回来怎么办?有办法,先把当前文件“另存为……”一个新的Word文件,再接着改,改到一定程度,

        再“另存为……”一个新文件,这样一直改下去,最后你的Word文档变成了这样:

          

        1)过了一周,你想找回被删除的文字,但是已经记不清删除前保存在哪个文件里了,只好一个一个文件去找,真麻烦。

        看着一堆乱七八糟的文件,想保留最新的一个,然后把其他的删掉,又怕哪天会用上,还不敢删,真郁闷。

        2)更要命的是,有些部分需要你的财务同事帮助填写,于是你把文件Copy到U盘里给她(也可能通过Email发送一份给她),然后,你继续修改Word文件。

        一天后,同事再把Word文件传给你,此时,你必须想想,发给她之后到你收到她的文件期间,你作了哪些改动,得把你的改动和她的部分合并,真困难。

        3)于是你想,如果有一个软件,不但能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需

        要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以,岂不是很方便? 

        4)于是你想,如果有一个软件,不但能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。

        如果想查看某次改动,只需要在软件里瞄一眼就可以,岂不是很方便?

        5)这个软件用起来就应该像这个样子,能记录每次文件的改动:

        

    一、Git简介

    1.1、Git概述

       Git是目前世界上最先进的分布式版本控制系统。可以有效、高速的处理从很小到非常大的项目版本管理。

    1.2、Git和SVN的区别

      1)SVN

        SVN是集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,

        干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。

        

        集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就

        需要5分钟,这还不得把人给憋死啊。

      2)Git

        Git是分布式版本控制系统,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在

        你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩

        之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。   

        和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就

        可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。

        在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事

        病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样

        干活,只是交换修改不方便而已。

        

        当然,Git的优势不单是不必联网这么简单,后面我们还会看到Git极其强大的分支管理,把SVN等远远抛在了后面。

    二、Git在Windonws中安装

      Git的安装我这里就不详细的介绍了,网上一大堆。

      安装完成之后会与Git Bash:

      说明安装成功了!

      安装完成后,还需要最后一步设置,在命令行输入如下:

    git config --global  user.name "用户名"
    git config --gobal user.eamil "邮箱名称"

      因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识。

      设置完成可以使用:git config --list查看配置

      

      注意:git config  --global 参数,有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然你也可以对某个仓库指定的不同的用户名和邮箱。

    三、Git基本操作

    3.1、创建版本库

      什么是版本库?版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,

      Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还可以将文件”还原”。

      所以创建一个版本库也非常简单,举例:在D盘->Lance目录下创建一个GitTest的版本库

      

      注意:pwd 命令是用于显示当前的目录。

      1)通过命令 git init 把这个目录变成git可以管理的仓库

        

      2) 这时候你当前GitTest目录下会多了一个.git的目录,这个目录是Git来跟踪管理版本的,没事千万不要手动乱改这个目录里面的文件,否则,会把git仓库给破坏了。

        

    3.2、把文件添加到版本库中

      首先要明确下,所有的版本控制系统,只能跟踪文本文件的改动,比如txt文件,网页,所有程序的代码等,Git也不列外,版本控制系统可以告诉你每次的改动,

      但是图片,视频这些二进制文件,虽能也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是知道图片从1kb变成2kb,

      但是到底改了啥,版本控制也不知道。

      我们通过一个实例来演示:

        我在版本库GitTest目录下新建一个记事本文件 lance.txt 内容如下:aaaaaa

        

        1)使用命令 git add lance.txt添加到暂存区里面去

          

           如果和上面一样,没有任何提示,说明已经添加成功了。(如果我们想把GitTest目录下所有的文件都添加到暂存区使用git add . )

        2)用命令 git commit告诉Git,把文件提交到仓库。

          

          注意:-m是提交的注释

        3)现在我们已经提交了一个lance.txt文件了,我们下面可以通过命令git status来查看是否还有文件未提交  

          

        4) 说明没有任何文件未提交,但是我现在继续来改下lance.txt内容,比如我在下面添加一行bbbbbb内容,继续使用git status来查看下结果

          

          上面的命令告诉我们 lancee.txt文件已被修改,但是未被提交的修改。

        5)接下来我想看下lancee.txt文件到底改了什么内容,使用git diff lance.txt

            

          如上可以看到,lance.txt文件内容从一行aaaaaa改成 二行 添加了一行bbbbbb内容。

        6)知道了对lance.txt文件做了什么修改后,我们可以放心的提交到仓库了,提交修改和提交文件是一样的2步(第一步是git add  第二步是:git commit)。

          

    3.3、版本退回

      如上,我们已经学会了修改文件,现在我继续对lance.txt文件进行修改,再增加一行内容为bbbbbb继续执行命令如下:

      

      在我已经对lance.txt文件做了三次修改了,那么我现在想查看下历史记录,如何查呢?我们现在可以使用命令 git log 演示如下所示:

      

       git log命令显示从最近到最远的显示日志,我们可以看到最近三次提交,最近的一次是,增加内容为cccccc.上一次是添加内容bbbbbb,第一次默认是 aaaaaa。

      如果嫌上面显示的信息太多的话,我们可以使用命令 git log –-pretty=oneline 演示如下:

      

        现在我想使用版本回退操作,我想把当前的版本回退到上一个版本,要使用什么命令呢?

        git reset  --hard HEAD^ 那么如果要回退到上上个版本只需把HEAD^ 改成 HEAD^^ 以此类推。那如果要回退到前100个版本的话,

        使用上面的方法肯定不方便,我们可以使用下面的简便命令操作:git reset  --hard HEAD~100 即可。

        1)未退回上个版本之前的内容:

          

        2)如果想回退到上一个版本的命令如下操作:

          

        3)退回上个版本之后的内容

          

        4)我们可以使用git log来查看一下历史记录

          

        5)我们看到 增加cccccc 内容我们没有看到了,但是现在我想回退到最新的版本,如:有cccccc的内容要如何恢复呢?

          我们可以通过版本号回退,使用命令方法如下:

          git reset  --hard 版本号 ,但是现在的问题假如我已经关掉过一次命令行或者333内容的版本号我并不知道呢?

          要如何知道增加cccccc内容的版本号呢?可以通过如下命令即可获取到版本号:git reflog  演示如下:

          

        6)通过上面的显示我们可以知道,增加内容cccccc的版本号是 a5of798。我们现在可以命令git reset  --harda50f798来恢复了。

          

        可以看到 目前已经是最新的版本了。

    四、Git撤销修改和删除操作

    4.1、撤销修改

      比如我现在在lance.txt文件里面增加一行 内容为dddddd,我们先通过命令查看如下:

          

      在我未提交之前,我发现添加dddddd内容有误,所以我得马上恢复以前的版本,现在我可以有如下几种方法可以做修改:

        第一:如果我知道要删掉那些内容的话,直接手动更改去掉那些需要的文件,然后add添加到暂存区,最后commit掉。

        第二:我可以按以前的方法直接恢复到上一个版本。使用 git reset  --hard HEAD^

      但是现在我不想使用上面的2种方法,我想直接想使用撤销命令该如何操作呢?首先在做撤销之前,我们可以先用 git status 查看下当前的状态。

          

      可以发现,Git会告诉你,git checkout  -- file 可以丢弃工作区的修改,如下命令:

      git checkout  --  lance.txt,如下所示:

        

      命令 git checkout -- lance.txt 意思就是,把lance.txt文件在工作区做的修改全部撤销,这里有2种情况,如下:

        1)lance.txt自动修改后,还没有放到暂存区,使用 撤销修改就回到和版本库一模一样的状态。

        2)另外一种是lance.txt已经放入暂存区了,接着又作了修改,撤销修改就回到添加暂存区后的状态。

      对于第二种情况,我想我们继续做demo来看下,假如现在我对readme.txt添加一行 内容为666666,我git add 增加到暂存区后,

      接着添加内容777777,我想通过撤销命令让其回到暂存区后的状态。如下所示:

        

        注意:命令git checkout -- readme.txt 中的 -- 很重要,如果没有 -- 的话,那么命令变成创建分支了。

    4.2、删除文件 

      假如我现在版本库GitTest目录添加一个文件test.txt,然后提交。

      

      如上:一般情况下,可以直接在文件目录中把文件删了,或者使用如上rm命令:rm test.txt ,如果我想彻底从版本库中删掉了此文件的话,

      可以再执行commit命令 提交掉,现在目录是这样的。

        

      只要没有commit之前,如果我想在版本库中恢复此文件如何操作呢?

      可以使用如下命令 git checkout  -- test.txt,如下所示:

      

      再来看看我们GitTest目录,添加了1个文件了。

      

  • 相关阅读:
    LeetCode 382. Linked List Random Node
    LeetCode 398. Random Pick Index
    LeetCode 1002. Find Common Characters
    LeetCode 498. Diagonal Traverse
    LeetCode 825. Friends Of Appropriate Ages
    LeetCode 824. Goat Latin
    LeetCode 896. Monotonic Array
    LeetCode 987. Vertical Order Traversal of a Binary Tree
    LeetCode 689. Maximum Sum of 3 Non-Overlapping Subarrays
    LeetCode 636. Exclusive Time of Functions
  • 原文地址:https://www.cnblogs.com/yxnyd/p/9801227.html
Copyright © 2020-2023  润新知