title: Git
date: 2017-04-13 22:27:25
tags: blog和git
Git是通过监控文件的状态来实现版本的控制的。
文件的三种状态分别是已提交(commotted)、已修改(modified)、已暂存(staged)。
状态改变Git都是可以监听到的。由此引入对应Git项目的。
Git的三个区域介绍
Git仓库目:就是Git用来保存项目的源数据和对象数据库的地方。Git中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
工作目录:是对项目的某个版本独立提取出来的内容。这些从Git仓库的压缩数据库中提取出来的文件,放在磁盘上供用户使用或修改
暂存区域:是一个文件,保存了下次将提交的文件列表信息,一般在Git仓库目录中。有时候也被称作“索引”(Index),不过一般说法还是叫暂存区。
Git的基本工作流程
在工作目录中修改文件。
暂存文件,将文件的快照放入暂存区域。
提交文件,找到暂存区域的文件,将快照永久性存储到Git仓库目录。
Git操作方法和命令
本地仓库
根目录右键,打开Git Bash。
输入git init
初始化一个git仓库。
这样就可以让git来管理目录。这个命令只是创建了一个名为.git的隐藏目录,这个目录就是存储我们历史版本的仓库。
添加到缓存
git add *
将已修改的文件放到暂存区,也可以直接写文件名或者文件夹名,git会自动过滤空目录。
查看状态
git status
检测当前仓库文件的状态,红色表示被修改,放到暂存区的文件被标记成了绿色等待提交。
git checkout index.html
将index.html从暂存区还原到工作区。
提交
git commit -m '提交信息'
-m是mark的意思,将暂存区的内容全部文件提交,将暂存区被标记成绿色的文件,全部提交到本地仓库存储。
其他
git log
查看存盘点,每次提交会生成一个随机id值
git reset --hard id值
还原代码到该id值得版本
第一次使用git时需要配置。
git config --global user.name pj.Yu
设置自己的名字。
git config --global user.email [email protected]
设置自己的邮箱
Git分支
同时开发多个需求的情况十分常见,比如当你正在专注开发一个功能时,突然有一个紧急的BUG需要来修复,这个时候我们当然希望在能够保存当前任务进度,再去修改这个BUG,等这个BUG修复完成后再继续我们的任务。通过Git创建分支来解决实际开发中类似的问题。
开发时在另一个分支上开发新功能A然后上线,然后再写另一个分支另外一个功能B,这时A功能有bug再去调试,不会影响其他分支的状态。
当我们初始化仓库时候,实际上就是产生了第一次提交。Git会默认帮我们创建一个master的分支,每次commit操作生成一个新的版本(存盘点)。而且会生成一个sha值,master是主干,这些版本就是在主干上的存盘点,每一次的历史按本都是基于分支存在的。
分支功能基本操作
建立新的分支
git branch share
建立一个名为share的分支,建立后现在还是在master主干上。
git checkout share
切换到share分支,切换之前尽量先commit。
git branch
查看当前都有哪些分支。*号表示当前处于哪个分支。
git checkout -b share
创建并切换到share分支
另外分支是有继承关系的。新建的自分支会继承父分支的所有提交历史。
合并两个分支
git merge share
当前分支合并share分支。同一个文件被修改会产生冲突。
<<<<<<<<<<< HEAD
冲突开始的位置
===========
之上是当前分支的代码,之下是share分支的代码
>>>>>>>>>>> share
冲突结束的位置
根据需求留下想要的代码,将标识符都删除掉就解决冲突了。
删除分支
git branch -d share
删除share分支
git的分支管理规范(主要指在gitLab上的分支)
不要有太多的分支,分支太多管理起来太费劲,毕竟是多人开发制定策略太复杂
要有一个稳定的平行分支,即master分支不要轻易修改,这个稳定的文分支不能有bug。
要有一个开发分支(developer),保证master分支的稳定性
所有的功能分支(feature)从developer创建,功能写完后合并到developer,但不能直接合并到master,因为要保证始终有一个没有bug的稳定分支
所有功能开发完成后新建发布分支(release),用作测试,测试完全没问题就合并到master分支。
GitHub
多个人共同开发,改完代码后放到共享仓库,其他人就可以取到代码。借助一个远程仓库,大家可以共享代码、历史版本等数据,GitHub就是这样的一个代码仓库。
在gitHub中新建一个项目
首先创建一个新的项目,要输入项目名,项目描述,是否公开。其实就相当于新建一个共享库。
以表格形式创建一个仓库,并且会提供给我们一个仓库地址。
由于主机名太长,可以简写成主机名。以后只填写主机名就行,就不用写远程仓库地址了
git remote add "主机名" "远程仓库地址"
添加远程主机,其实就是给远成仓库地址起一个比较短的名字
git remote show "主机名"
查看这个主机名对应的主机名是谁
git remote
显示所有主机名
地址下面会告诉用户应该怎样操作,如何创建.git并上传等设置,这里根据自己的实际情况,并不是每一步骤都要设置,有可能之前已经设置好了
设置之后就可以push了,但是这时会有权限问题,也就是公钥和私钥,需要将本电脑的公钥传到gitHub上,
设置公钥
为了免密码共享代码需要通过SSH来实现:
ssh-keygen -t rsa
创建一个公钥,一直回车。在用户的文件里创建了一文件夹.ssh里边创建了对公钥和私钥.pub是公钥。
将公钥放到gitHub对应账号下,在个人设置里有SSH的选项,复制进去就行。相当于在自己电脑和gitHub之间建立了连接。私钥不需要管。
如果有两台电脑就要添加两个SSH key
git push 仓库地址 分支
将本地提交的更改推送到远程仓库。
git pull 仓库地址 分支
将远程仓库的代码拉取到本地仓库。
git push origin 本地的分支:远程仓库分支
把本地分支的修改共享到远程的分支上去 如果远程没有这个分支就会创建一个。
fork功能
GitHub除了创建共享仓库,还有一个目的是coding,大家一起来共享代码
这里的项目都是公开的开源项目,除了自己可以维护功能,其他来自全世界的人都可以共同进行开发,并且其他开发者可以对原有的项目进行修改
但是程序员水平参差不齐,所以项目不允许其他人直接修改。需要先forking一份到自己的目录下,然后通过克隆、pull、push等操作,修改自己目录下的这份副本。
自己改完以后经过自己测试,没问题的话可以申请原有项目合并自己的修改。申请合并是pull requests选项,在gitLab中是Merge Requests选项。要填写合并哪个项目的哪个分支,还要填写更改的说明,和发邮件类似,这样发送请求就成功了。
对方会受到申请并且检验,如果对方觉得改的不错,同意后可进行合并,否则拒绝
克隆远程仓库
当远程仓库已经有项目了,项目已经开始开发了,可以执行克隆操作。
git clone "仓库地址"
拿下来的就是仓库了,就不用再执行init了。
克隆下来后,查看分支,当前只有master分支,因为克隆的就是主干分支。
git fetch "仓库地址"
这时就把其他分支都拿下来了
git branch -A
可以看远程仓库的分支,除了主干都是红色的
总结来看,我如果使用克隆功能,相当于完成了以下步骤:
mkdir 目录 -> cd 目录 -> git init -> git remote add origin "仓库地址" -> git pull origin master
GitLab
通过GitHub管理仓库实在是太方便了,可是只能免费使用公开仓库,私有仓库又是需要交“保护费”的,而gitLab就是免费私有的这么一个网站。
gitLab也是一个可以通过Web界面管理仓库的网站程序,我们可以把它架设到公司自已的服务器上,实现仓库私有化,这也是大部分公司通常采用的方法,其使用方法与gitHub十分相似。
给项目添加成员
进入一个项目后,右上角的设置有个Menbers选项,就是成员的意思,如果希望有个人一起合作写这个项目,就可以邀请并分配权限,通常分配Developer权限。现在对方就可以随意push代码,但是不能操作master分支。
分组
很多时候我们需要创建一个分组,相当于建立一个群Groups,在左边的菜单栏里。
分组可以直接添加分组成员,步骤和项目添加成员相同。
在分组里可以建立项目,作为小组的成员也会自动生成一个项目目录,大家就可以一起开发这个项目,之后的步骤和上面相同。
Protexted Branches
受保护的分支,默认情况下保护的是master分支, 也可以自行根据权限设置保护的分支。
gitignore 忽略文件
有些文件不需要提交,比如笔记,图片等。这时就可以忽略掉
忽略方式:创建一个没有文件名的.gitignore后缀文件,通过另存为来保存。也可以用命令行创建将要忽略的文件名存进去,就忽略了。
比较差异
当内容被修改时,我们无法确定修改哪些内容时,可以通过git diff来进行差异比较。
用git difftool
比较暂存区和修改的文件的差异
接一个sha值比较暂存区和历史记录的差异,两个sha值就是历史版本和历史版本的差异
回滚(撤销)操作
如果刚刚上传完后又发现一个bug, 可以用git reset
把某一个版本的代码还原到工作目录。
--hard 工作区会变,历史会变,暂存区也会变。
--soft 只会变历史区域的代码,即是回滚在工作区也看不见。
--mixed 历史会变,暂存区也会变,工作区不变。
工作区指的能看的见的代码。
.git目录就是仓库区域。
暂存区也在.git目录下,就是index文件。
git checkout SHA值 -- index.html
只拿出index到工作区中,其他文件不变 历史不变
更新仓库
在项目开发过程中,经常性的会遇到远程(共享)仓库和本地仓库不一致,我们可以通过git fetch
命令来更新本地仓库,使本地仓库和远程(共享)仓库保持一致。
git fetch "远程主机"
或者git fetch "远程主机" "分支名称"
获取的更新会保存在本地仓库中,但是并没有体现到我们的工作目录中,需要我们再次利用git merge
来将对应的分支合并(融合)到特定分支。
用git merge remotes/主机名/分支名
当前分支合并remotes/主机名/分支名
也可以用git pull 主机名 分支名
,这个命令等于做了两个操作,git fetch
和 git merge origin/某个分支
git branch -a
便可以查看所有(本地+远程仓库)分支了
git push origin --delete 分支名称
可以删除远程分支。