命令行方式:任意目录(建议开发根目录)右键 > Git Bash Here
配置用户的意义在于记录开发者信息,以便在版本控制记录开发者的操作行为,如lion于2016-08-24解决了一个bug。
git config --global user.name “自已的名字”
git config --global user.email “自已的邮箱地址”
–global 配置当前用户所有仓库
–system 配置当前计算机上所有用户的所有仓库
注:配置用户只需要执行1次,可以重复使用。
我们如果想要利用git进行版本控制,需要将现有项目初始化为一个仓库,或者将一个已有的使用git进行版本控制的仓库克隆到本地。
a) git init
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UrAQ2nof-1572681539915)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879533651.png)]
git init只是创建了一个名为.git的隐藏目录,这个目录就是存储我们历史版本的仓库,ls -al 可以查看。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-INHrB8b4-1572681539916)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879544508.png)]
b) 假如公司已有项目用了Git,那我们就利用克隆
git clone 仓库地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WaIhzisg-1572681539917)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879552336.png)]
执行完这个命令,会在当前目录下生成一个Monment目录(默认和仓库名称相同),这个便是已有一个使用Git管理的项目。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vZCAVwUJ-1572681539917)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879561369.png)]
初始化仓库后便可以进行开发了,进入到刚刚创建好并初始为仓库的目录,添加我们开发需要的文件。
通过git status可以检测当前仓库文件的状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AnqyfIgx-1572681539918)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879587508.png)]
注:git会忽略空的目录
假设经过一段时间的开发后,需要把已开发的部分存起来,使用git add 添加到暂存区。
git add 文件名/ 文件路径 “*”或-A代表所有
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l0bO7syz-1572681539919)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879596085.png)]
放到暂存区的文件被标记成了绿色,等待提交。
注:颜色是工具给添加的,目的是增加可读性并不是git统一的。
继续我们的开发
再次git status可以再次查看仓库状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OfWLyUcK-1572681539919)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879604074.png)]
说明index.html再次被修改了,并被标记了红色。
又经过一段时间后发现新开发的部分有Bug,想要回到之前状态,可以使用git checkout 文件名。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iQ1H9KX0-1572681539919)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879610156.png)]
注:从暂存区还原原到工作区
经过一个相对较长阶段开发或者一个功能开发完成了,就可以提交到本地仓库了,永久保存了。
git commit -m ‘备注信息’
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SptS0fls-1572681539920)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879616422.png)]
将暂存区被标记成绿色的文件,全部提交到本地仓库存储。
这时git status查看状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1tGc8PfA-1572681539920)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879622520.png)]
没有什么可提交的,变的很干净。
反反复复开发了很多的功能了,通过git log查看一下提交的历史。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NDrbMmtZ-1572681539922)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879628471.png)]
我们可以查看到一次次提交记录
commit 81b1e4fc2ae178caedf4575596377a80a6f1e73f
代表一次提交的唯一ID,一般称为SHA值。傻?
注:按键盘q键退出。
隔了好些天后,继续开发
git status 查看状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d3Cenu3T-1572681539923)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879636033.png)]
又提示有修改,等待重新添加到暂存区。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NtvMiu1X-1572681539923)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879642215.png)]
git log 可查到所有提交历史
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZeOdBcJw-1572681539924)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879648297.png)]
这时可以查看到更多提交历史。
这时关掉所有目录甚至关机!
通过SHA值可以回到之前某一次的提交(时光倒流)
git reset --hard c888a614e072e2这样便回到了支付功能的状态
git log再次查看发现最后一次提交成了支付功能了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AB5xnOsj-1572681539924)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879687578.png)]
仓库示意图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RE2gAChE-1572681539925)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879695449.png)]
在我们的现实开发中,需求往往是五花八门的,同时开发个需求的情况十分常见,比如当你正在专注开发一个功能时,突然有一个紧急的BUG需要你来修复,这个时候我们当然是希望在能够保存当前任务进度,再去修改这个BUG,等这个BUG修复完成后再继续我们的任务。如何实现呢?
通过Git创建分支来解决实际开发中类似的问题。
在Git的使用过程中一次提交称为历史记录(版本),并且会生成一个唯一的字符串,如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wbkEL2OC-1572681539926)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879706670.png)]
这个串可以代表某一个历史版本(实际使用只取前面几位就可以),
值得注意的是所有的提交(commit)实际上都是在分支(branch)的基础上进行的。
如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5liHsvAP-1572681539927)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879714821.png)]
当我们在初始化仓库的时候(实际上是产生第1次提交时),Git会默认帮我们创建了一个master的分支,并且有指针(HEAD)指到了末端。
指针(HEAD)用来标明当前处于哪个分支的哪个版本,如上图指的处于master分支的最后1个版本。
我们也可以创建自已的分支
1**、创建分支**
git branch hotfix
新的分支会在当前分支原有历史版本的结点上进行创建,我称其为子分支如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PFgSl5jp-1572681539929)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879727984.png)]
新建的子分支会继承父分支的所有提交历史。
2**、切换分支**
git checkout hotfix
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FUFSS9Fi-1572681539931)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879738330.png)]
我们发现HEAD现在又指向了hotfix的末端。
3**、再次提交操作**
修改bug后,提交
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XUPaO5OB-1572681539933)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879745418.png)]
这次的提交历史版本就会记录在hotfix这个分支上了,并且HEAD伴随hotfix在移动。
4**、当我们再次切回到master时**
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y2xvzQV6-1572681539935)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879751663.png)]
当我们切换回master后,HEAD指向了master分支的末端,并且我们观察发现我们的文件内容还是原来的“模样”。
5**、继续之前的开发**
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-in7P2wUy-1572681539936)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879759627.png)]
总结:当我们git checkout branchname时,HEAD会自动指向对应分支的末端,工作目录中的源码也会随之发生改变。
这个时候我们就在hotfix这个分支上修复了这个BUG,而我们原来在master分支上的操作并未受到影响。
思考一个问题:
现在master这个分支上是否包含了hotfix的修复呢?
实际上从上图可以看出这时的master分支并没有包含有hotfix的修复。
6**、合并(融合)分支**
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0YSRrqTb-1572681539937)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879767409.png)]
这时master会有两个父结点了,master便包含了hotfix里的修复了
7**、删除分支**
git branch -d hotfix
这时用来修复BUG创建的hotfix分支已经没有用处了,我们可以将它删除。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DcJI5muh-1572681539938)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879773255.png)]
通过上面学习我们可以很好的管理本地版本控制了,可是如果我们下班回到家里突然来了灵感觉得有部分代码可以优化,如果能接着公司电脑上的代码继续写该有多好呀!另一种情形,假设项目比较大,不同的功能模块由不同的开发人员完成,不同模块儿之间又难免会依赖关系,这时如果我们的代码互相合并(融合)该有多好呀!所有模块开发完毕后,需要整合到一起,要能做到准确无误该有多好呀!
借助一个远程仓库,大家可以共享代码、历史版本等数据,便可以解决以上遇到的所有问题,在学习远程仓库前我们先来学习git clone path这个命令。
3**、创建共享仓库**
Git要求共享仓库是一个以.git结尾的目录。
mkdir repo.git 创建以.git结尾目录
cd repo.git 进入这个目录
git init --bare 初始化一个共享仓库,也叫裸仓库 注意选项–bare
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v8XUYyxy-1572681539940)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879781133.png)]
这样我们就建好了一个共享的仓库,但这时这个仓库是一个空的仓库,并且不允在这个仓库中进行任何修改。
4**、向共享仓库共享(同步)内容**
将自已开发的项目同步到这个目录中,其它开发者就可以共享你开发的项目了。
1、进入到yike目录
2、git push …/repo.git master
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pSPN8l3I-1572681539941)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879787510.png)]
这样便把yike中的项目同步进了repo.git中。
5**、从共享仓库里取出内容**
1、新创建一个目录(模拟另一个开发者)
2、git clone ./repo.git demo
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wp5MbFFw-1572681539942)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879792706.png)]
通过repo.git共享仓库,我们轻松得到了一个yike的副本
6**、通过demo仓库向repo.git共享内容**
进入到demo里,我们做一些修改
cd demo
git push …/repo.git master
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UnjfLCIL-1572681539943)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879799762.png)]
7**、在360仓库从repo.git获取共享的内容**
cd yike
git pull …/repo.git master
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W2zNOGFO-1572681539944)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879804997.png)]
奇迹似乎发生了,我们轻松的将demo仓库里的内容,通过repo.git共享给了yike仓库。
惊喜不断,问题也总是不断,我们发现我们这个共享的仓库只是放到了本地的,其它人是没有办法从我们这个共享仓库共享内容的!!!
然而现实是,办法总是有的!!!!
我们把这个共享的仓库放到一台远程服务器上,问题不就解决了吗?
如果我们熟悉服务器的话,我们完全可以将上述的步骤在我们的远程服务器上进行操作,然后再做一些登录权限的设置,就可非常完美的搭建一个共享服务器了。其实为了更好的管理我们的仓库,一些第三方机构开发出了Web版仓库管理程序,通过Web界面形式管理仓库。
gitHub关于它的名气与意义,大家可以自行查阅,我们这里介绍它的使用
1**、注册账号并完善资料**
2**、创建共享仓库*
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tgCHS3JC-1572681539946)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538880116732.png)]
3**、填写仓库资料**
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p6O3kkJM-1572681539947)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879890315.png)]
4**、共享仓库**
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VUje5zLM-1572681539948)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879905798.png)]
远程地址特别长,我们可以给他起一个别名
git remote add origin git@github.com:Botue/repo.git
这样origin 就代表 git@github.com:Botue/repo.git
当我们通过git clone 从共享仓库获内容时,会自动帮我们添加origin到对应的仓库地址,例如:git clone git@github.com:Botue/repo.git 会自动添加origin 对应 git@github.com:Botue/repo.git
5**、生成密钥**
ssh-keygen -t rsa 然后一路回车,这里会在当前用户生成了一个.ssh的文件夹
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MxKNOZoq-1572681539949)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538880070626.png)]
将id_rsa.pub公钥的内容复制
打开gitHub的个人中心
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cqtnz80m-1572681539950)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879930095.png)]
打到SSH keys
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PisdrfZh-1572681539951)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879936396.png)]
到此我们便可以通过gitHub 提供的Web界面来管理我们的仓库了。
我们发现通过gitHub管理仓库实在是太方便了,可是只能免费使用公开仓库,自已公司的代码当然不能公开了,可是私有仓库又是需要交“保护费”的,无耐国人还是比较喜欢免费的,网络界总是有很多雷峰的,比如gitLab!!!
gitLab也是一个可以通过Web界面管理仓库的网站程序,我们可以把它架设到公司自已的服务器上,实现仓库私有化,这也是大部分公司通常采用的方法,其使用方法与gitHub十分相似。
我将闲置电脑配置成了一台服务器,上面架设了gitLab程序,我们接下来的练习全部会在gitLab上进行演示。
省略很多内容…
git config配置本地仓库
常用git config --global user.name、git config --global user.email
git config --list查看配置详情
git init 初始一个仓库,添加–bare可以初始化一个共享(裸)仓库
git status 可以查看当前仓库的状态
git add“文件” 将工作区中的文件添加到暂存区中,其中file可是一个单独的文件,也可以是一个目录、“*”、-A
git commit -m ‘备注信息’ 将暂存区的文件,提交到本地仓库
git log 可以查看本地仓库的提交历史
git branch查看分支
git branch“分支名称” 创建一个新的分支
git checkout“分支名称” 切换分支
git checkout -b deeveloper 他健并切到developer分支
git merge“分支名称” 合并分支
git branch -d “分支名称” 删除分支
git clone “仓库地址”获取已有仓库的副本
git push origin “本地分支名称:远程分支名称”将本地分支推送至远程仓库,
git push origin hotfix(通常的写法)相当于
git push origin hotfix:hotfix
git push origin hotfix:newfeature
本地仓库分支名称和远程仓库分支名称一样的情况下可以简写成一个,即git push “仓库地址” “分支名称”,如果远程仓库没有对应分支,将会自动创建
git remote add “主机名称” “远程仓库地址”添加远程主机,即给远程主机起个别名,方便使用
git remote 可以查看已添加的远程主机
git remote show “主机名称”可以查看远程主机的信息
没错,Git非常强大!
但是,如果我们的分支不加以规范管理,也有可能适得其反!
1、不要有太多的树杈(子分支)
2、要有一个“稳定分支”,即master分支不要轻意被修改
3、要有一个开发分支(developer),保证master分支的稳定性
4、所有的功能分支(feature)从developer创建
5、所有功能开发完成后新建发布分支(release)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8bCpvatM-1572681539951)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879965615.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ixc1mf2Z-1572681539953)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879970239.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vd5IgEwG-1572681539953)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879974923.png)]
假如两个开发同时改到同一文件的同一段内容会发生什么事情呢?
这时就会就会产生冲突了,当冲突产生后,需要开发者进行协商确认冲突的原因,然后将冲突代码删除重新提交就可以了。
熟悉掌握以上操作,基本上是可以满足日常开的需要的,但是在解决一些特殊问题时,就又需要我们能够掌握更多的命令。
在项目根目录下创建一个.gitignore文件,可以将不希望提交的罗列在这个文件里,如项目的配置文件、node_modules等
https://github.com/github/gitignore
当内容被修改,我们无法确定修改哪些内容时,可以通过git diff来进行差异比较。
git difftool 比较的是工作区和暂存的差异
git difftool “SHA”比较与特定提交的差异
git difftool “SHA”“SHA”比较某两次提交的差异
git difftool 分支名称 比较与某个分支的差异
2**、回滚(撤销)操作**
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-buLXQ4n9-1572681539954)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538879988825.png)]
HEAD 默认指向当前分支的“末端”,即最后的一次提交,但是我们通过git reset 可以改变HEAD的指向。
看情况解释(稍微复杂一些,理解就好)
1、git reset
–hard 工作区会变、历史(HEAD)会变, 暂存区也变
–soft 只会变历史(HEAD)
–mixed(默认是这个选项)历史(HEAD)会变、暂存区也变,工作区不变
2、git checkout
git checkout SHA – “某个文件”,代表只是从SHA这个版中取出特定的文件,
和git reset 是有区别的,reset 重写了历史,checkout 则没有。
在项目开发过程中,经常性的会遇到远程(共享)仓库和本地仓库不一致,我们可以通过git fetch 命令来更新本地仓库,使本地仓库和远程(共享)仓库保持一致。
git fetch “远程主机”
或者
git fetch “远程主机” “分支名称”
我们要注意的是,利用git fetch 获取的更新会保存在本地仓库中,但是并没有体现到我们的工作目录中,需要我们再次利用git merge来将对应的分支合并(融合)到特定分支。如下
git pull origin 某个分支, 上操作相当于下面两步
git fetch
git merge origin/某个分支
问题:如何查看远程主机上总共有多少个分支?
git branch -a 便可以查看所有(本地+远程仓库)分支了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6uq4lYng-1572681539955)(C:\Users\QD\AppData\Roaming\Typora\typora-user-images\1538880003097.png)]
删除远程分支git push origin --delete 分支名称
删除远程分支git push origin :分支名称
