git学习
- 1. 概念
- git和svn的区别和优势
- 1.1 区别
- 1.2 git优势
- 2. git的三个状态和三个阶段
- 2.1 三个状态:
- 2.2 三个阶段:
- 3. 常用的git命令
- 3.1 下面是最常用的命令
- 3.2 git命令操作流程图如下:
- 4. 分支内容学习
- 4.1 项目远程仓库
- 4.2 项目本地仓库
- 4.3 生产环境从远程master分支拉取打包,暂不设置“integration manager”角色,每位开发人员均可以向master分支合并。
- 5. 具体开发步骤
- 6. 如何解决冲突
- 7. 减少冲突的方法
- 8. 关于对冲突和合并的理解
- 9. 补充其他可能用的命令
- 9.1 对象库操作相关命令
- 9.2 数据传输相关命令
- 9.3 分支相关命令
- 9.3.1 git branch 分支管理
- 9.3.2 git checkout 切换或新建分支
- 9.3.3 git merge 分支合并
1. 概念
Git是一个免费和开源的分布式版本控制系统。相较于SVN具有便于本地分支等特性。
git和svn的区别和优势
1.1 区别
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
1.2 git优势
- 容易分支;git鼓励创建一个或多个本地分支进行开发且代价极小。与此对应SVN的分支基本上等于将整个项目进行拷贝,成本大。
- 速度快;大部分操作都在本地进行,如查看提交记录。但是在拉取的时候会慢,SVN拉取的是最新版本,而GIT会拉取整套版本;
- 分布式;与SVN集中式管理相比,GIT每个用户都是主服务的一个完整备份;
- 有暂存区;可用于提交部分文件;
- 数据安全;每个文件与每次提交都会被验证
2. git的三个状态和三个阶段
- 三个状态:已修改,已暂存,已提交
- 三个阶段:工作区,暂存区,仓库
三个状态分别对应三个阶段
2.1 三个状态:
已修改(modified):表示修改了文件,但还没保存到仓库中。
已暂存(staged):已暂存,表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
已提交(committed):表示数据已经安全地保存在
本地仓库
中。
2.2 三个阶段:
- Workspace:工作区
- Index / Stage:暂存区
- Repository:仓库区(或本地仓库)
- Remote:远程仓库
工作区(Working Directory):对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
暂存区(Staging Area):保存了下次将要提交的文件列表信息,一般在 Git 仓库目录中。 按照 Git 的术语叫做“索引”,不过一般说法还是叫“暂存区”。
仓库(Repository): Git用来保存项目的元数据和对象数据库的地方,分为本地仓库与远程仓库。
3. 常用的git命令
3.1 下面是最常用的命令
序号 | 命令 | 名称 | 描述 |
---|---|---|---|
1 | git clone | 克隆 | 复制远程仓库包含历史版本在内的几乎所有数据至本地仓库。 |
2 ❤ | git pull | 拉取 | 将远程仓库的最新内容数据下载到你的本地仓库并尝试合并。 |
3 ❤ | git fetch | 获取 | 将远程仓库的最新内容数据下载到你的本地仓库但不会自动合并。 |
4 | git checkout | 检出 | 多用途命令,从Git仓库提取文件、撤销修改、切换分支等。 |
5 | git diff | 比较未暂存文件与最后一次提交的文件或者已暂存文件差异。 | |
6 ❤ | git add | 跟踪 | 跟踪新文件并使之处于暂存状态或合并时将冲突文件标识为已解决等。 |
7 ❤ | git commit | 提交 | 将未暂存的或已暂存的文件保存至本地仓库。 |
8 ❤ | git push | 推送 | 将文件推送到远程仓库。 |
9 | git log | 查看提交历史。 | |
10❤ | git branch | 分支 | 创建或查看分支。 |
11❤ | git merge | 合并 | 合并分支。 |
3.2 git命令操作流程图如下:
4. 分支内容学习
4.1 项目远程仓库
共分为两个分支。
-
master分支:主干分支。用于发布生产环境。
-
dev分支:开发分支。(一般我们都是从dev拉取版本)接收本地dev分支的合并。测试无误后才合并至master分支,后续根据情况决定是否建立测试分支。
4.2 项目本地仓库
-
包括一个dev分支与多个功能及bug修复分支。
-
dev分支用来合并其它功能分支的提交,同时用来推送远程dev分支。
-
功能分支及bug修复分支是临时分支,用于开发具体功能和修复bug,开发完成合并至本地dev分支后可删除;
注意线上的bug修改分支需要从远程master分支进行拉取。
4.3 生产环境从远程master分支拉取打包,暂不设置“integration manager”角色,每位开发人员均可以向master分支合并。
5. 具体开发步骤
-
拉取远程最新提交的dev分支至本地dev分支,保证本地dev分支代码为最新版本。
-
从本地dev分支拉取新的功能分支dev-temp-xxx并在其上进行开发
就是新建一个dev-temp-xxx分支
-
本地功能开发分支在开发完成并且自测无误后进行代码提交commit(commit是提交到本地仓库)。
ps:只是提交到本地仓库,并不是合并merge;
每个temp分支和dev都有指针指向自己的版本,在没有合并之前是不会产生新的版本的;
-
切换到本地dev分支从远程dev分支拉取最新提交。
保证本地dev最新;因为在我们第一次拉取远程dev进行功能开发期间,可能其他人已经push了一个版本修改了相同的功能,这个时候我们就得重新拉取远程dev到本地dev,以便于解决 / 避免冲突
-
将功能分支dev-temp-xxx合并(merge)到本地dev分支,此过程可能产生冲突,解决冲突。
再本地dev重新拉取以后,我们在把temp分支合并到本地
-
推送本地dev分支到远程dev分支。
-
将新建的功能分支dev-temp-xxx删除。
个人 具体理解如下:
6. 如何解决冲突
-
冲突发生时首先备份自己开发的内容。
-
然后用他人的版本解决冲突。
舍弃自己的版本,直接用他人的版本作为merge的父类;
-
将自己新开发的内容回添到已解决冲突的文件中。
不是简单的复制粘贴上去
-
提交。
7. 减少冲突的方法
-
任务分解时功能独立;
-
开发前拉取代码;(尽量早拉取)
-
开发测试完成后及时提交代码。(尽快早提交)
8. 关于对冲突和合并的理解
- 冲突的解决,分支的合并都是在本地的;
- 本地的dev分支版本,都是高于拉取时远程dev的版本,所以在本地合并(merge)之前得重新拉去最新的远程dev分支
9. 补充其他可能用的命令
命令 | 简要说明 |
---|---|
git add | 添加至暂存区 |
git add–interactive | 交互式添加 |
git apply | 应用补丁 |
git am | 应用邮件格式补丁 |
git annotate | 同义词,等同于 git blame |
git archive | 文件归档打包 |
git bisect | 二分查找 |
git blame | 文件逐行追溯 |
git branch 分支相关 | 分支管理 |
git cat-file | 版本库对象研究工具 |
git checkout 分支相关 | 检出到工作区、切换或创建分支 |
git cherry-pick | 提交拣选 |
git citool | 图形化提交,相当于 git gui 命令 |
git clean | 清除工作区未跟踪文件 |
git clone | 克隆版本库 |
git commit | 提交 |
git config | 查询和修改配置 |
git describe | 通过里程碑直观地显示提交ID |
git diff | 差异比较 |
git difftool | 调用图形化差异比较工具 |
git fetch | 获取远程版本库的提交 |
git format-patch | 创建邮件格式的补丁文件。参见 git am 命令 |
git grep | 文件内容搜索定位工具 |
git gui | 基于Tcl/Tk的图形化工具,侧重提交等操作 |
git help | 帮助 |
git init | 版本库初始化 |
git init-db* | 同义词,等同于 git init |
git log | 显示提交日志 |
git merge 分支相关 | 分支合并 |
git mergetool | 图形化冲突解决 |
git mv | 重命名 |
git pull | 拉回远程版本库的提交 |
git push | 推送至远程版本库 |
git rebase | 分支变基 |
git rebase–interactive | 交互式分支变基 |
git reflog | 分支等引用变更记录管理 |
git remote | 远程版本库管理 |
git repo-config* | 同义词,等同于 git config |
git reset | 重置改变分支“游标”指向 |
git rev-parse | 将各种引用表示法转换为哈希值等 |
git revert | 反转提交 |
git rm | 删除文件 |
git show | 显示各种类型的对象 |
git stage* | 同义词,等同于 git add |
git stash | 保存和恢复进度 |
git status | 显示工作区文件状态 |
git tag | 里程碑管理 |
9.1 对象库操作相关命令
命令 | 简要说明 |
---|---|
git commit-tree | 从树对象创建提交 |
git hash-object | 从标准输入或文件计算哈希值或创建对象 |
git ls-files | 显示工作区和暂存区文件 |
git ls-tree | 显示树对象包含的文件 |
git mktag | 读取标准输入创建一个里程碑对象 |
git mktree | 读取标准输入创建一个树对象 |
git read-tree | 读取树对象到暂存区 |
git update-index | 工作区内容注册到暂存区及暂存区管理 |
git unpack-file | 创建临时文件包含指定 blob 的内容 |
git write-tree | 从暂存区创建一个树对象 |
9.2 数据传输相关命令
命令 | 简要说明 |
---|---|
git fetch-pack | 执行 git fetch 或 git pull 命令时在本地执行此命令,用于从其他版本库获取缺失的对象 |
git receive-pack | 执行 git push 命令时在远程执行的命令,用于接受推送的数据 |
git send-pack | 执行 git push 命令时在本地执行的命令,用于向其他版本库推送数据 |
git upload-archive | 执行 git archive –remote 命令基于远程版本库创建归档时,远程版本库执行此命令传送归档 |
git upload-pack | 执行 git fetch 或 git pull 命令时在远程执行此命令,将对象打包、上传 |
9.3 分支相关命令
9.3.1 git branch 分支管理
git branch 查看本地所有分支
git branch -a 查看所有的分支
git branch -r 查看远程所有分支
9.3.2 git checkout 切换或新建分支
git checkout --track origin/dev 切换到远程dev分支
git checkout dev 切换到本地dev分支
git checkout -b dev 建立一个新的本地分支dev
9.3.3 git merge 分支合并
git merge origin/dev 将分支dev与当前分支进行合并