分支
多条线路同时推进工作。
最开始有 master 分支。可能有的新员工刚来,一起开发,但是权限不够不想让他直接在 master 分支上操作。或者我们想让多个人齐头并进的开发。
出问题后一个分支不会影响其他分支。
除了开发时会采用分支提高开发效率,出现 bug 时一般也会使用一个叫做 hot_fix (热修复,指修复过程中原项目照常使用)的分支来修 bug ,修好后与原分支合并。
分支操作
git branch -v
查看所有分支。
git branch 分支名
创建一个分支名。
git checkout 分支名
移动到那个分支。
合并分支:首先切换到主分支。比如我们想把 hot_fix 分支合并到 master 上,先切换到 master 分支,再将 hot_fix 分支合并过来。git merge hot_fix
合并中的冲突问题
比如两个分支中对同一个文件都做了修改,分支合并就会出现冲突。
尝试 merge 失败后,打开 txt 文件会发现内容变为:
<<<<HEAD 到 ===== 中间的内容是当前文件所做的冲突的改动。===== 到 >>>>> [另一分支名] 是另一分支的。
解决办法:首先打开冲突的文件我们可以看到 git 提供给我们的文件中冲突的信息。然后我们删除特殊符号,并对其修改得到我们想得到的合并后的文件信息。
然后查看 git 状态显示:
提交到暂存区后显示:
再 commit 一下就成功 merge 了。但是这里的 commit 必须是 commit 全部文件,不可以 git commit good.txt
这样指定某一具体文件提交。
Git 基本原理
这一部分无具体操作,主要讲解一些原理,有助于理解。
哈希算法
对明文采用某种特定的加密方式加密。有以下特点:
- 无论输入数据多长,输出数据都一样长。
- 同一个输入数据对一种给定的加密算法,得到的加密输出唯一。
- 同一种加密算法处理多种输入数据,得到的输出数据一定不同(且一般差别很大)。
- 哈希算法不可逆。
git 底层采用的是 SHA-1 算法。
哈希算法作用:得到的哈希码可以拿来校验文件传输过程中是否出错。比如发送方发了一个文件和它的 hash 码过来,我这边收到后算一下收到的文件的 hash 码。发现 hash 码不一样,说明传输过程中目标文件有损坏。
我们自己下载文件时也可以应用类似的方法来看文件是否正常下载。官网一般会给出文件 hash 值。
git 保存版本的机制
集中式版本控制工具的文件管理机制(如 svn),每次只保存文件本版本修改过的一部分信息。想要得到某一版本的文件,就用原文件和该版本文件之前所的版本所做的修改拼凑成当前版本。比较节省空间。
而 git 的文件管理机制是小型文件系统的一组快照,每次提交更新时全部文件被做成一个快照并保存其索引。之后的提交中如果这个文件没有被修改,则不会更新快照,沿用之前该文件的索引。这种方式被称作快照流。
git 每次提交,提交中的所有文件会生成 hash 值。这些值存储在一个树对象中。提交的内容也是一个“提交对象”,也有一个哈希值,git log
中开头显示的一长串乱码就是。
各个版本的提交对象有一个指向父节点的哈希值,像链表一样方便索引。
git 分支管理的本质是创建和移动指针。我们提交到本地库的分支第一个是 root commit,作为本地库分支的根节点。之后提交的分支结点都是其子结点。
工作区的分支就是指针,这和 svn 不同,这样我们新建分支不是需要新建一整个工作目录,只需要新建一个指针即可。就像 c 中:
String a ="123";
String b=a;
b 不用新建对象,只是指向 a,效率很高。
白色部分是本地库已经提交的分支;
红色是工作区新建的指针分支;
黄色是 head 当前指针。
这样移动分支版本和 head 指针都很方便。
远程库 github
创建本地库、远程库
我们先新建一个本地库,init,添加要上传的文件,add,commit。
新建 github 的远程库,名字可以和本地库不同但便于理解最好相同。
本地库创建远程库地址别名
复制新建的仓库显示的 http 地址。这个就是远程库的地址,但是每次我们输入这么一长串地址访问很麻烦,因此可以给该地址添加别名。
git remote add origin https://github.com/Jingqing3948/GitPractice.git
origin 就是我们设置的别名。
输入git remote -v
查看别名信息, fetch 是取回,push 是推送。
推送本地内容
git push origin master
。
clone 远程库内容
先新建一个 dir。然后进入该目录并输入:
git clone https://github.com/Jingqing3948/GitPractice.git
一步 clone 实际上不仅 clone 了文件内容,也 init 了仓库,还设置好了 origin 别名为给定的仓库。
拉取远程分支
git pull origin master
会将本地和远程同步,记得要做。特别是多人合作后。
邀请成员加入
顺带一提,git 记住了我们的账号密码应该是 win 自带的功能,把账号密码存进了凭据管理器。如果要切换账号登录需要在凭据管理器中删除。
成员自己想加入项目可以在仓库右上角点击 fork 加入。
编辑、commit 后,点击 pull request 向原作者提交合并申请。
原作者可以在 pull request 里看到新信息,可以给对方回复,也可以 merge。
ssh 协议免密
仓库信息里除了 http 还有个 ssh 协议。但是一开始不能直接用,要在 github 中添加公钥。
先删除自己电脑本来的公钥,然后使用 git 生成公钥。
ssh-keygen -t rsa -C 邮箱
,-t 是加密方式,rsa 是非对称加密算法。-c 是描述,指添加到的邮箱。
然后打开 .ssh 目录,其中带有 .pub 后缀的是公钥,不带的是私钥。复制公钥。
在 github 个人账号 - SSH KEY 中添加 ssh 密钥。
设置好后,clone、pull、push 自己的 repositories 都不用输入账号密码再登录了。