Git版本管理器与猫脸五爪鱼
(声明:内容按个人实践经验并部分整合自网络,供学习参考)
一、git软件是什么?它与SVN有什么异同?
Git 是一个快速、可扩展的分布式版本控制系统,它具有极为丰富的命令集,对内部系统提供了高级操作和完全访问。
svn属于集中化的版本控制系统:有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的成员通过客户端连接到这台服务器,进行文件上传和更新。
优点:a.使用简单,比较符合我们的常规思维。b.同步代码比较简单,只要一步操作即可。
缺点:a.丢失数据的风险:最显而易见的,由于集中化的特点,如果版本库的服务器磁盘发生故障等,你不能保证所有的数据已经有人提取出来了,最坏的情况是彻底的丢失整个项目的所有历史更改记录。b.网络中断的情况下,协作就无法进行了,因为无法连接服务器进行上传和更新。
git属于分布式版本控制系统:客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。
优点:a.由于任何人每次提取操作,实际上都是一次对代码仓库的完整备份,因此近乎所有的操作都可以在本地执行,速度就是相当的快,并且可以在网络断开的时候操作仍然不受影响,可以频繁的进行提交更新,等到有网络的时候再上传到远程的镜像仓库就可以了。b.文档很详细,并且命令行的提示也很到位,用起来比较得新应手,而且很多的设置与操作跟linux操作很相近(不亏是linux之父创造的)。c.git的分支模型,相当的轻量级,被称为“必杀技”。
缺点:a.每个开发人员都拥有所有的代码,不利于核心代码的保密(如果有重要代码需要保密,则不建议使用git)
Git和SVN之间的五个基本区别:http://blog.jobbole.com/31444/
http://www.cnblogs.com/shenliang123/p/3824383.html
二、git的编译安装
1,安装依赖的包
#yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc cpio perl
2,下载git压缩源码包
#Wget https://github.com/git/git/releases/tag/v2.8.0.tar.gz
3,将目录切换到压缩包包所在目录tools,
执行命令:tar zxvf git.v2.8.0.tar.gz -C /usr/local
4, 并将解压的目录git-v2.8.0修改名称为git
执行命令:mv /usr/local/git-v2.8.0 /usr/local/git
5,编译并安装
make
make install
6,查看git版本号
git --version
7,# whereis git
在/etc/profile 中添加export PATH=/usr/local/git/bin:$PATH
不用重启:# source /etc/profile
三、开启远程网络连接
△前提开启ssh远程服务器:service sshd start
Or: service sshd restart
△查看ssh服务有没有运行: ps -e | grep ssh
△再看下这个ssh服务的网络连接情况: netstat -ntlp
△关闭linux下的ssh服务:killall sshd -9
或 :service sshd stop
四、SSH Key的配置:
1.
》创建Github账号,https://github.com
》Windows下打开Git Bash,创建SSH Key,按提示输入密码,可以不填密码一路回车
$ ssh-keygen -t rsa -C "注册邮箱"
然后用户主目录/.ssh/下有两个文件,id_rsa是私钥,id_rsa.pub是公钥
2.获取key,打开.ssh下的id_rsa.pub文件,里面的内容就是key的内容
$ vim ~/.ssh/id_rsa.pub
3.登录GitHub,打开"SSH Keys"页面,快捷地址:https://github.com/settings/ssh
4.测试ssh key是否成功,使用命令“ssh -T [email protected]”,
如果出现You’ve successfully authenticated, but GitHub does not provide shell access 。
这就表示已成功连上github。
五、哪什么又是github?
GitHub是一个利用Git提供免费的代码托管服务的网站(类似的网站还有老牌的SourceForge),很多著名的项目都托管在上面。
要想在GitHub上参与开源项目,根据Git的使用方法,有两种途径可以实现。
第一种是项目的创建人将你添加到项目的合作贡献者列表中,这样你就可以直接向这个项目推送代码。
第二种是Fork一份代码到自己的空间下,这样的一份代码自己具有推送的权限。如果开发的进展很好,项目的创建者可以将Fork的这些项目添加为Remote仓库,在他认为合适的时候将代码fetch到自己的仓库中进行合并,也可以由我们发起请求,请创始人将代码合并。GitHub上提倡的就是使用这种方式进行开发合作。
Git 支持许多数据传输协议,包括本地传输、 git://协议、http(s):// 或者 SSH传输协议 [email protected]:/path.git,除了HTTP协议之外,其他所有协议都要求在服务器端安装并运行Git。
使用远程仓库
要参与任何一个 Git 项目的协作,必须要了解该如何管理远程仓库。远程仓库是指托管在网络上的项目仓库,可能会有好多个,其中有些你只能读,另外有些可以写。同他人协作开发某 个项目时,需要管理这些远程仓库,以便推送或拉取数据,分享各自的工作进展。管理远程仓库的工作,包括添加远程库,移除废弃的远程库,管理各式远程库分 支,定义是否跟踪这些分支,等等。
以现在比较流行的GitHub为例,如果我在上面创建了一个项目,实际上相当于使用 git init 新建了一个服务器端的仓库。如果我想在本地进行开发,那么我就需要 git clone 到我的本地。做了一些开发之后,我可以 git push 将本地的修改推送到服务器仓库中。随着项目发展,有其他人想要参与到这个项目中来,他可以在GitHub上Fork我这个项目,这样他对这个项目才有写权限,而且可以将他的工作保存到GitHub的服务器上。如果他希望将自己的工作提交给我,首先他需要在本地开发环境中添加我的远程仓库 git remote add。然后 git push remotename master 发起推送的请求,如果我接受了,他的工作就可以合并到主干中了。因为我们此时是并行开发,如果他想看我的工作,可以采用 git pull remotename 的方式将我所做的修改拉取到本地,非常的方便。
六、两地仓库关联操作
同步github到本地
1、复制项目到本地:
git clone git://github.com:xxxx/test.git ##以gitreadonly方式克隆到本地,只可以读
git clone [email protected]:xxx/test.git ##以SSH方式克隆到本地,可以读写
git clone https://github.com/xxx/test.git ##以https方式克隆到本地,可以读写
git fetch [email protected]:xxx/xxx.git ##获取到本地但不合并
git pull [email protected]:xxx/xxx.git ##获取并合并内容到本地
本地提交项目到github
1、本地配置
git config --global user.name ‘用户名‘
git config --global user.email ‘注册@邮箱.com‘ #全局联系方式,可选
2、新建Git项目并提交到Github。
mkdir myptree & cd myptree
touch listen.md
git init #初始化一个本地库
git add listen.md #添加文件到本地仓库
git rm listen.md #本地倒库内删除
git commit -m "first commit" #提交到本地库并备注,此时变更仍在本地。
git commit -a ##自动更新变化的文件,a可以理解为auto
git remote add origin [email protected]:sangredo/JobProg.git #增加一个远程服务器的别名。
git remote rm origin ##删除远程版本库的别名
git push -u origin master #将本地文件提交到Github的origin版本库中。此时才更新了本地变更到github服务上。
第一次提交项目遇到报错,如何解决failed to push some refs to git?
方法:此时很多人会尝试下面的命令把当前分支代码上传到master分支上。
$ git push -u origin master
但依然没能解决问题,,出现错误的主要原因是github中的README.md文件不在本地代码目录中。
可以通过如下命令进行代码合并【注:pull=fetch+merge】
git pull --rebase origin master
执行上面代码后可以看到本地代码库中多了README.md文件
此时再执行语句 git push -u origin master即可完成代码上传到github。如下所示:
到网上查看结果:【刷新】
要添加的listen.md出现了。
分支版本操作
1、创建和合并分支
git branch #显示当前分支是master
git branch new-feature #创建分支
git checkout new-feature #切换到新分支
vi page_cache.inc.php
git add page_cache.inc.php
git commit -a -m "added initial version of page cache"
git push origin new-feature ##把分支提交到远程服务器,只是把分支结构和内容提交到远程,并没有发生和主干的合并行为。
2、如果new-feature分支成熟了,觉得有必要合并进master
git checkout master #切换到新主干
git merge new-feature ##把分支合并到主干
git branch #显示当前分支是master
git push #此时主干中也合并了new-feature的代码