集中式VS分布式
CVS及SVN都是集中式的版本控制系统,版本库是集中存放在中央服务器,你开始一个项目时要先从中央服务器取得最新的版本,然后开始修改代码,修改之后再把自己的代码推送到中央服务器。
Git是分布式版本控制系统,没有“中央服务器”,每个人的电脑上都是一个完整的版本库,没有主次之分,工作的时候,不需要联网,因为版本库就在自己的电脑上。
你在自己电脑上改了文件A,你同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务的作用仅仅是用来方便“交换”大家的修改,没有这个服务器也能正常工作。
安全性:分布式版本控制系统的安全性跟高,因为每个人电脑里都有完整的代码库,一个人的电脑坏了,随便从他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,就无法继续正常工作了。
Git安装
在Linux上安装Git
可以使用安装包管理工具(apt-get、yum 等)进行安装,或者源码安装…不赘述
我们使用的测试服务器上已经统一安装好了git,通过git --version可以看到当前版本
在Windows上安装Git(Mac平台上安装…略)
在Windows上使用Git,可以从Git官网:https://git-scm.com/downloads直接下载安装程序,然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“Git Bash”,跳出一个类似命令行窗口的东西,就说明Git安装成功!
Git工作原理
工作区(Working Directory)
dengjie01@YWQSH-L1115 MINGW64 / 是个工作区,就是在电脑里能看到的目录
暂存区(stage, 或index)
一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)
版本库(Repository)
工作区有一个隐藏目录.git(ls –a可以看到)是Git的版本库。
比如d盘下的xuexi文件夹,通过git init把这个目录变成git可以管理的仓库,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
Git会自动创建第一个分支master,以及指向master的一个指针HEAD
把文件往git版本库里添加有两步:
第一步是用git add把文件添加进去,可以分步把多个文件添加,实际上就是把文件添加到暂存区
第二步是用git commit提交更改,git commit -m ‘修改了啥玩意’,实际上就是把暂存区的所有内容提交到当前HEAD指向的分支。-m 后面输入的是本次提交的说明,方便从历史记录里找到改动记录。
比如在xuexi下修改了readme.txt,并且新添加LICENSE,此时工作区的状态:
readme.txt被修改了,而LICENSE还从来没有被添加过,所以它的状态是Untracked
使用命令git add readme.txt LICENSE之后,用git status再查看一下:
所以git add就是把所有把要提交的所有修改放到暂存区
最后执行git commit就可以一次性把暂存区的所有修改提交到当前分支
Git常用命令
文件本身
git status 可以查看工作区的状态
git diff file 可以看出某文件修改的内容
git log 显示从最近到最远的提交日志 加上--pretty=oneline 可以一行行简单显示
git rest --hard commit_id 回退到某个版本
回退到上一个版本 //git rest --hard HEAD^ 回退到上上个版本 //git rest --hard HEAD^^
git relog 查看命令历史
git checkout -- file //放弃工作区的修改,有两种情况:1.文件修改后没有放到暂存区,撤销修改就回到和版本库一样的状态 2.文件已经放到暂存区,又作了修改,撤销修改就回到添加到暂存区后的状态
git reset HEAD file //把暂存区的修改撤销,重新放回工作区
git rm file //用于删除某文件
Git分支管理
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name> git branch -D <name> 强行删除
Git把每次提交串成一条线,这条线就是主干分支,master指向最新的提交,HEAD指向master,就能确定当前分支,以及当前分支的提交点。
若新建一个分支dev, 此时相当于新建一个指针叫dev,指向和master相同的提交,再把HEAD指向dev,表示在当前分支dev上。
之后,对工作区的修改和提交就是在dev上
比如新提交一次后,dev指针往前移动一步,而master指针不变
dev分支工作完成了,把dev合并到master分支。切换到master分支,HEAD此时指向master,使用命令git merge dev,直接把master指向dev的最新提交,完成合并。
这是快速合并模式,删除dev分支后,看不出哪些提交是通过分支完成的
非快速合并模式,使用命令git merge --no-ff -m "普通模式合并" dev -m添加本次分支合并的描述
若合并分支时有冲突,即master分支和当前分支都对某文件都有提交,需要手动解决冲突,再合并。
git log --graph //可以看到分支合并图
远程仓库的默认名称是origin,查看远程库信息:git remote -v (可以看到fetch和push的origin地址)
在本地创建和远程分支对应的分支:git checkout -b branch-name origin/branch-name
推送分支:git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交
抓取远程分支:git pull (pull=fetch+merge)
如果git pull失败,原因是没有指定本地dev分支与远程origin/dev分支的链接,使用git branch --set-upstream branch-name origin/branch-name
如果git pull有冲突,需要手动解决,解决后,提交,再push
git pull origin branch-name 拉取指定分支代码合并到当前分支
Git pull冲突主要情况:
1.本地分支文件被自己在测试环境修改了,和远端分支文件不一致 git checkout -- file 放弃自己在工作区的修改,再 git pull
2.本地分支和远端分支都对同一个文件进行了 不知道怎么改代码解决冲突,只能git reset --hard oringin/branch-name 将本地HEAD指向最新下载的分支(这个在完全舍弃本地的情况下是万能的)
要及时用git status分析报错冲突的原因是啥
Git远程库
如果你想通过 Git 分享你的代码或者与其他人合作。 你就需要将数据放到一台其他人也能够连接的服务器上。Github就是这样一个免费存放的服务,当然也可以自己在linux系统上搭建一个git服务器,然后配置好相关配置文件…(自行百度)
Github网站是提供Git仓库托管服务的,只要注册一个Github账号,就能免费获得Git远程仓库。
本地Git仓库和Github仓库之间传输是通过SSH加密,如何连接?
第1步:创建SSH Key。打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C youremail@example.com (Github注册邮箱)
在用户主目录下,会生成.ssh目录,下有id_rsa(私钥)和id_rsa.pub(公钥)这两个文件
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。(允许添加多个Key)
为了验证是否成功,输入以下命令:$ ssh -T git@github.com
下图说明已经成功连上Github
1.先有本地库,后建远程库与之关联
新init一个本地仓库xuexi,下面有11.txt文件
然后登陆GitHub,在右上角找到“Create a new repo”按钮,创建一个新的仓库xuexi
将这两个仓库进行关联起来,就能进行远程同步了。远程库是空的,加上-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,之后的推送操作就可以不用加-u
推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样:
之后,只要本地做了修改提交,就可以通过命令:git push origin mster,把本地master分支的最新修改推送至GitHub远端库
2.先有远程库,再克隆到本地
假设研发在Github上新建了一个远程库mushroom,远程库准备好了,下一步是用命令git clone克隆一个本地库
可以使用git clone git@github.com:Derdai/mushroom.git 后面接需要存放的路径
执行成功后,cd mushroom目录,可以看到远端库的内容
实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https协议。所以还可以git clone https://github.com/Derdai/mushroom.git 同样能把远端库克隆下来
公司内部可能只开放http端口,无法使用ssh,所以一般我们在测试环境克隆远程mushroom node库的命令是:
git clone http://xxx:xxx@xxxx/game_mushroom.git
SoureTree客户端拥有可视化界面和完整的git功能,可从官网下载:https://www.sourcetreeapp.com/ 使用体验
测试常用的,拉取远端仓库下来方便查看整个项目代码,有更新可以及时拉取
点击new tab,再点击Clone,填写远程库地址:
http://xxx:xxx@xxxx/game_mushroom.git(自动识别是git仓库),填写本地存放路径,克隆成功