1 Git原理和常用命令
1.1 Git的起源和特点
Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目,Git的读音为/gɪt/。Git是 Linus Torvalds 为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
Git具有以下特点:
- 分布式的版本控制系统:Git开发时本地仓库保留所有的历史提交和分支,即使中央仓库是单点出现故障,也不影响本地的commit提交工作,开发同学可以继续本地编码,直到中央仓库恢复后再推送到中 央仓库;
- 轻量和便捷的分支管理策略:不同于SVN整个拷贝,Git创建的分支是当时历史提交点的快照(指针),不需要整个拷贝,成本极低而且便捷;
- 近乎所有操作都可以本地执行:拉分支、提交、合并等操作都只访问本地仓库,处理速度快,离线状态下,可在本地进行任意次提交;
- 更open的权限管理、更多持续集成的支持:不同于SVN权限管理可以细致到某个目录,Git是按照Group(开发组)进行权限管理,Group所有成员对于组内所有代码工程具有相同权限,这种权限管理更有利于组内知识共享和技术交流。Git特有的Gerrit可以更好的实现code review,并且可以把Sonar、UT等其他持续集成活动更好的集成和应用到代码工程中。
1.2 Why Git
- Git开源、便捷的基因完全符合互联网更开放、更敏捷快速的特点,Git已经成为目前最流行的版本管理系统,并且成为主流的一二线互联网公司采用的版本管理系统,没有之一;
- Git可以促进组内、公司内知识共享,由封闭转向开源,人人都可以参与和贡献开源代码;
- 全球最大、最活跃的开源社区Github,可以轻松无缝clone到本地,进行参考和学习;
- 天然的代码质量控制系统,让code review、CI更容易执行。
1.3 Git原理
1.3.1 Git内部对象存储模型
Git仓库由一个个的commit对象组成的双向链表构成。修改已有文件后提交,Git保存的不是增量内容,而是整个文件的快照,一个commit对象对应的是整个项目源码的一个版本,而非本次修改的增量数据。
1.3.2 Git存储空间
workspace index local repository remote repository
1.git add命令主要用于把我们要提交的文件的信息添加到索引库中。当我们使用git commit时,git将依据索引库中的内容来进行文件的提交。
1.1 git add <path>表示 add to index only files created or modified and not those deleted
我通常是通过git add <path>的形式把我们<path>添加到索引库中,<path>可以是文件也可以是目录。
git不仅能判断出<path>中,修改(不包括已删除)的文件,还能判断出新添的文件,并把它们的信息添加到索引库中。
1.2 git add -u
git add -u 表示 add to index only files modified or deleted and not those created
git add -u [<path>]: 把<path>中所有tracked文件中被修改过或已删除文件的信息添加到索引库。它不会处理untracted的文件。
省略<path>表示.,即当前目录。
1.3 git add -A
git add -A: [<path>]表示把<path>中所有tracked文件中被修改过或已删除文件和所有untracted的文件信息添加到索引库。
省略<path>表示.,即当前目录。
1.4 git add -i
我们可以通过git add -i [<path>]命令查看<path>中被所有修改过或已删除文件但没有提交的文件,
并通过其revert子命令可以查看<path>中所有untracted的文件,同时进入一个子命令系统。
2.git commit -m "提交的描述信息"
git push命令用于将本地分支的更新,推送到远程主机。它的格式与git pull命令相仿。
$ git push <远程主机名> <本地分支名>:<远程分支名>
注意,分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。
如果省略远程分支名,则表示将本地分支推送与之存在”追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
$ git push origin master
上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
如果想把 本地的某个分支test 提交到 远程仓库,并作为远程仓库的master分支,或者 作为另外一个名叫test的分支,那么可以这么做。
$ git push origin test:master // 提交本地test分支 作为 远程的master分支
$ git push origin test:test // 提交本地test分支作为远程的test分支
4.
reset是指将当前head的内容重置,不会留任何痕迹。
Sets the current head to the specified commit and optionally resets the index and working tree to match.
会将最新的3次提交全部重置,就像没有提交过一样。
执行第四步的前提条件是:必须在本地仓库还没有push到远程仓库之前才能执行,不然就没有用了。执行了第四步之后,你会发现自己上一次提交的改动又恢复原样了,git reset --hard head~1 是返回到上一次提交之前。
1.4 Git常用命令
- 用户信息配置:
- Git常用命令:
git clone git@git.daojia-inc.com:jiazheng/nurseExtendServer.git 克隆对应组项目工程的代码到本地
git branch -r 查看该模块远端存在的分支
git checkout -b dev/Dev_jiazheng_dubbo-nurse-extend-server_6-0-0 origin/dev/Dev_jiazheng_dubbo-nurse-extend-server_6-0-0 创建本地分支并和远端分支关联
git status 查看状态,要经常查看当前本地分支的状态
git pull 从远端拉取代码,并自动merge,git fetch + git merge
git add filename 添加需要提交的指定文件
git add . 添加所有修改过的文件
git commit -m “注释” 本地提交当前已经添加的修改附带注释
git commit 本地提交当前已经添加的修改,执行后会弹出一个vi界面,在其中添加注释
git push origin dev/Dev_jiazheng_dubbo-nurse-extend-server_6-0-0 推送本地分支的提交到远端,类似于svn的commit
git checkout dev/Dev_jiazheng_dubbo-nurse-extend-server_6-0-0 切换本地分支,在本地已经创建的分支中进行切换
- Git命令集:
git init #初始化git仓库 git branch #分支相关
git clone #克隆仓库 git tag #tag相关
git status #检查文件当前状态 git reset #撤销提交或更改
git add #跟踪新文件 git stash #暂存修改
git diff #显示差异 git checkout #切换分支
git commit #提交更新 git merge #合并
git log #查看提交历史 git rebase #衍合
git rm #移除文件 git cherry-pick #重新apply已有commit
git mv #移动文件 git show-branch #显示提交状态
git remote add #添加远程仓库 git whatchanged #查看提交修改了哪些文件
git fetch #从远程仓库抓取数据 git cat-file #查看对象内容
git push #推送数据到远程仓库 git ls-files #显示工作目录和index中文件信息
git pull #抓取数据并合并 git gc #垃圾收集
2 Gitlab操作手册
2.1 Gitlab权限管理
Gitlab用户在组中有五种权限:Guest、Reporter、Developer、Master、Owner
- Guest:可以创建issue、发表评论,不能读写版本库
- Reporter:可以克隆代码,不能提交,QA、PM可以赋予这个权限
- Developer:可以克隆代码、开发、提交、push,RD可以赋予这个权限
- Master:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心RD负责人可以赋予这个权限
- Owner:可以设置项目访问权限 - Visibility Level、删除项目、迁移项目、管理组成员,开发组leader可以赋予这个权限
Gitlab中的组和项目有三种访问权限:Private、Internal、Public
- Private:只有组成员才能看到
- Internal:只要登录的用户就能看到
- Public:所有人都能看到
开源项目和组设置的是Internal