一、简介
在介绍git操作命令之前,我们先来了解一段故事!
很多人都知道,Linus 在1991年 创建了开源的Linux操作系统,此后的三十多年里,Linux 系统不断发展,已然成为全世界最大的服务器系统软件了。
Linus 虽然创建了Linux操作系统,但是Linux操作系统的壮大是得益于全世界热心的志愿者参与的,这么多人在世界各地为Linux操作系统编写代码,那Linux操作系统的代码是如何管理的呢?
在 2002 年以前,世界各地的志愿者把源代码文件通过diff的方式发给 Linus,然后由 Linus 本人通过手工方式合并代码!
不过,到了 2002 年,Linux操作系统已经发展了十年了,代码库之大让 Linus 很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满。
可能有的同学会发出疑问,不是有 CVS、SVN 这些免费的版本控制系统吗?为什么不用它们来托管Linux操作系统代码?
因为 Linus 本人坚定地反对 CVS 和 SVN,原因是这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。
于是 Linus 选择了一个商业的版本控制系统 BitKeeper,BitKeeper 的东家 BitMover 公司出于人道主义精神,授权 Linux 社区免费使用这个版本控制系统。
随着 Linux 社区对 BitKeeper 版本控制系统的深度了解,原本安定团结的大好局面在 2005 年被打破了,原因是 Linux 社区牛人众多,一名叫 Andrew 的开发者把 BitKeeper 商业授权协议破解了(这么干的其实也不只他一个),之后被 BitMover 公司发现了(监控工作做得不错!),于是 BitMover 公司怒了,要收回 Linux 社区的免费使用权。
Linus 向 BitMover 公司道了歉,保证以后严格管教弟兄们,嗯,想要别人不破解,这其实是不可能的。
之后,Linus 花了两周时间自己用 C 写了一个分布式版本控制系统,这就是我们今天要介绍的 Git!(牛人是怎么定义的,大家可以自行体会一下)
一个月之内,Linux 系统的源码已经由 Git 管理了!
之后的事情,想必估计都知道,Git 迅速成为全世界最流行的分布式版本控制系统,在代码托管方面,基本上是一骑绝尘!
尤其是 2008 年,GitHub 网站上线了,它为开源项目免费提供 Git 存储,无数的开源项目开始迁移至 GitHub,包括 jQuery、PHP、Ruby等等!
说了这么多,Git 是一款什么样的软件?和 CVS、SVN 这些免费的版本控制系统有什么区别呢?
上文中我们也说到了,Git 其实是一款分布式的版本控制系统,可能你还是不太理解什么叫分布式,我们先聊聊什么是集中式!
集中方的版本控制系统,简单的说,就是当你要干活的时候,用的一般都是自己的电脑,首先要从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。
集中式版本控制系统,好处就是统一管理,但是坏处也很明显,必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。
分布式版本控制系统,与集中式版本控制系统最大的不同就是:没有中央服务器这个东西。
每个人的电脑上都是一个完整的版本库,可以说每个电脑都是中央服务器,当你工作的时候,不需要联网,可以直接提交工作的内容,如果对方的电脑想要知道你的工作内容,你只需要把对应的工作文件推送过去就可以,对方就可以看到,其他不相关的文件不需要推送给对方!
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
既然git这么受欢迎,下面我们就开始git的学习之旅吧!
二、安装 GIT2.1、在 Linux 上安装 Git
如果你当前的电脑操作系统是 Linux,安装起来会非常简单,首先试着输入git,看看系统有没有安装Git:
$gitTheprogram’git’iscurrentlynotinstalled.Youcaninstallitbytyping:sudoapt-getinstallgit
像上面的命令,有很多 Linux 会友好地告诉你 Git 没有安装,还会告诉你如何安装 Git。
按照提示,输入如下命令,即可安装git!
sudoapt-getinstallgit2.2、在 Mac OS X 上安装 Git
如果你正在使用 Mac 做开发,有两种安装 Git 的方法!
一是安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/。
第二种方法更简单,也是推荐的方法,就是直接从AppStore安装Xcode,因为Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单Xcode->Preferences,在弹出窗口中找到Downloads,选择Command Line Tools,点Install就可以完成安装了。
Xcode是Apple官方IDE,功能非常强大,是开发Mac和iOS App的必选装备,而且是免费的!
2.3、在 Windows 上安装 Git
在Windows上使用Git,就比较傻瓜式了,可以从Git官网直接下载安装程序,然后按默认选项安装即可。
安装完成后,在开始菜单里找到Git->Git Bash,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
以上全部安装完成后,还需要最后一步设置,在命令行输入:
三、GIT 操作手册
在上文中,我们对git的安装进行了一些简单的介绍,等环境准备完成之后,我们就可以开启GIT之旅!
3.1、配置管理
同样可以用如下的命令,进行修改!
同时,还可以通过如下命令查询配置
#查看当前配置gitconfig–list
如果你配置的仓库,用户和密码填错了,可以通过如下命令方式清除,然后重新配置!
gitconfig–system–unsetcredential.helper3.2、版本管理
版本库管理是GIT最重要的核心模块,具体操作如下!
当你想向GIT里面提交一个文件的时候,首先需要初始化一个版本库
#初始化一个版本库gitinit
然后,可以通过如下命令,添加或者修改一个的指定文件!
#添加或者修改一个的指定文件gitadd<文件名>
当然,你还可以通过如下命令,添加当前目录下全部的文件!
#添加或者修改的所有文件gitadd–all
添加完成之后,还需要提交文件,命令如下
#提交文件gitcommit-m<注释>
例如,提交所有的内容提交到版本库!
#例如,提交所有的文件添加修改提交到版本库gitcommit-m”注释内容”
有些时候,我们需要通过一下命令,查询当前工作区的信息。
比如,查看当前工作区的状态,这个基本上经常用到!
#查看当前工作区的状态gitstatus
查询当前版本库的历史提交日志纪录,这个会在版本回滚的时候用到!
#查看历史日志gitlog#查看精简日志gitlog–pretty=oneline
查看当前文件的内容!
#查看文件内容cat<文件名>
查看历史提交的命令!
#查看历史提交的命令gitreflog
查看文件修改内容!
#查看当前文件修改内容gitdiff<文件名>
查看工作区和版本库里面最新版本的区别!
#查看当前文件和版本库里面最新版本的区别gitdiffHEAD–<文件名>
如果你想将当前文件回滚到历史上某个时间点提交的文件,可以通过如下命令!
#首先查询你要回滚到历史上某个时间点的版本IDgitlog–pretty=oneline#然后通过如下命令,进行回滚操作gitreset–hard<版本id>
当你修改了某个文件,但是没有提交,想要回滚,怎么处理呢?可以通过如下命令进行撤回!
#撤销某个文件的修改gitcheckout–<文件名>
如果你想全部撤销,可以通过如下命令撤回全部!
#撤销所有修改gitcheckout.
当然,如果你不想要某个文件了,可以通过如下方式删除!
#删除指定文件gitrm<文件名>3.3、分支管理
GIT的分支管理,非常强大,也是它远胜 CVS、SVN 这些免费的版本控制系统一大神器!
GIT在初始化版本库的时候,会默认创建一个master分支,也就是主干分支!
如果你想创建某个分支,可以通过如下命令创建!
#创建分支gitbranch<分支名>
比如,创建一个develop分支!
gitbranchdevelop
当执行这个命令之后,GIT的develop分支指针会指向到当前分支当前位置!
怎么切换到分支呢?我们可以通过git checkout命令,实现分支的切换!
#切换分支gitcheckout<分支名>
当然,你还可以一步到位,通过如下命令,创建并切换分支!
#创建分支 切换分支gitcheckout-b<分支名>
通过下面这个命令,可以查询当前分支!
#查看当前分支gitbranch
如果分支切换失败,可以通过git status命令查询一下为什么会失败,分支切换失败多半是当前工作区的代码没有提交到版本库里面导致,可以检测一下是不是代码都提交到本地版本库!
在平时的开发过程中,我们会经常碰到需要合并分支,比如将develop分支合并到master分支,怎么处理呢?
可以通过如下命令,实现快速合并!
#快速合并分支gitmerge<分支名>
在合并的时候,可能会出现文件发生冲突的情况,如果出现,就排查修改文件,然后提交!
当然,你还可以通过如下命令,来实现分支合并提交!
#普通模式合并分支 提交gitmerge–no-ff-m”mergewithno-ff”<分支名>
如果某个分支,你不想要了,想删除,可以通过如下命令实现!
#删除分支gitbranch-d<分支名>
如果删除过程中,出现报错,可以下面这个命令,强行删除!
#强行删除分支gitbranch-D<分支名>
最后,你可以通过下面这个命令,查询当前版本分支的变动情况!
#查看分支合并图gitlog–graph3.4、标签管理
标签管理,也是git最最核心的功能!通过标签,我们可以很快的定位到仓库中某个版本,并进行代码回滚!
可以通过如下命令创建某个标签,比如v1.0标签。
#创建标签gittagv1.0
查看标签情况
#查看所有的标签gittag
如果你想看某个标签,具体的详情,可以通过如下命令!
#查看标签信息gitshow<标签名>
如果你不想要了,可以通过如下命令,删除标签!
#删除标签gittag-d<标签名>
当然,如果你想针对某个历史版本,打标签,可以通过如下方式实现!
#查看历史版本idgitlog–pretty=oneline–abbrev-commit#对某个版本ID,打上标签,名称v0.9gittagv0.9<版本id>
我们还可以将标签推送到远程分支,命令如下:
#推送全部标签到远程库gitpushorigin–tags
删除远程标签库
#删除本地标签gittag-dv0.9#推送到远程分支gitpushorigin:refs/tags/<标签名>3.5、忽略文件管理
GIT还为我们提供了一个巨大的利器,我们可以通过配置忽略文件,将当前目录中某些文件忽略掉,不提交到版本库里面,具体怎么操作呢?
首先在当前版本库根目录下,创建一个.gitignore文件,内容自己定义,比如下面这个内容,就是小编定义的忽略文件,/target/!.mvn/wrapper/maven-wrapper.jar###STS###.apt_generated.classpath.factorypath.project.settings.springBeans.sts4-cache###IntelliJIDEA###.idea*.iws*.iml*.ipr*.class###NetBeans###/nbproject/private//nbbuild//dist//nbdist//.nb-gradle//build/###mac###.DS_Storefile/logs/*/targettarget/
然后,执行如下命令,让忽略文件生效!
#清除缓存gitrm-r–cached.#添加所有文件gitadd.#提交到版本库gitcommit-m”update.gitignore”#提交到远程分支(如果有的话)gitpush3.6、远程仓库管理
以上介绍的基本上都是本地仓库的操作,如果我们需要与其他的电脑协助工作,怎么处理呢?
如果我们本地没有仓库,我们可以直接从远程分支里面拉取一个版本库同步到本地,命令如下。
#从远端服务器创建主分支gitclone<url>
我们可以通过如下命令,查询远程分支的详情
#查看远程库gitremote-v
如果你是通过git init方式初始化了本地仓库,想与远程分支关联,可以通过如下命令实现!
如果你填写错了,想删除,可以通过如下命令删除,再重新添加!
如果你之前没有推送内容到远程库,可以通过如下命令推送
#首次推送到远程库并创建分支gitpush-uorigin<分支名>(第一次将内容推送到master分支)
后期推送到远程分支,可以这样操作
#后期推送到远程分支gitpushorigin<分支名>#可以简写,快速推送gitpush
有时候,我们还需要查询远程分支的情况,可以通过如下命令操作:
#查看远程的所有分支gitbranch-a
有时候,我们还需要从远程服务器拉取某个指定的分支到本地,可以通过下面这个命令完成:
#从远程服务器拉取某个指定的分支到本地,并创建分支gitcheckout-b<分支名>origin/<分支名>
大部分的情况下,当远程服务器更新了版本库,通知我们也要更新时,通过如下方式,即可将远程的版本库最新的内容同步到我们本地电脑版本库里面。
#拉取远程分支内容,并同步到本地版本库gitpull
有时候,需要设置本地分支与远程分支的链接,可以通过下面这个命令完成:
#设置本地分支与远程分支的链接gitbranch–set-upstreamdevorigin/dev
有时候,我们需要删除没有untracked的文件,可以通过下面这个命令完成:
#删除没有untracked的文件gitclean-d-xf3.7、冲突处理
版本同步的时候,如果大家都修改了同一个文件,难免会发生冲突。
比如,当修改的文件未提交,直接远程拉取代码会发生冲突,改怎么办呢?
可以这样处理
#先将本地修改存储起来gitstash#暂存了本地修改之后,就可以pull了gitpull#还原暂存的内容gitstashpopstash@{0}
此时系统会提示如下类似的信息:
Auto-mergingc/environ.cCONFLICT(content):Mergeconflictinc/environ.c
意思就是系统自动合并修改的内容,但是其中有冲突,需要解决其中的冲突。
然后打开冲突的文件,进行修改,修改完毕之后,执行如下命令进行提交!
gitadd.gitcommit-m”注释”gitpush
当然,还可以进行强制更新操作,覆盖本地代码,命令如下!
#下载远程库内容gitfetch–all#不做任何的合并,gitreset会把HEAD指向刚刚下载的最新的版本gitreset–hardorigin/master四、与服务器建立 ssh 连接
git中电脑与电脑之前的连接,支持的模式有两种:HTTP和SSH,其中HTTP的传输会比较慢,才能SSH方式进行互推,效率会非常高!
因此,在实际的使用过程总,推荐使用SSH模式与远程服务器建立连接!
例如与GitHub的连接,具体的操作配置方式如下!
4.1、创建 SSH Key
在当前电脑用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可以直接跳过。
如果没有,打开Shell(Windows下打开Git Bash),创建 SSH Key:
ssh-keygen-trsa-C”youremail@example.com”
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是 SSH Key 的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
4.2、将公钥配置到服务端
登陆 GitHub,打开Account settings,SSH Keys页面:
然后,点Add SSH Key,填上任意Title,在 Key 文本框里粘贴id_rsa.pub文件的内容:
点Add Key,你就应该看到已经添加的 Key !
至此,本地与远程服务器的连接配置已经完成,剩下的就是直接远程服务器拉取代码,然后提交的时候git push就可以了!
五、小结
本文主要围绕GIT的背景和常用的操作命令做了一些介绍,可能有些地方介绍的比较粗陋、不完美,希望老铁们能批评指出!
六、参考
1、廖雪峰 – GIT 教程
-End-
最近有一些小伙伴,让我帮忙找一些面试题资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!
好文分享给更多人↓↓