SVN 是集中式版本控制系统,版本库集中放在中央服务器。开发人员工作时,首先从中央服务器下载最新版本,然后开发,需要把自己开发的代码提交到中央服务器。
集中式版本控制工具缺点:服务器单点故障(一旦中央服务器损坏,版本全部丢失);容错性差(一旦服务器出现问题,整个工作环境都无法使用)。
GIT 是分布式控制系统,分为两种类型的仓库:本地仓库 和 远程仓库。
本地仓库:是开发人员自己电脑上的git仓库,
远程仓库:是远程服务器上的git仓库。
使用远程仓库的目的:备份,实现代码共享集中化管理。
clone:克隆,将远程仓库代码复制到本地仓库;
push:推送,将本地仓库代码上传到远程仓库;
pull:拉取,将远程仓库代码下载到本地仓库;
相比于svn,更加灵活、易用的分支概念,非常利于管理多个不同版本的分支代码。
例如同一个产品,部署到不同客户时,需要修改logo或者其他定制代码时,可以从master分支上checkout出多个分支进行维护,避免了复制多份代码时增加维护成本;并且,如果在多个分支上发现了同一个bug,可以将这个bug合并到其他分支上。
开源产品Gitlab,可以在web端对代码进行审查。
理论上,被git管理的所有操作都可以进行追溯,不小心删掉的代码也可以恢复。
流程如下:
1、从 远程仓库 克隆代码到 本地仓库
2、从 本地仓库 中 checkout 代码到工作区(自己电脑的文件夹),然后进行代码修改。
3、在提交前,将代码提交到暂存区。
4、再提交到本地仓库,本地仓库中保存了修改的各个历史版本。
5、修改完成后,需要和团队成员共享代码时,将代码push到远程仓库。
注意:clone命令只需克隆一次就可以,之后再想从远程仓库下载代码,直接用 pull 将远程仓库代码拉取到工作区就可以了。
仓库(repository):用来存放项目代码,每个项目对应一个仓库,多个开源项目则有多个仓库。
收藏(star) :仓库主页star按钮,收藏仓库,方便下次查看。
复制克隆项目(fork):复制的项目是独立存在,修改后不会影响源项目。也就是说产生新分支。
发起请求(pull request):修改后的代码发送给源仓库,等待查看,同意之后可以合并到源仓库中。
关注(watch):项目有更新可以有通知提醒。
事务卡片(issue):发现项目中的bug,可以提个lssue ,然后解决后再关掉 close。
github主页:账号创建成功或点击网址导航github图标,就会进去主页,该页左侧主要显示用户动态以及关注用户或关注仓库的动态,右侧显示所有git库。
仓库主页:主要显示项目的信息,如:项目代码,版本,收藏、关注、fork等
个人主页:个人情况。
GIT安装
下载网址:https://git-scm.com/download/win
git工作区域
工作区:添加、编辑、修改文件等动作
暂存区:暂存已经修改的文件最后统一提交到git仓库。
git仓库:最终确定的文件保存到仓库中,称为一个新的版本,并且对他人可见。
git命令
git status :查看当前状态
git add 文件 :将工作区的文件添加到暂存区。
git commit -m “提交描述” : 将文件提交到git本地仓库
git push :将本地仓库中代码提交到远程仓库中
安装git之后,先配置环境,每次提交会使用这些信息。
设置用户信息:
git config --global user.name “itcast”
git config --global user.email “[email protected]”
查看配置信息:
git config --list
git config user.name
获取git仓库的两种方式:
1、在本地初始化一个git仓库
运行命令:git init ; 出现 .git 文件夹说明git仓库创建成功。
2、从远程仓库克隆
运行命令:git clone 远程仓库地址;
untracked 未跟踪状态 (未被纳入版本控制)(在工作区新创建了一个文件时);
tracked 已跟踪状态(被纳入版本控制)(远程仓库也存在的文件)
unmodified 未修改状态(没做任何修改的文件);
modified 已修改状态(修改了文件);
staged 已暂存状态(已用 git add 提交到了暂存区);
&&-- 查看工作区文件的状态,命令:git status 或 git status -s ;使输出信息更简洁。
&&-- 将未跟踪的文件加入暂存区,命令:git add 文件名或文件夹名
&&-- 将暂存区文件修改提交到本地仓库,命令:git commit -m “日志信息” (不加-m 会进入vim模式,输入日志信息)
&&-- 删除工作区中的文件 ,命令:git rm 文件名称
&&-- 将文件添加到忽略列表,无需纳入git管理,不会提示untracked未跟踪,例如自动生成的临时文件等。
具体操作:在工作区中创建 .gitignore 文件,列出要忽略的文件模式,示例如下:
.a 表示所有.a文件都忽略,星号表示所有;
!lib.a 表示lib.a文件需要管理,!取反;
/TODO 表示当前目录下todo文件需要忽略;
build/ 表示build文件夹下的所有文件都忽略;
doc/.txt 表示doc文件夹下 txt文件都忽略;
doc/**/*.pdf 表示doc文件夹下及其子文件夹下所有pdf文件都被忽略,两个星号表示多重目录。
测试:
执行命令: touch .gitignore 来创建.gitignore 文件
打开文件,写入*.a 等。
&&-- 查看本地仓库的日志记录 ,所有commit 的记录。命令:git log
&&-- 查看已经配置的远程仓库服务器,命令:git remote -v 得到的远程仓库地址,origin 是克隆的远程服务器的默认名称。
查看更详细的信息,命令:git remote show origin
&&-- 给已经初始化git 的工作区,添加远程仓库 ,命令:git remote add 添加一个新的远程仓库,同时指定一个可以引用的简写
例如: git remote add origin https://github.com/173862298/gittext.git
远程仓库可以添加多个,指定不同的引用 origin或其他名称。
&&-- 从远程仓库克隆,命令:git clone 远程仓库地址 ,完成后自动建立好了远程仓库的关联关系。
&&-- 移除无效的远程仓库 ,命令:git remote rm 远程仓库名称 ,此命令只是从本地移除远程仓库的关联关系,不会真正影响到远程仓库。
&&-- 从远程仓库中抓取fetch与拉取pull
git fetch 是从远程仓库获取最新版本到本地仓库,不会自动merge合并到本地仓库,需要手动合并git merge origin/master,之后才能在本地仓库看到拉取到的文件;
git pull 是从远程仓库获取最新版本并merge到本地仓库。强制拉取需要在命令后加 --allow-unrelated-histories
&&-- 推送代码到远程仓库,命令:git push [remote-name] [branch-name]
例如:git push origin master
分为本地分支(命令窗口路径后面的括号指本地分支) 和远程分支(远程仓库上显示的分支就是远程分支)。
&&-- 查看所有本地仓库分支,命令:git branch
&&-- 查看所有远程仓库分支,命令:git branch -r
&&-- 查看所有本地和远程的分支 ,命令:git branch -a
&&-- 创建本地分支,命令:git branch 分支名称
&&-- 切换本地分支,命令:git checkout 分支名称
&&-- 推送到远程仓库分支,命令:git push 远程仓库名称 远程仓库分支名称
例如:推送到远程分支b1中。此时会自动在远程仓库创建远程分支b1
&&-- 合并分支,命令:git merge 分支名
如果在两个不同的分支中,对同一个文件的同一部分进行了不同的修改,这时会提示文件冲突。此时需要打开冲突的文件并手动修复冲突内容,最后执行git add 命令来标识冲突已解决。
&&-- 把主分支的代码merge到自己的分支,在自己的分支下执行命令:git merge master
再用git push 命令推到远程自己的分支上就完成了,执行命令:git push origin 自己的分支名
现在 你自己分支的代码就和主分支的代码一样了。
&&-- 删除本地分支,命令:git branch -d 分支名 ,若在分支中进行了一些开发动作,提示删除失败,如果坚持删除,用git branch -D 分支名称
&&-- 删除远程仓库中的分支,命令:git push origin -d 分支名称
git可以给历史中的某一次提交打上标签,来标记发布节点(v1.0、v1.2等),
标签指某个分支某个特定时间点的状态。通过标签,可以很方便的切换到标记时的状态。
&&-- 列出所有标签tag ,命令:git tag
&&-- 查看tag信息,命令:git show 标签名称 ,
&&-- 创建标签,命令:git tag 标签名称 , (标签名一般用版本号v1.2 等)
&&-- 将标签推送到远程仓库,命令:git push 远程仓库名 标签名
&&-- 检出标签,一般都会新建一个分支,令分支指向某个标签,命令:git checkout -b 分支名 标签名
&&-- 删除本地标签,命令:git tag -d 标签名
&&-- 删除远程标签,命令: git push origin :refs/tags/标签名
1、创建、打开文件,进入编辑模式:vi 文件名。
2、(1)键盘输入字母 “i”或“Insert”键进入最常用的插入编辑模式,
在插入编辑模式下编辑文件。
(2)按下 “ESC” 键,退出编辑模式,切换到命令模式。
(3)在命令模式下键入"ZZ"或者":wq"保存修改并且退出 vi 。
(4)如果只想保存文件,则键入":w",回车后底行会提示写入操作结果,并保持停留在命令模式。
放弃所有文件修改:
(1)放弃所有文件修改:按下 “ESC” 键进入命令模式,键入 “:q!” 回车后放弃修改并退出vi。
(2)放弃所有文件修改,但不退出 vi ,即回退到文件打开后最后一次保存操作的状态,继续进行文件操作:按下 “ESC” 键进入命令模式,键入 “:e!” ,回车后回到命令模式。
1、克隆代码
2、由于master分支受到保护(即任何人不能直接push代码到master分支,必须通过合并请求才能将代码同步到master分支),任何人在修改bug或者新增需求时,需要从最新的master分支上checkout一个新的分支,在这个新分支上进行操作。
如何checkout分支,首先在master分支上pull最新代码,然后new branch,与该bug相关的代码都在该分支上进行commit和push。
3、当某个bug修改完成时,所有该分支的代码都已经commit过,然后在idea上将该分支push到远程。
4、登陆Gitlab网页,在分支页面,可以查看刚刚push的分支。
5、在分支上点击’合并请求’,输入对应的信息并选择代码审查人员。
6、然后由相关人员进行代码审查,如果没有问题,则进行合并(并删除相应的远程分支,保证远程仓库分支的纯净),合并完成之后通知开发人员,然后由测试人员对bug进行测试;如果发现可能存在问题,代码审查人员与开发人员沟通,再进行下一步操作。
1)commit时,注意不要把一些由idea或者node生成的不需要的文件(例如iml文件)提交到仓库里,每次commit时要查看一下所有待commit的文件。
2)所有commit message必须具备实际意义,且尽可能详细描述本次提交内容,不允许随意编写commit message(commit message为重要的代码追溯查询条件)。
3)当发生代码冲突时,一定要谨慎处理(必要时,需要询问冲突代码的合并方式);推荐先fetch,再rebase remote master,在idea中解决冲突,再提交。(git fetch功能是将远程分支与本地的远程分支进行合并)
5)建议保持本地master分支的最新,并且不要commit代码到本地的master分支上。合并请求完成之后,建议重新checkout到master分支,并且pull最新代码,在这个最新的master分支上再checkout新的bug分支。
6)本地分支push到远程并合并之后,推荐将本地分支予以删除,否则本地分支将会越来越多。