Git学习笔记

引言

Git号称是世界上最先进的分布式版本控制系统,没错玩熟了它你就离高端大气上档次又近了一步。前段时间看实习招聘信息,有些公司都不用去当地办公,只要会Git可以远程完成任务,当时就觉得Git一定要好好学一学,虽然之前弄博客看了一些Git的内容,但当时是单纯的跟着教程去敲的,很多地方都没真正掌握。好记性不如烂键盘,这篇博客是对Git用法的精简,涉及到的都是硬核,便于自己忘了回头查阅,也希望可以帮到其他的初学者。详细的Git手册可以参考Git-Book,这个网站各种语言都有。

Git初识与安装

要它干嘛:

简单地说Git的诞生与一众事物一样,为了进一步解放你的双手。Git让你和队友配合更方便,提供给你们一个协作编辑的平台,并且把你们每次的动作(也可认为是新的版本)信息记录,便于日后分析和版本回退。

怎么获取:

Git对Linux、Mac和Windows都支持,具体步骤就不详述了,因为本人人穷没用过Mac,而且又境界不高,Linux用的不太六。网上安装教程还是很详细的,Windows用户直接去Git官网下载安装。Git官网下载页面

Git里的行话

分布式:

学习任何东西,都得先把这个邻域频繁出场且刺眼的“语料”理解透彻,这决定了你是否可以愉快无痛的把玩它。说到Git就想到了分布式版本控制系统,一分为二,版本控制系统前文已经解释了,那分布式好像字面就能理解,但与版本控制系统连起来读意思又不明确了。与集中式对比理解,集中式是一台中央服务器存了一切版本信息,你和队友电脑里啥也没,因为你们没权限,想用要么局域网要么互联网,与主机建立连接后才能修改,改完后主机又把相关信息存起来了。而分布式就不同了,此时你和队友的电脑都是“中央服务器”,因为你们电脑里都存储着全部的版本信息。你们各自的修改信息可以两两互换,也可以几个人借助一个服务器愉快的交流。再也不怕一台机子熄火全员收工了呢。

仓库:

仓库就是一个目录,目录里的文件动态被Git记录跟踪。一个仓库需要创建和初始化。

1
2
3
4
$ mkdir git_breeze		//创建目录
$ cd git_breeze //打开创建好的目录
$ git init //把目录变为Git可以控制的库
Initialized empty Git repository in L:/git_test/git_breeze/.git/

仓库搞定了,自然要学会往里面放东西、取东西。放东西时可以一次性放一批,逐个文件通过git add 文件名添加。最后通过一条命令git commit -m "写一句概括本次修改的话" 完成入库。

暂存区

在了解暂存区之前,先要知道Git里的工作区。工作区就是你存放在本地硬盘里的Git文件夹信息。当你把工作区的文件修改后,要传到版本库里。在上文仓库中提到了入库两步骤,首先git add此时可以理解为把文件从工作区传到了暂存区。而git commit是把文件从暂存区传到版本库里的分枝master中。

分枝

暂存区中说到,master用来接收暂存区的版本信息。master就是一条分支,这条支线上包含完整的版本历史信息,每个版本就是一个节点。HEAD带表当前版本指向master。在多人协作中为了在不影响他人下又能自己灵活支配Git库存储,一般要自己创建一条像master的分支。待自己的任务完成后再与master分支合并。有时当多个人对同一内容分别更改并同时提交时会有冲突,用$ git status查看冲突位置并做更改。

1
2
3
4
5
6
7
8
9
$ git checkout -b newbra		//创建并切换到新分支newbra
$ git checkout master //切换回master分支
$ git merge newbra //把newbra分支下的动作合并到master分支

//上句默认快速合并,为了分支合并信息受保护,常加参数 --no--ff如下
$ git merge --no--ff -m "此时创建新commit,此处写更改信息" newbra

$ git branch -d newbra //如需删除刚刚创建的newbra分支执行之
$ git branch //实时查看库里的分枝信息

标签

简单的理解就是给一个版本起一个容易念容易写的名字,以后调的话方便一点。

1
2
3
4
5
$ git tag breeze1.0			//在当前分支最新提交的commit打一个标签
$ git tag -a 版本名 -m “描述” 版本commit的id号 //创建有说明的标签
$ git tag breeze1.0 commit的id号 //对一个指定commit打标签
$ git log --pretty=oneline --abbrev-commit //查看历史commit id号
$ git tag //查看所有标签

Git里的雷区

Github与Git

Git、Github一个比一个出名,出名到一部分未入深坑的用户都不知道谁是谁什么关系。Git是分布式版本控制系统。顾名思义一个仓库可以分布到不同主机。但是宗旨是多人协作下多版本管理,为了协作方便自然要有一个大家随时都能存取查改的平台,Github应用而生,为用户提供Git仓库托管,让本地与远程同步。二者的传输通过SSH加密传输。所以要获取SSH Key才能愉快玩耍,获取方法如下。

1
$ ssh-keygen -t rsa -C "你的邮箱"

获取后用户目录下会有.ssh文件夹放了两个密匙一个私匙和一个公匙,私匙要保管好。最后到你Github设置里把密匙输入就OK了。
推送本地仓库到远程Github非常简单。首先你得有一个向前文那样已经$ Git init初始化好的本地仓库。接着在Github里创建一个同名repository。接着网页就提示你怎么做,你只需在本地仓库下的Git Bash里输入网页提示的第二种方法如下。到此你的本地仓库就上传到了你的Github账户里了

1
2
$ git remote add origin https://github.com/你的Github账户名/你的仓库名
$ git push -u origin master

接着逆向思维一下,上面是本地Git上传到远程Github,那么怎么把远程Github克隆到本地Git库里呢。一句搞定。

1
$ git clone https://github.com/你的Github账户名/你的仓库名

Git里的套路

版本信息查改:

1
2
3
4
5
$ git status			//实时查看仓库状态
$ git diff 文档名 //查看文档前后改动的内容
$ git diff HEAD -- 文档名 //查看工作区和版本库里最新版本的区别
$ git log //查看历史提交日志
$ git reflog //查看你敲过的历史命令

以上是常用的查看版本信息的命令,Git的过人之处并不是记录版本信息,而是帮你一次次在各版本间跳跃转换,你可以跳跃回上个版本或任意版本,或是后悔了在撤销此次转换再恢复过来,get reset就是干这个活的,具体的参数如下。

1
2
$ git reset --hard HEAD^			//^数量表示当前版本的前几个,数较大时HEAD~50
$ git reset --hard 版本号 //是的每次修改都有一个对应的版本号可以直接用

上面是版本之间的跳转,当你只提交到暂存区时想回退怎么办呢,又或是刚在工作区修改完想回退怎么办呢?

1
2
3
$ git checkout -- 文档名			//工作区修改撤销
$ git reset HEAD 文档名 //以提交到暂存区的修改撤销,此句撤销到工作区
//还需接着运行上一句一并撤销工作区的修改

文件的删除通常使用$git rm 文件名只有执行了这句才把文件从git版本库里真正删除,直接在目录下(工作区)删除后,版本库里还存在被删除文件的信息。

分支运用

  • bug修复时,用$ git stash把当前进度存储,再运用分支的便利性创建bug分支进行更改。修改完毕后再用$ git stash pop恢复刚才的进度。
  • 把本地写好的分支推送到远程时用命令$ git push 远程库名 本地要推的分支名
  • 常规clone远程库到本地后,只有master分支,想要在其他分支工作需要$ git checkout -b 目标分支名本地 origin/目标分支名远程以此来和远程库分支对应。创建以后还要$ git branch --set-upstream 本地分支名 origin/远程分支名
  • $ git pull从远程抓取分支提交信息,用于本地分支推送失败时排查冲突。