Git是一个免费的、分布式的版本控制工具,最初应用在Linux上的,现在Windows下也可以使用而且Windows下有图形用户界面(GitHub for Windows)操作更简单更容易上手;GitHub是一个基于Git的项目托管平台,它提供了Web界面,你可以在上面创建资源仓库来存放你的项目。
Git与SVN的区别
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。
理解相关概念
1、工作区(Working tree)
实际项目所在的目录,每当你在代码中进行了修改,working tree的状态就改变了。
2、版本库(Repository)
工作区有一个隐藏目录.git,这个不属于工作区,是版本库。其中版本库里面存了很多东西,其中最重要的就是Stage(暂存区,也叫缓冲区),还有Git为我们自动创建了第一个分支master,以及指向master的一个指针HEAD(指向最近一次提交后的版本)。
3、暂存区(Stage)
Git需要将代码的变化显示与下一次提交进行关联。举个例子,如果你修改了一个文件,然后想将这些修改进行提交,必须将这个文件提交到暂存区,通过git add file命令。这样暂存区可以保存所有变化的快照。
常用操作
1、创建版本库
第一步,选择合适的位置,创建一个空目录,mkdir命令用于创建目录,pwd命令用于显示当前命令;
第二步,通过git init命令把这个目录变成Git可以管理的仓库。
2、文件添加至版本库
第一步,在工作目录中新建文件,例如(test.cpp),使用命令git add test.cpp添加到暂存区;
第二步,使用命令git commit -am告诉Git,把文件提交到仓库,此外,可以使用命令git status查看未被添加到暂存区或者未被提交的文件。
3、修改文件
第一步,修改文件中(test.cpp)中的内容,例如加入一行代码,继续使用命令git status查看下结果,结果显示test.cpp已被修改,但是未提交的修改;
第二步,接下来,想看看test.cpp文件到底修改了什么内容,可以使用git diff test.cpp查看具体的修改内容。
4、撤销修改
第一种情况,当你修改了工作区的某个文件,但未添加到暂存区时,可以使用git checkout -- file 命令,来实现丢弃工作区的修改;
第二种情况,当你修改了工作区的某个文件,并添加进暂存区时,想丢弃修改,分两步,第一步使用命令git reset HEAD file使修改回到工作区,第二步使用命令git checkout -- file命令彻底丢弃修改。
5、撤销某次操作(提交)
撤销某次操作,可以使用git revert HEAD 或 SHA(版本号),撤销前版本或者某个版本的修改,此次操作之前的commit都会被保留;
撤销某次提交,可以使用git reset HEAD ~1或 SHA(版本号),撤销前版本或者某个版本的提交,此次操作之后的所有修改都会被退回到暂存区;
6、版本回退
第一步,使用git reset --hard HEAD~1 或者 SHA(版本号)命令,使当前版本回退到上一版本或者指定版本;
第二步,现在你回退到了某个版本,后悔了,想恢复到新版本,使用git reflog获取新版本的commit id,再使用git reset --hard commit id回退到新版本。
7、删除文件
第一种情况,使用git rm file删除文件,并使用git commit进行提交;
第二种情况,删除文件后,发现删错了(此时未提交),想要取消删除,第一步使用命令git reset HEAD file使删除的文件回到工作区,第二部使用命令git checkout -- file命令彻底删除操作。
8、远程仓库
在了解之前,先注册github账号,由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以需要一点设置:
第一步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果有的话,直接跳过此如下命令,如果没有的话,打开命令行,输入如下命令:ssh-keygen -t rsa –C ”,运行完此命令后,本地.ssh目录中会新增id_rsa和id_rsa.pub这两个文件,其中id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心大胆地告诉任何人。
第二步:登陆GitHub网站,打开“Setting”中的SSH Keys页面,然后点击“Add SSH Key”,填上任意title,在Key文本框里黏贴id_rsa.pub文件的内容。
点击 Add SHH Key,你就应该可以看到已经添加的key。
8.1 添加远程仓库
现在的情景是:我们已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且希望这两个仓库进行远程同步,这样GitHub的仓库可以作为备份,又可以其他人通过该仓库来协作。
第一步,登录GitHub上,然后在右上角找到“create new reporsity”创建一个新的仓库。如下:
在Repository name填入learngit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
第二步,在GitHub上的这个learngit仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。下面,我们根据GitHub的提示,在本地的learngit仓库下运行命令:git remote add origin , 把本地仓库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样:
从现在起,只要本地作了提交,就可以通过如下命令:
git push origin master
把本地master分支的最新修改推送到github上了,现在你就拥有了真正的分布式版本库了。
8.2 从远程库克隆
上面我们了解了先有本地库,后有远程库时候,如何关联远程库。现在我们想,假如远程库有新的内容了,我想克隆到本地来,如何克隆呢?
第一步,登录GitHub,创建一个新的仓库,名字叫learngit2.如下:
第二步,使用命令git clone克隆一个本地库了。如下所示:
接着在我本地目录下生成learngit2目录了,如下所示:
9、创建与合并分支
每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
第一步,创建dev分支,然后切换到dev分支上,其中git checkout命令加上-b参数表示创建并切换,相当于如下两条命令:
git branch dev
git checkout dev
第二步,在dev分支中,修改test.cpp,在末尾加一行777777,切换到master分支,修改test.cpp,在末尾加一行666666。
第三步,切换到master分支,使用git merge dev命令,将dev分支合并到master上。
第四步,会发现,合并之后,产生了冲突,使用git status命令查看冲突文件,其中,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,其中<<<HEAD是指主分支修改的内容,>>>>>dev 是指dev上修改的内容,最后,修改冲突代码段之后,进行保存。
第五步,合并完成后,我们可以接着删除dev分支了,操作如下:
Git常用命令
命令 | 功能说明 |
---|---|
mkdir | 创建一个空目录 |
pwd | 显示当前目录路径 |
cat XX | 查看XX文件的内容 |
git init | 把当前的目录变成可以管理的git仓库,生成隐藏.git文件 |
git log | 显示各版本信息,其中,page up and down键可以翻页,q键退出版本信息列表 |
git status | 查看仓库状态 |
git add XX | 把xx文件添加到暂存区去,git add .是把所有修改的文件添加到暂存区 |
git commit –m “XX” | 提交文件,"XX”是注释 |
git diff XX | 查看XX文件修改了哪些内容 |
git reset --hard HEAD~n | 回退到上面第n个版本 |
git checkout -- XX | 把XX文件在工作区的修改全部撤销 |
git rm XX | 删除XX文件 |
git remote add origin XX | 关联远程仓库XX |
git push –u origin master | (第一次要用-u 以后不需要) 把当前master分支推送到远程库 |
git clone XX | 从远程仓库XX克隆 |
git checkout –b XX | 创建XX分支 并切换到XX分支上 |
git branch | 查看当前所有的分支 |
git checkout XX | 切换到XX分支 |
git merge XX | 在当前的分支上合并XX分支 |
git branch –d XX | 删除XX分支 |
git branch XX | 创建分支XX |
git push origin master | 把master分支推送到远程库对应的远程分支上 |