Git,是一个分布式版本控制软件。最初本是为了更好的管理Linux内核开发而被林纳斯·托瓦兹开发,后来由于项目开发中版本控制的强烈需求,而git也日趋成熟,最终成为了一个独立的版本控制软件。css
创建远程仓库,说得白话一点就是在代码托管服务器上给我分配一片可远程访问的空间。其实跟git的使用没有直接的关系,可是为了更好的说明问题,咱就稍微啰嗦下。git
目前支持git的代码托管服务不少,名气最大的莫过于Github,其余还有GitLab、Bitbucket、CSDN-CODE、Git@OSC等等。咱们先来讲说为何须要代码托管服务器,不管咱们开发的是我的项目仍是团队项目,从长远来看,将代码托管到远程服务器上都是比较好的选择。理由很容易想到:github
基于以上代码托管服务器,创建一个远程仓库很是简单,以Github为例,打开https://github.com首页登陆进去后,页面右上角有一个“+”图标,鼠标点上去就看到如图所示的样子:bash
点击红框标示的那个链接,而后填写关键信息,根据提示就建立好了。服务器
本地代码库,其实就是咱们的代码目录,若是非要区别普通代码目录和git仓库目录,那就是基于git的代码目录里面会多一个.git
的目录,这个目录通常是不可见的。如何将一个普通代码目录变成git工做目录,其实很简单。咱们可使用cmd
、git bash
或任何一个命令行工具,进入工做目录,而后运行下面这行代码就能够了:网络
git init
当本地仓库初始化好后,其实咱们已经可使用git工做了,好比将代码文件添加到版本记录,建立本地分支,合并本地分支代码等等。编辑器
若是仅仅使用git在本地捣鼓,那么咱们上面提到的远程代码托管的优点就彻底没有意义了,因此咱们要把咱们的本地仓库和远程仓库绑定起来,这里就要分状况了。分布式
若是是如今本地已经开发的一个全新项目须要推送到远程仓库,你须要先这么作:ide
git remote add origin https://github.com/username/project.git
若是是在别人已经开发过的仓库中继续开发,咱们不须要预先创建并初始化本地仓库,直接执行下面这条命令就能够了:工具
git clone https://github.com/username/project.git
当咱们已经拥有一个本地git仓库或对咱们的项目进行了修改后,咱们可能火烧眉毛的想看看咱们项目中各个文件的当前状态,咱们只需在git bash
中执行:
git status
一般状况下,咱们可能看到一堆红色标记的列表,包括如下信息:
若是是一个全新仓库,咱们只能看到Untracked files项。
当咱们经过git status
看到有红色文件列表,并且其中有咱们想要保存到远程仓库中的文件时,咱们可经过git add <filename>
命令,将相应文件添加到暂存区,咱们也能够经过git add .
命令,添加全部新增或有更新的文件,但这里要注意删除的文件不会被添加。
添加删除的文件须要使用git add -u <filename>
或git add -u .
命令。
接下来咱们还须要执行一个命令git commit
,才能将添加的文件(变化)提交到暂存区。这个命令的用法也有几种,常见的是直接执行git commit -m 'log info'
,还有一种是执行git commit
打开指定编辑器,编辑好日志后关闭编辑器便可,通常用于日志内容比较多的状况。
在实际开发过程当中,咱们须要考虑代码的稳定性,未通过测试的代码不能发布到线上环境。这就意味着咱们若是咱们一直在一个分支上开发代码是很危险的,一步留神就可能把有bug的代码提交到了远程仓库,形成没必要要的麻烦,因此通常状况下使用版本控制器,咱们都会使用它的分支功能。即开发分支、主干分支,当开发分支上的代码测试稳定后,再合并到主干分支,将主干分支提交到远程仓库,这样出错的几率就下降了不少。
使用git bash
能够很方便的创建分支,咱们只需执行git branch newbranch
便可建立一个名为newbranch
的分支,而后咱们只需执行git checkout newbranch
命令,便可将咱们的工做环境切换到newbranch
分支上。
还有一种更为简便的方法,能够直接使用checkout命令,完成建立并切换到分支:
git checkout -b newbranch
前面咱们提到了,当开发分支上的代码测试稳定后,咱们就能够合并到主干分支上,并提交到远程仓库。那么如何合并两个分支的代码成了一个问题。难道要对比两个文件的差别,一行一行的copy代码?显然git不会这么笨,它是很智能的,咱们只需简单的运行一条命令便可完成代码自动合并。咱们设想开发分支(newbranch)将被合并到主干分支(master)上,那么首先咱们要先将开发分支的代码提交到暂存区,而后切换到主干分支,最后执行合并操做,完整的操做流程大体以下:
git add . git commit -m 'newbranch 上的变更内容' git checkout master git merge newbranch
可是,咱们在合并代码的时候,特别是多人开发的时候,偶尔出现冲突(两我的同时改动了同一个地方)也是在所不免的,这种状况,我么恐怕就须要人肉解决下了。不过问题不大,git将文件冲突的地方都会以特殊的形式标明的。
# 冲突示例 <<<<<<< HEAD aa # 当前分支上的内容 ======= bb # 被合并分支上的内容 >>>>>>> nb
当开发分支上的代码都被合并到主干分支上,而且全部的冲突都解决好后,咱们就能够将主干分支的代码推送到远程仓库,提供给别人使用了。这一步很简单:
git push origin master
还记得咱们执行git remote add
后面的origin
吗?这里和那里是同样的哦,而最后那个master
就是分支名称了。若是远程已经有该分支,便会先检查远程仓库在最近一次更新以后发生过更改,若是有会提示先进行更新代码,而后再提交。若是未变更过,本地代码则会直接提交至远程代码仓库。
然而,通常状况下,咱们在执行git push
以前,都会先更新一次远程仓库中的内容:
git pull origin master
这里咱们须要注意一下,和git merge
命令同样,pull命令是有可能致使代码冲突的。而pull命令从某种意义来说实际和fetch+merge
命令同样,这里就再也不对fetch作进一步说明了。
一般咱们在开发过程当中涉及的文件比较多,修改的地方也比较多,当咱们须要提交代码的时候,每每想不起来咱们修改了哪些内容,哪些问需被提交。这时候咱们可能但愿能查看一下在前次提交代码以后咱们对本地仓库所作的改动,那么你能够这么作:
git diff
查看working tree和index file的差异,也能够:
git diff --cached
查看index file与commit的差异,还能够:
git diff HEAD
查看working tree和commit的差异。
diff命令的使用,大体就是这个样子,她们之间的细节差别,能够经过网络查找更详细的说明,也能够在实际使用中本身去观察,这里就不作赘述了。
当咱们的项目开发到必定阶段后,也许偶尔就发现该版本的升级存在问题,须要临时将项目恢复到上一个稳定版本。可是,人肉的将升级代码改回去,显然是不现实的,更科学的解决方法是使用git的reset命令:
git reset --hard commitId
将本地仓库代码回滚到commitId对应的版本,或者:
git reset --hard HEAD~number
将最近number次的提交进行回滚,number为一个整数。那么问题来了,当咱们须要回滚到指定版本的时候,commitId从何而来?咱们怎么知道哪一个commit是最近的稳定版本?
说到这里,就该log命令出场了。咱们可使用log命令,查看仓库的提交历史,以及每一个提交的更改日志,甚至更改的内容,其最基本的用法以下:
git log -2 # 查看最近两次的提交历史 git log # 默认会输出全部的提交历史,最近的在最上面
咱们能够根据日志内容,找到响应的稳定版本代码的commitId,而后再使用reset命令进行代码恢复。怎么样,是否是很强大?可是笔者要告诉你的是,reset和log命令很是强大,参数也比较多,特别是log命令,上面仅仅列举了最最基本的使用方法,若是读者还想了解更多,更深刻的东西,还须要翻看更多,更全面的资料学习。因为笔者能力有限,且考虑到篇幅问题,就再也不啰嗦了。
tag命令,是用来给咱们的代码库打标签的。听起来可能有些不太理解,其实平常使用中,一般是用来添加版本标记。
git tag v1.0.0
代表在这里咱们发布了1.0.0版本。这样就能够很方便的让咱们回顾项目每一个版本的样子,历史就是这样用血写成的。咱们也能够经过tag命令查看已有的标签,只须要执行:
git tag
这样就好了。
Git已然很是强大,并且git的命令也已经很是简洁明了。可是,开发者们每每但愿使用工具的同时能保留本身的个性,但愿能符合本身的操做习惯。好比笔者就嫌checkout命令太长了,虽然各类自动补全,但用起来仍是以为不顺手,那么有没有什么办法能够再简洁些呢?答案是确定的。下面给你们列出笔者的缩写配置,固然也是曾经参考了不少网上大牛们的教程的。
git config --global alias.st status git config --global alias.br branch git config --global alias.co checkout git config --global alias.ci commit
配置好后再输入git命令的时候就不用再输入一大段了,例如咱们要查看状态,只需:
git st
是否是很方便?这里只列了一些最为简单的配置,以抛砖引玉,更多更高大上的配置,就待读者深刻挖掘了。
Git是一款很是强大的分布式版本控制工具,掌握git的使用,可让咱们在工做中如虎添翼。本文仅仅在笔者能力范围以内列举了最基本的使用方法,若有不当之处,欢迎读者朋友们热心指正。若有兴趣,推荐阅读:
做者博客:百码山庄