Git的使用
一.Git简介
CVC,SVN等版本管理系统是集中式的版本管理系统,这些集中式的版本管理系统不但速度慢,而且必须联网才能使用.而Git则是一个分布式的管理系统.Git的两大特点:
1.能够进行版本控制,可以解决多人开发的版本问题,同时可以解决找回历史代码的问题.
2.分布式:Git是分布式版本管理系统,同一个Git仓库.可以分布到不同的机器上.分布式的管理系统首先具有一个中央服务器,中央服务器上会保存一个代码的完整版本,其他人进行代码开发时,将代码copy到自己的电脑上(集中式的版本控制系统也存在一个中央服务器电脑,在进工作时也需要将代码copy到自己电脑上,在修改完之后就需要将代码上传到中央服务器电脑上,但是在中央服务器挂掉之后,便无法继续开展工作),可以自行搭建服务器,也可以使用GitHub等网站来作为远程服务仓库.
二.创建版本库
1.新建一个目录git_test,执行git的初始化命令 git init,随后在文件夹中将会存在一个.git的文件夹(该文件是一个隐藏文件夹);
2.在该目录下创建一个文件,随后提交至git:
git add code.txt //将该文件添加到git中
git commit -m '版本 1'; //提交版本 并添加一个当前版本的说明
3.查看版本的记录:使用 git log命令,可以看到一段hash序列号(版本序列号),
4.修改code.txt中的内容,再次上传代码,再次使用git log 就可以看到两个版本
三,Git创建版本流程
1.在创建版本时,git进行了一次记录,记录了当前所提交的code.txt中的内容.
2.当我们再次创建一个新的版本时git又会新增一条记录,并且会和前一个版本相关联(只做增量记录,不是完整的的拷贝,只记录文件的修改,因此后面一个版本依赖于前面的版本)
四.版本的回退
当我们发现需要回退版本时,需要知道:我们每一次最新创建一个版本时,会有一个指针指向他(最新的版本),该指针被称为head,head的前一个版本就可以使用head^来表示,前两个版本就可以使用head^^来表示,以此类推,如果需要回退到前20个版本可以使用head~20来表示head的前20个版本.例如当前我们希望从版本2回退到版本1可以使用如下命令: git reset --hard HEAD^;
在我们回退到版本1后,git并没有删除版本2,只是将head指向了版本1,因此我们就无法使用head去寻找到版本2,我们可以使用版本序列号去让head重新指向版本2: git reset --hard 70c096d4e357e5(可以只赋值部分);
但是当我们无法查看历史去获取版本2的序列号,这是我们可以使用命令git reflog 来查看之前的操作记录来获取序列号的内容信息;
四.Git工作区和版本库
工作区:Git所帮我们管理的目录就是工作区,我们所编辑的代码就是在工作区;
版本库:位于目录下的.git文件就是一个版本库,在版本库中存在一个暂存区.git只会将当前已经存放在暂存区的文件提交到版本库中,同时我们可以使用git status来查看当前暂存区中的状态,对于新建,修改后未添加到暂存区的文件,git 可以给出提示.
五.git撤销修改
我们可以使用git add 将文件添加到git的暂存区,同时我们也可以使用git checkout -- fileName 将修改后为存放至暂存区的修改移除(丢弃他的改动).;如果当前的修改已经添加到了暂存区中,我们可以使用git reset HEAD fileName 来清除添加到暂存区的修改.如果说已经将修改添加到了版本库中,那么就要来进行版本的回退.
六.对比文件的不同
对比工作区的文件和版本库中的某一个文件进行对比:使用 git diff HEAD -- fileName
比较head版本和head之前的版本的某一个文件的区别: git diff head head^ -- fileName
七.删除文件
无论我们是删除,创建,修改文件,都是我们对工作区的改动,我们可以使用git checkout来撤销我们对工作区的改动
我们可以将删除的改动使用git add 来存放到暂存区,同时我们也可以使用 git rm code.txt
如果此时我们的版本记录过多,可以使用git log --pretty=ontline来进行简短的显示.
八.小结
1.初始化版本目录: git init
2.添加文件到暂存区 git add;
3.提交暂存区到版本库中 git commit -m '说明',版本之间只记录版本的差异性
4.版本回退: git reset --hard head^(使用尖括号来表示当前版本是head版本前的那个版本,一个^表示head的前一个版本);也可以使用git reset --hard 版本序列号的形式来进行版本的回退;
5.查看操作记录:git reflog;
6.git工作区,暂存区,版本库:我们所做的文件编辑文件都是在工作区进行的,修改记录可以提交至暂存区,我们可以将暂存区中的记录提交为一个版本;
7.版本的回退:使用git checkout -- fileName 可以将未提交到暂存区的文件进行修改的回退;使用git reset HEAD fileName 将暂存区的修改进行撤销,和后使用checkout进行操作修改的回退;如果当前的操作已经进行了版本的提交,那么可以进行版本的回退;
8.对比文件的不同:对比工作区和版本库中文件的不同 git diff HEAD -- fileName表示工作区中的文件和HEAD版本之间的不同;使用 git diff HEAD^ HEAD -- fileName可以用来对比版本库中文件之间的不同;
9.删除文件:可以使用rm 来进行文件的删除,同时我们也可以使用 gir rm filrName来进行文件的删除操作的提交.同时我们也可以进行删除操作的回退;如果我们新创建了一个文件,还未添加到文件的暂存区.此时我们直接编辑文件的内容.此时如果我们进行了删除,那么就无法进行删除了.
九.分支的管理--创建于合并分支
分支可以理解为工厂中的两条流水线,并不存在任何的关系.当协作开发发生冲突问题时,可以采用分支的形式进行开发,最后期将分支合并.
Git将我们的提交都串联成一个时间线,这条时间线就是一个分支,在git中这个分支就是主分支,及master分支.HEAD严格来说不是直接指向版本,而是指向当前的分支,分支再指向当前的版本.Git创建新的分支实际上只是创建了一个新的指针指向了新的版本,同时改变HEAD指针的指向.
同理Git进行分支的合并也是非常快的(只是指针的移动);在合并分支后,我们可以删除其余的分支,只留下一个master分支.
十.分支的基本操作
1.指向git branch 可以查看当前在几个分支下进行工作:默认只具有一个master分支;
2.创建并指向一个新的分支:git checkout -b dev 即创建并切换到dev分支:实际上只是创建了一个新的指针同时将HEAD指向了新的分支指正.(例如原先HEAD指向master,master指向某个版本.)
3.修改并提交记录:只发生在dev 分支中,并不会影响到master分支.
4.切换回到master 分支:git checkout master;
5.合并分支;git merge dev:
默认为fast-forward快速合并(仅仅只是指针的移动).有时无法使用快速合并(存在冲突),在合并完成之后,我们可以删除之前的分支:git branch -d dev;如果当前非分支为合并,还想继续删除可以使用git branch -D dev来进行强制的删除.
十一.解决冲突
有时候合并分支并不总是会成功的:创建一个新的分支dev,而后去修改code.txt中的内容并进行一个提交(此时的提交修改发生在dev分支中).而在master分支中也进行了code.txt的修改,并提交到了版本库,这样就产生了两个平行的分支了(互不干扰).此时进行合并会发生如下错误:
会提示存在冲突,需要在解决冲突后才能进行合并.此时使用git status命令可以查看到提示存在冲突同时修改 both modified;查看code.txt可以进行冲突的合并管理.而后将该文件重新add至暂存区进行commit而完成冲突的管理.
可以使用git log --graph --pretty=oneline来查看当前的分支提交情况:
十二.分支管理策略
通常情况下我们在管理分支时,可能的话git会采用快速合并的模式,但是有些时候快速合并不能成功,而且有没有发生冲突,此时git会帮助我们在合并之后做一次新的提交.但是这种模式下删除分支后将会丢掉修改信息.
1.创建切换到dev分支下;
2.新建一个文件code2.txt并进行一次新的提交(在dev分支下);
3.切换回master分支也做一次新的提交(吸怪了code.txt);
4.此时如果进行分支的合并并不会发生冲突.但是并不能使用快速提交,将会在合并时进行一次新的提交,在合并时会弹窗让我们进行合并的说明:
5.虽然他默认支持快速合并,但是我们可以阻止款速合并,在进行合并的同时需要进行一次提交:并不存在冲突,在默认进行快速合并时,我们可以手动禁止快速合并(使用git merge --no-ff -m):
十三.bug分支
在软件开发过程中,我们可能会遇到bug,通常我们都会新增一个临时的分支来进行bug的修复,在修复完毕之后再进行分支的合并处理.例如在遇到需要修复的bug时,手头的开发任务并没有完成,还无法进行提交(预计还需要一天才能完成开发任务),此时有需要在两个小时内进行bug的修复,我们可以使用如下命令来进行当前工作的保存:
1.git stash:可以将当前的工作现场保存起来,而后恢复这个现场进行工作:在新的dev分支中进行code3.txt的编辑,而此时需要去修复bug,使用git stash将当前的现场保存起来.
2.新建一个临时的分支来保存这个bug的修复(分支bug001):修复完毕之后进行一次提交(j禁用快速提交,否则我们无法看到bug修复的提交);
3.在修复完成bug 后我们可以回到dev分支,使用git stash list列出我们保存的工作现场,使用git stash pop 来恢复我们的工作现场;
十四.分支使用小结
1.分支的概念:分支之间互不影响.分支的创建,删除,,
2.分支合并的冲突:两个分支同时对一个文件进行了修改同时将此修改记录进行了提交,需要手动解决并进行一次提交.
3.默认使用快速合并,在进行合并时我们可以使用--no-ff 来禁用快速合并
4.bug分支的使用:使用git stash来保存工作现场,创建并切换到临时的bug分支进行bug的修复,在进行bug修复完毕之后,合并临时分支的内容.
5.删除临时分支,回到工作分支,进行工作现场的恢复.
十五.Git仓库的使用
在我们进行开发的时候,到目前为止,我们都是在本地电脑中进行的操作.此外我们还可以使用中央服务器来保存我们的版本库信息.所有开发者后可以从服务器上拉取代码进行开发.我们可以使用GitHub,Gitee(码云)来承担中央服务器的角色.
1.注册登录GitHub网站:在GitHub仓库中我们可以进行仓库的创建;
2.在创建仓库时,我们可以创建公有库和私有库(private);
3.添加.gitIgnore文件:可以用来告知git忽略哪些文件,及时提交了这些文件,也会被忽略.
4.使用ssh秘钥添加授权;
十六.生产电脑的ssh公钥
1.找到.gitconfig文件,通常在C盘用户文件夹下;
2.生成SSH公钥:执行命令ssh-keygen -t rsa -C '注册邮箱';生成成功则会告知所在路径;
十七.克隆项目
在完成仓库创建之后,我们可以从git地址上来克隆当前的项目,进行开发;
1.使用ssh来进行clone:git clone 地址;
2.使用git branch查看发现只有一个master分支;通常不在master分支上进行代码的开发,而在一个自己创建的分支上进行开发.并将代码上传;
3.将代码推送至git仓库中;
十八.项目代码的推送
1.git push origin 分支名称:其中origin代表了远程的分支,即将该分支上所有的本地提交推送到远程库中;
2.将本地的分支跟踪远程的分支:如果本地分支的提交与远程分支不一致的话,那么会进行提示;git branch --set-upstream-to=origin/smart smart表示让本地的smart分支来跟踪远程的smart分支;
3.可以使用git push将本地的上传推送到远程中;
4.使用git pull origin smart:将远程分支对应的smart分支上的代码拉取到本地;
十九,工作中git的使用
1.在项目开发之初由项目经理等搭建项目的框架.
2.在项目开始之后在自己电脑上生产ssh的公钥,并将公钥提供给项目管理者,并通过项目的克隆地址将代码克隆到本地电脑中.
3.在本地创建一个分支来进行项目的开发,在开发完毕之后将代码推送到远程;通常项目中存在两个分支master以及dev分支:master分支时用于保存发布的项目代码,而dev分支则用来保存开发过程中的代码,所有的组员在开发完自己的代码之后都需要将自己的代码发布到远程的dev分支上.