Keep It Simple.Stupid.

Don Fisher's Blog

Git之重新学习梳理

        之前用git做项目版本管理的时候,只是机械式的知道几个常用命令的用法。觉得也够用,就不再深入了解了。现在想重新梳理一下git相关的知识,以便以后更好更透彻的使用它。

        git起源:

      Linus在1991年创建了开源的Linux,,经过二十多年的发展壮大,已经成为最大的服务器系统。

        然后最开始,Linux的合并都是手动完成的。但是后面越来越庞大,怎么办?

        刚开始用的别人家的版本控制系统,后来出现了一些矛盾,别人不给用了,于是 Linus Torvalds自己动手,花了两周,写了最初版本的git。 然后经过多年发展,特别是2008年Github网站的上线,git已经成为最强大的分布式版本控制系统

        集中式是版本都集中存放在一台中心服务器上,每台主机每次要改的时候就得先从中心服务器上先拉下来。改好了之后在放回去。你自己电脑里是没有版本控制系统的。而分布式就是每一台主机都是一个完整的版本库,你可以在自己电脑上不联网也能很好的进行版本控制。再也不用在文件夹看到好多个“XXX-副本.xxx”了(git的强大之处在于:跟踪并管理的是修改,而非文件。)。

        git安装和初始化:

       Windows直接下载安装就好 。Linux的话(Ubuntu)使用如下命令就可以了:  

     sudo apt-get install git

        安装成功后,在需要版本控制的项目目录下使用命令就完成了git的初始化了:

    git init

                        QQ图片20171116104351


        初始化完成之后,会在当前目录下生成一个.git的隐藏文件夹,版本信息就存在里面啦(没事别修改里面内容)。接下来就可以为所欲为了~

        git基本操作

        当你的项目目录下有文件的改动时(增删改),就得添加进git里面,需要用到以下几个命令:

    git add 改动过的文件名
    git commit -m‘改动的原因’

        这样就把改动过的文件信息提交到git啦,在本地仓库里生成了一个新的版本HEAD 后面的字符串就是该版本的版本号。

                            QQ图片20171116105431

        当改动文件多的时候可以使用 git add . 添加所有已改动文件。

        在git中,用HEAD表示当前版本,也就是最新的那个版本。要回退到某个版本只要使用命令:

    git reset --hard 版本号

        就可以回退到指定的版本了。

        然而,第二天发现其实不用回退,而版本已经被回退了,怎么办呢?没关系,使用:


    git reflog

        查看你操作的每次命令,在这里又能看到被回退之前的那个版本的版本号了,好了,再次git reset --hard 版本号,又回来了~

        git远程仓库

        既然式分布式版本控制系统,那就不只能在一台机器上玩。

        要跟远方的朋友一起玩怎么办?

        1.如果本地没有此项目,要从远程把仓库复制一份下来,使用:

    git clone 目标git仓库地址

        2.如果是本地创建的仓库,远程没有,要推到远程仓库,使用:

    git remote add origin 远程空仓库的地址

        把更改推送到远程仓库:

    git push origin master

       但是,要是多个人一起推送到远程仓库,远程有别的仓库的新的更改,你就推不上去了。这时候就要使用命令:

    git pull

        把远程的更改抓取同步到本地,然后就能继续push你新修改的代码了。

        git分支

        git仓库创建的时候,会自动生成一个主分支,就是master.通常情况下,你不需要使用分支,用master一条分支就够了。但是当多人协同任务时,你的工作要一个月才能做完,但是你没做完之前就提交到远程分支的话,系统就不能正常运行了,而别人也没法工作。有了分支,每个人就可以敲自己的代码,而不影响主程序了。到期做完了, 再一次性合并,就万事大吉。

        创建和切换分支:

    git branch dev1 #创建分支
    git checkout dev1#切换分支    

        查看分支:

    git branch

        可以看到master和dev1两个分支。

        现在分支就从主干master切换到了dev1上了,于是就可以在dev1上为所欲为了。这时候在dev1上的各种提交,master上式看不到的,它还在是切换的那个时间点的那个状态。一顿操作之后,再次切换到master主干分支:

    git checkout master

        把dev1分支的内容合并到master:

    git merge dev1

        现在发现master的内容跟dev1一样了,合并成功!然后就可以删除分支:

    git branch -d dev1

        再次查看分支:

    git branch

        只剩下master了。

        git冲突解决

        多人合作,总避免不了修改同一个文件的同一个位置,当发生这种情况的时候,合并就会出现冲突了。当push出现push fail或者merge出现fail的时候,你就需要查看是不是文件发生冲突了,使用:

git status

        查看当前git状态,以及出现冲突的文件。我们打开冲突的文件,看到一些由<<<<<<<=======>>>>>>>标记出冲突分支的内容,这时候需要我们手动把这些冲突部分修改完成,重新提交,这时候就能成功合并了。

        总之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,视你的心情而定!

        git忽略文件:

        很多时候项目目录下有的文件或者目录你并不想加入到git仓库中,比如说第三方库文件,uploads上传文件夹(超级大)。那就需要使用.gitignore了,在,git同级目录下,将你不希望同步到git仓库的文件或者文件夹添加进去,git在add .的时候就会忽略掉它们了。

        git查找错误文件:

        之前在千里码做题,遇到一题关于git的

        有1个由无数python高级工程师维护的巨型python项目,经历了10000次commit。

        很不幸的是,master分支上最新的代码并不能顺利通过unit.py的单元测试(python unit.py)。

        你需要找到一个最近的能通过unit.py单元测试的版本,并进而知道谁是第一个引入bug导致unit.py失败的工程师。

        找出这个工程师的名字?

        人肉去找这个名字的话那就得忙活一会儿了

        还好git给我们提供了一个不用人肉的办法:二分查找,具体请看看git-bisect


标签: : git教程 Git

0 条评论

想说点什么呢