设为首页 收藏本站
查看: 996|回复: 0

[经验分享] git-Chen鲁玉的博客

[复制链接]

尚未签到

发表于 2018-9-16 10:23:26 | 显示全部楼层 |阅读模式
  三种版本控制系统
  三种版本的的区别
  git (是个软件) 是一种工具
  

githud (网站) 全球最火的代码库  上传所有代码 开源  权限控制不自由  

  
gitlad(网站)  权限控制上更灵活(可公开,可不公开)不收费 共有仓库 专门储存代码
  

  什么是集中式?
  集中式开发:是将项目集中存放在中央服务器中,在工作的时候,大家只在自己电脑上操作,从同一个地方下载最新版本,然后开始工作,做完的工作再提交给中央服务器保存。这种方式需要联网,现在云开发就是这样的处理方式。
  缺点:1.如果网络出现异常或者很卡,直接影响工作效率。如果是中央服务器挂了,那就集体喝茶去了。
  2.还有一种情况,各自电脑中操作的所有软件工具,都存放在一个中央服务器上(现在流行叫云服务器),只需要用各自电脑登陆连接到云服务器上,(一般服务 器都是用linux),比如用ps工具,大家其实用的是云服务器中的同一个ps  软件,在使用率高的情况下,ps会出现异常,当用ps筛选颜色的时候,已经混乱,无法正常选择颜色,这个情况是我在开发中遇到的。以前我们是每个人用各自 安装的ps,但是在这样的环境下用的是同一个ps软件的时候就会有bug。
  3.安全度不高,重要的东西都放在一个中央服务器中,如果被黑,那损失就大了。
  优点:1.减少了硬件和软件成本,硬件不用说了,现在流行盒子,一个小盒子只要连上中央服务器即可,以前都是一个个主机箱,那成本大多了。如果用到工具软件需要收费,只需买一套正版就OK了。
DSC0000.jpg

  什么是分布式?
  分布式开发:只要提供一台电脑作为版本集中存的服务器放就够了,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它也一样干活,只是交换修改不方便而已。而每一台电脑有各自独立的开发环境,不需要联网,本地直接运行,相对集中式安全系数高很多。
DSC0001.jpg

  git部署
DSC0002.jpg

  环境:
  centos7u4
  vm20    192.168.245.139  充当中央服务器
  vm21    192.168.245.249
  安装:所有机器都安装

  yum install git -y
  #git --version
  git version 1.8.3.1

  准备:
  因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。
  注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

  git config --global user.email "wing@qianfeng.com"
  git config --global user.name "wing"

  版本库:
  又名仓库,英文名repository,可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”.
  1.创建一个空目录:在vm20上创建

  [root@vm20 /]# mkdir gittest
  [root@vm20 /]# cd gittest/=

  2.通过git init命令把这个目录变成Git可以管理的仓库:
  方式1.创建本地库:
  这样创建的库其他机器可以clone,但是没办法push
  [root@vm20 gittest]# git init
  初始化空的 Git 版本库于 /gittest/.git/
  创建完成后查看库目录:
  [root@vm20 gittest]# ls -a
  .  ..  .git

git相关概念
  1.现有源文件:
  [root@vm20 gittest]# cat a.txt
  friday
  monday
  2.第一次修改:添加一行tuesday
  [root@vm20 gittest]# cat a.txt
  friday
  monday
  tuesday
  3.执行add:
  [root@vm20 gittest]# git add a.txt
  4.第二次修改:添加一行wednesday
  [root@vm20 gittest]# cat a.txt
  friday
  monday
  tuesday
  wednesday
  5.不做add,直接提交:
  [root@vm20 gittest]# git commit  -m "看看第二次修改有没有被commit"
  [master 0e14810] 看看第二次修改有没有被commit
  1 file changed, 1 insertion(+)
  [root@vm20 gittest]# git status
  位于分支 master
  尚未暂存以备提交的变更:
  (使用 "git add ..." 更新要提交的内容)
  (使用 "git checkout -- ..." 丢弃工作区的改动)
  修改:      a.txt
  修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
  注意:如果第二修改也被add了不会出现上面的提示
  6.查看当前版本和a.txt文件内容的区别(有输出内容,说明现在版本库和文件a.txt内容有区别,也就是第二次修改并没有被提交):
  [root@vm20 gittest]# git diff HEAD -- a.txt
  diff --git a/a.txt b/a.txt
  index 1091166..adfd1e9 100644
  --- a/a.txt
  +++ b/a.txt
  @@ -1,3 +1,4 @@
  friday
  monday
  tuesday
  +wednesday
  7.再次add后,发现工作区干净了,而且当前版本库HEAD和a.txt没有任何区别了:
  [root@vm20 gittest]# git add a.txt
  [root@vm20 gittest]# git commit  -m "再看第二次修改有没有被commit"
  [master fe18903] 再看第二次修改有没有被commit
  1 file changed, 1 insertion(+)
  

[root@vm20 gittest]# git status  
# 位于分支 master
  
无文件要提交,干净的工作区
  

  
[root@vm20 gittest]# git diff HEAD -- a.txt
  
[root@vm20 gittest]#
  

撤销修改
  撤销修改
  场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
  场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,
  就回到了场景1,第二步按场景1操作。
  场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,使用版本回退,不过前提是没有推送到远程库。(见下节)
  场景1: 源文件添加了一行thursday,还没有add到stage(前提:之前提交过此文件)

  [root@vm20 gittest]# cat a.txt
  wednesday
  thursday

  撤销刚才的修改:

  [root@vm20 gittest]# git checkout -- a.txt
  [root@vm20 gittest]# cat a.txt
  wednesday

  场景2:源文件添加了一行thursday,并且add到了stage(前提:之前提交过此文件)

  [root@vm20 gittest]# cat a.txt
  wednesday
  thursday
  [root@vm20 gittest]# git add a.txt
  [root@vm20 gittest]# git status
  位于分支 master
  要提交的变更:
  (使用 "git reset HEAD ..." 撤出暂存区)

  

修改:      a.txt  

  [root@vm20 gittest]# git reset HEAD a.txt
  重置后撤出暂存区的变更:
  M   a.txt
  [root@vm20 gittest]# cat a.txt
  wednesday
  thursday
  [root@vm20 gittest]# git checkout -- a.txt
  [root@vm20 gittest]# cat a.txt
  wednesday


版本回退
  场景3:已经提交到版本库
  查看现在的版本:

  [root@ansible gittest]# git log
  commit 898a61cb50da77daeda51453bef38c98fecd46a0
  Author: wing
  Date:   Sun Feb 25 18:04:27 2018 +0800
  test1
  commit d75411fb17e661cefc1900a09c8a784e8aa0d79a
  Author: wing
  Date:   Sun Feb 25 17:56:45 2018 +0800
  test1

  版本回退(切换):
  在Git中,上一个版本就HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
  回到上一个版本:

  [root@vm20 gittest]# git reset --hard HEAD^
  HEAD 现在位于 83f6e8d Signed-off-by: tom@up.com

  回到指定的版本(根据版本号):

  [root@vm20 gittest]#git reset --hard 6fe5b9a2

  消失的ID号:
  回到早期的版本后再查看git log会发现最近的版本消失,可以使用reflog查看消失的版本ID,用于回退到消失的版本
  [root@vm20 gittest]# git reflog
  32c31f5 HEAD@{0}: reset: moving to 32c31f54c1
  6fe5b9a HEAD@{1}: reset: moving to 6fe5b9a2
  928ab9e HEAD@{2}: reset: moving to HEAD^^
  83f6e8d HEAD@{3}: reset: moving to HEAD^
  6fe5b9a HEAD@{5}: commit: 这个能写中文
  83f6e8d HEAD@{6}: commit: Signed-off-by: tom@up.com
  32c31f5 HEAD@{7}: commit: add a line monday
  928ab9e HEAD@{8}: commit (amend): this is a new file test
  bee2ba0 HEAD@{9}: commit: this is a new file test
  c8e6b87 HEAD@{10}: commit: 添了两个
  fbecfa3 HEAD@{11}: commit: add haha
  7e99d94 HEAD@{12}: commit: 添加hello一行
  addd750 HEAD@{13}: commit (initial): test
  然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。

删除文件
  删除文件:
  从工作区删除a.txt,并且从版本库一起删除

  [root@vm20 gittest]# rm -rf a.txt
  [root@vm20 gittest]# git status
  位于分支 master
  尚未暂存以备提交的变更:
  (使用 "git add/rm ..." 更新要提交的内容)
  (使用 "git checkout -- ..." 丢弃工作区的改动)

  

删除:      a.txt  

  修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

  [root@vm20 gittest]# git rm a.txt
  rm 'a.txt'
  [root@vm20 gittest]# git commit -m "删除文件a.txt"
  [master 4bb90a4] 删除文件a.txt
  1 file changed, 4 deletions(-)
  delete mode 100644 a.txt

  [root@vm20 gittest]# git status
  #位于分支 master
  无文件要提交,干净的工作区
  删除了文件readme.txt之后又后悔了,恢复回来

  [root@vm20 gittest]# ls
  readme.txt
  [root@vm20 gittest]# rm -rf readme.txt
  [root@vm20 gittest]# git checkout -- readme.txt
  [root@vm20 gittest]# ls
  readme.txt


部署远程仓库
  部署远程仓库
  远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改。
  GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。
  搭建Git服务器需要准备一台运行Linux的机器
  第一步,安装git:

  yum install git

  第二步,创建一个git用户,用来运行git服务:

  adduser git
  passwd  git(设置密码)

  第三步,创建证书登录:  在 客户端做
  收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。

  ssh- keygen
  开发者:做秘钥对(私钥) 传公钥给主库上的账户 ssh-copy-id -i 用户@id
  主库 :/home/git/.ssh/authorized_keys

  第四步,初始化Git仓库:
  选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:

  git init --bare sample.git
  Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:
  chown -R git:git sample.git   (设置该所属组)  (不能在ROOT下,不然克隆路径不对,权限不够)

  第五步,禁用shell登录:
  出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
  git:x:1001:1001:,,,:/home/git:/bin/bash
  改为:
  git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
  这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
  第六步,克隆远程仓库:
  现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:

  git clone git@server:/srv/sample.git
  Cloning into 'sample'...
  warning: You appear to have cloned an empty repository.
  剩下的推送就简单了。

  在客户端添加你的名字和Email地址

  git config --global user.email "wing@qianfeng.com"

git config --global user.name "wing"

  第七步  推送  推送之后才能在仓库查看 (客户端)

  [root@tomcat gittest4]# git push -u origin master
  tesla@192.168.245.3's password:
  Counting objects: 3, done.
  Writing objects: 100% (3/3), 213 bytes | 0 bytes/s, done.
  Total 3 (delta 0), reused 0 (delta 0)
  To tesla@192.168.245.3:/gittest3/teslaProject.git


  • [new branch]      master -> master  分支 master 设置为跟踪来自 origin 的远程分支 master。

  第八步 在仓库端  创建一个目录克隆下来就可以查看了

  #git clone git@10.18.41.251(可以主机名):/srv/sample.git




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-584436-1-1.html 上篇帖子: 从Git玩转Github 下篇帖子: Git 安装和使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表