hiahiahia我又来做恶了,莫名其妙的第八次实验还要更新!git
Git是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型项目的全部事务。Git易于学习,占地面积小,具备闪电般快速的性能。而且它超越了Subversion,CVS,Perforce和ClearCase等SCM工具,具备廉价的本地分支,便捷的临时区域和多个工做流程等功能。github
Git具备分布式版本控制系统,它保存的是文件的完整快照,而不是差别变化或者文件补丁。每一次提交,Git保存的都是对项目文件的一个完整拷贝,所以开发者能够彻底恢复到之前的一个提交而不会发生任何区别。这里容易让人疑惑的是,Git占用的空间会不会随着提交次数的增长而线性增长呢?好比项目大小是10M,提交了10次,占用的空间是否是100M呢?显然不是,若是文件没有变化,它只会保存一个指向上一个版本的指针,这就是说对一个特定版本的文件,Git只会保存一个副本,但能够由多个指向该文件的指针。vim
在《Pro Git》中,做者提到Git最适合保存文本文件(如各类语言的源代码,这也是Git设计的初衷),由于Git能够对文本文件进行很好的压缩和差别分析。但像二进制文件如视频、图片等,Git也能管理,但压缩比率低而且不能进行差别分析,Git占用的空间几乎随着提交的次数线性增加。windows
常见Git指令清单以下,注意git指令是大小写敏感的缓存
版本控制系统是指能随时间的推动记录一系列文件以便于开发者之后想要回退到某个版本的系统,主要分为三类:本地版本控制系统、集中版本控制系统和分布式版本控制系统。服务器
本地版本控制系统是指文件的各个版本以必定的数据格式存储在本地的磁盘中,这种方式在必定程度上解决了手动复制粘贴的问题,可是没法解决多人协做的问题。
markdown
集中版本控制系统与本地版本控制系统相似,可是多了一个中央服务器,各个版本的数据存储在中央服务器,管理员能够控制开发人员的权限,开发人员也能够从中央服务器拉去数据。这解决了LVCS没有解决的多人协做问题,可是因为数据集中存储,一旦服务器宕机或者磁盘损坏,会形成不可估量的损失。ssh
分布式版本控制系统与前二者均不一样。首先,在分布式版本控制系统中,系统保存的不是文件变化的差量,而是文件的快照,即把文件的总体复制下来保存,而不关系具体的变化内容。其次,最重要的是分布式版本控制系统是分布式的,开发者从中央服务器拷贝下来代码时,拷贝的是一个完整的版本库,包括历史记录,提交记录等,这样即便某一台机器宕机也能找到文件的完整备份。编辑器
Git从核心上看是简单地存储键值对,值为文件的内容,键为文件内容与文件头信息的40个字符长度的SHA-1校验和。Git使用校验和并非为了加密,而是为了保证数据的完整性,这样即使要回退到一个好久以前的commit状态,也不会出现一丝差错。当对文件进行了哪怕一丁点儿的修改,也会计算出彻底不一样的SHA-1校验和。分布式
SHA-1校验和即上面提到的文件的指针,与C语言指针不一样,Git指针指向的文件内容发生变化时,指针行业会发生改变,这样每个版本的文件,Git都有一个惟一的指针指向它。
工做目录是当前进行工做的区域,文件修改但未提交,处于已修改状态(modified);
暂存区域是运行git add命令后文件保存的区域,也就是下次提交要保存的文件,文件处于已暂存状态(staged);
本地仓库即版本库,记录了工程提交的完整状态和内容,文件处于已经提交状态(committed)。
使用Git的工做流程基本就是文件在三个工做区域之间的流动。
下图简单展现了一个工程中各个对象之间的关系,图中每个对象对应不一样SHA-1指针,File1-2为File1-1的修改。
分支是Git进行版本控制的利器,Git鼓励工程中频繁使用分支与合并,由于Git分支很是轻量级,Git本质上只是一棵巨大的文件树,树的每个节点就是blob对象,而分支只是树的一个分叉,即分支只是一个有名字的引用,建立分支就是向文件写入一个校验和,速度极快。
Git默认分支为master,建立分支只须要运行
git branch [branch-name]
[branch-name]为分支名字。切换分支只须要运行
git checkout [branch-name]
快进(Fast forward):分支合并时,若是顺着一个分支走下去能够到达另外一个分支的话,那么git在合并两个分支时只会简单地把指针右移,这种合并过程被称为快进。
当要合并的分支不在一条线时,Git首先会用两个分支的末端及它们共同的祖先进行一次简单的三方合并计算并提交。
以下图将v三、v5和v7合并计算出v8并提交。
[1]软工第二次上机PPT
*这部分图片太多了,就不从本地粘过来了,以前直接在CSDN写的,有水印,就当给本身打广告了
启动Git GUI:Git GUI Here
git clone:主面板选择Clone Existing Repository,设定原路径,本地目标路径与克隆模式,单击Clone按钮
git init:主面板选择Create New Repository,设定版本库位置,单击Create按钮
git add:存在未被添加到Staging区的改动时,在主操做面板单击Rescan按钮,改动将出如今Unstaged Changes区域内,再次单击Stage Change按钮,将改动添加到Staging区
git rm:存在已被添加到Staging区的改动时,选中在缓存区改动列表中一项或多项文件,在菜单栏中选择Commit→Unstage From Commit,能够看到刚被添加的改动被退回到Unstaged Changes区域中
git branch与checkout:在菜单栏中选择Branch选项,打开Branch菜单栏,菜单栏中包括五种行为
git commit:在将文件添加至Staging区后,在Commit描述窗口输入描述后,单击Commit按钮,按成一次提交(注意要添加Commit Message),在Commit菜单栏有更多操做
git merge:在菜单栏中选择Merge选项,在打开的Merge菜单栏中选择Local Merge选项,打开Merge窗口,在窗口中能够选择将要合并的当前分支的本地或远程分支,单击Merge按钮完成合并,若两分支出现冲突,则须要先解决冲突,而后才能进行合并
在Git版本控制系统中,本地版本库与远程版本库的数据交互受权能够经过HTTPS与SSH两种方式实现。前者经过输入我的帐户名与密码实现,后者须要在我的帐户中配置RSA密钥,将私钥置于本地,公钥上传至远程版本库,再者以后远程版本库将会经过SSH协议认证用户身份,再也不须要在每次上传或下载改动时输入用户名与密码。
git config --global user.name "xxx"
xxx指你本身的用户名
git config --global user.email "1234567890@xx.com"
1234567890 @xx.com指你本身的邮箱我不是针对在作各位,这邮箱要是能重名…那咱们这么有缘为何不作个朋友呢 😃
ssh-keygen -t rsa -C '1234567890@xx.com'
打开下方输出中对应路径的 id_rsa 文件,将其中存放的密匙粘贴到对应网页中的key中,title本身定义就能够
第一次经过下面步骤链接GitHub时须要输入帐户名和密码,输入错误则没法链接,而且没法在相似界面再次输入,由于该帐户名和密码已经自动被windows备份,此时能够经过修改以下图控制面板中的windows凭据信息从新输入正确的帐户名和密码。
1. checkout: git checkout xxx
,xxx
是你所要上传到的分支的名称,切换到分支。
2. add:git add xxx
,xxx
是你所要上传的文件(包括路径)。经常使用git add .
添加本地修改到仓库。
3. commit:将暂存区版本提交到本地版本库(注意不要屡次commit不push哦,会出错的)
(1)-m添加注释
git commit -m “message”
git commit -m ' message1 message2 message3 '
不加 -m参数Git默认调用编辑器通常是vim来让你输入这个message
界面就像下图这样 花里胡哨
(2)-a懒汉版打包提交
git commit -a -m “massage”
-a参数能够将全部已跟踪文件中的执行修改或删除操做的文件都提交到本地仓库,即便它们没有通过git add
添加到暂存区。可是新增文件没有被git管理,是没有办法经过-a识别上传的。
(3)- -amend追加提交
git commit --amend
对于那种马马虎虎还有点强迫症的人来讲,这是一个很人性化的设计,这样子你就不会被你的小组同胞,甚至是路过的游客 ,发现本身差很少的东西由于奇奇怪怪的小毛病重复提交了不少版本~~,简称:amend,你的蠢在我(am)这里终止(end)~~ 😐 。
4. push:上传到远程仓库