零、Git介绍和Git原理
【精】通俗原理
腾讯/Git内部类型
【精】git出的介绍原理的书
【精】git add + git commit + 分支创建 的原理1 原理2
一、Git简介
1.1两大特点
1.2安装
$ sudo apt-get install git
///验证
$ git
1.3 创建一个本地空仓库
在要被管理的目录下,创建一个空仓库,用来管理该目录
///初始化当前目录为仓库,初始化后会自动将当前仓库设置为master
git_init
///查看生成的git的配置文件
ls -ah
设置用户名和邮箱名
///安装完 Git 之后,要做的第一件事就是设置你的用户名和邮件地址。
///这一点很重要,因为每一个 Git 提交都会使用这些信息,
///它们会写入到你的每一次提交中,不可更改:
git config --global user.name "名称"
git config --global user.email "邮箱号"
将文件提交到本地仓库
git add xxx.c ///暂存操作。将文件添加到本地仓库的提交缓存
git commit -m "版本描述信息" ///提交操作。将文件提交到本地仓库
///git commit 会为我们生成40位的哈希值,用于作为id,
///并把刚刚用git add添加到提交缓存区里的文件提交到本地仓库中,
///便于我们回滚,至此,这个文件就已经添加到本地仓库中了,
///同时本地仓库也迭代了一个版本。
版本回退
git reset --hard HEAD~n (n为回退多少版本)!
从回退的版本前进
git reset --hard 版本号(git log 中打印出的commit,使用前八位即可。每个版本有个commit值,commit本质是sha256)
查看操作记录
git reflog
1.4工作区和暂存区
Git object 类型:blob类型,tree类型,commit类型,tag类型
流程:
1)一个目录中有两个文件a.txt和b.txt。git init创建一个本地仓库之后,使用
git add命令暂存所有文件。如图1所示即为三个区的数据结构。
暂存操作会为每一个文件计算校验和(使用 SHA-1 哈希算法),然后会把
当前
版本的文件快照保存到 Git 仓库中 (Git 使用 blob 对象来保存它们),最
终将校验和加入到暂存区域等待提交。
暂存区的索引和仓库区的快照为key-Value关系,根据暂存区的Key,即可
找到Value,从而找到文件内容。
2)在1)的基础上执行git commit -m “xxx”命令
当使用 git commit 进行提交操作时,Git 会先计算每一个子目录(本例中只
有项目根目录)的校验和, 然后在 Git 仓库中这些校验和保存为树对象。随
后,Git 便会创建一个提交对象, 它除了包含上面提到的那些信息外,还包含指
向这个树对象(项目根目录)的指针。 如此一来,Git 就可以在需要的时候重现
此次保存的快照。Header也指向被提交的版本。三个区域中的数据结构变化如
图2所示。
3)在2)有已经提交了一个版本的基础上执行修改文件,并执行git add命令
计算需要暂存文件的文件校验和,a.txt没有修改。SHA值未
变,所以索引没变,只有b.txt的索引发生变化。三个区域中的数据结构变化如
图3所示。
4)在3)的基础上提交第二个版本
做些修改后再次提交,那么这次产生的提交对象会包含一个指向上次提交对
象(父对象)的指针。三个区域中的数据结构变化如
图4所示。
1.5 Git 分支
【精精精】文章介绍了分支管理在网站开发中的使用及其优势(为什么需要分支管理?)
1.5.1 常用命令
使用git log --pretty=oneline --graph ///查看图形化的版本
1.5.2 分支合并
分支会有下面两种情况:
1)如图5,分支版本所在提交是主版本所在提交的后继:合并分支时,会采用fast-forward模式,如图7.
2)分支版本所在提交和主版本所在提交在更早的时候出现了分叉:
(1)如图6,直接后继:采用fast-forward,如图8
(2)如图6,分叉:如果你在两个不同的分支中,对同一个文件的同一个部分
进行了不同的修改,Git 就没法干净的合并它们,产生合并冲突。如图9(a)
和(b)。手动解决;冲突后方可提交。(如果在两个不同的分支中,不是对同一个文件进行修改的,对不同文件进行修改则不会产生冲突,不需要手动解决冲突)
1.5.3 分支管理
禁用fast-forward模式,可以把保留分支的版本记录
///本次合并将会提交一个新的commit
git merge--no-ff -m 'commit描述'
![在这里插入图片描述](https://img-blog.csdnimg.cn/da5bfca6196946c39b96d2540103497b.png#pic_center =400x)
1.5.4 Bug分支
手头工作未完成指的是:修改a.txt未完成,无法提交到暂存区。
1.5.5分支总结
二、github 远程仓库
2.1 创建仓库
2.1 添加SSH账号
为什么需要SSH密钥:
git远程链接一共可以使用四种协议,各有优缺点:
git使用https协议,每次pull, push都要输入密码,相当的烦。
使用git协议,然后使用ssh密钥。这样可以省去每次都输密码。
2.2 克隆项目
git clone 代码项目ssh地址
2.3 推送本地分支
2.4 将本地分支跟踪服务器分支
使用 git status 查看本地分支与待跟踪服务器分支之间的区别