美文网首页PHP的学习
1,GIT版本控制

1,GIT版本控制

作者: 陈钢镚学财 | 来源:发表于2017-02-14 15:36 被阅读41次

    开头


    我对git的总结,大体上分为三个方面。

    • 认知与概念
    • 命令
    • 技巧

    认知与概念


    git与svn,是现在最主流的两个版本控制系统,它们分别是分布式集中式的代表作。

    • 集中式,svn

    指将版本(代码)集中控制,版本库建立在中央服务器,开发者每次开发必须从中央服务器更新到最新代码,再进行开发,最后推送回中央服务器。
    中央服务器和参与开发的节点之间,必须保证网络畅通。
    且,版本是公有的,因为这种模式下,整个开发团队只有一个仓库。

    • 分布式,git

    指将版本(代码)分散在各个开发节点上,每个开发节点,都有自己的一个版本库,与其他节点的版本库互不干扰。
    除非,你去pull或者push。
    在本地开发时,git会将你的代码管理起来,你仓库内的一切版本,都是私有的,你本地的,而不是公共的,除非你授权了某个节点或者push了你的修改,否则,其他节点无法得知你仓库的任何变化与仓库信息。

    为了多人协助,往往在使用git进行版本控制的团队开发场景下,也会设定一个节点用于托管公共代码,这个节点一般被称为git服务器

    git服务器从项目上,他与其他节点是平等的,并没有更高等级和权限。他只是一个独立于其他节点的公共仓库,用于接受push和提供pull、clone的。简单的讲,git服务器就是用于交换不同节点的修改。

    说完两个大概念,接下来说说小概念。

    • git

    git是一款分布式版本控制工具,本质上,是基于linux的,但后来在不同的平台,如mac os、windows,也提供了相应的客户端。

    git,以及目前市场上所有的版本控制系统,都只能跟踪纯文本形式文件的具体变动,如第几行的xxx改为了xxx。
    像图片、视频、word等二进制文件,git可以跟踪到他的新增、删除变化,但无法跟踪其具体变化了哪个地方。

    markdown就可以用来解决说明文件无法用word,却又不能如txt一样单调的问题

    • 仓库(版本库)

    repository(仓库、版本库)的本质是操作系统上的一个目录,目录下的文件,就是被git管理的内容。

    用于做repository的目录名称,不允许存在中文。

    .git目录,是一个仓库下隐藏的目录,该目录存放着git管理当前仓库的重要依赖。

    • 版本(提交、commit)

    在git中,提交与版本是等价的,一次commit,就是一个新的版本,而commit id是用来唯一确定一个版本的

    commit的时候,应当强制写明提交说明,否则版本与分支一多,自己都忘了这个版本是什么。

    git用 HEAD 来表示当前分支的当前版本,用HEAD^表示前一个版本,HEAD~100表示前一百个版本

    • 工作区

    指的是当前仓库根目录下的文件与目录,这个目录下的任何文件,修改后都可以add和commit,通常开发者都在工作区进行开发与修改。

    .git目录不算工作区

    工作区内的文件只有两种情况,一是某个分支或版本的样子 ,二是在某个分支或版本上发生修改的样子
    可见,工作区内的文件,一定源自某个版本。

    • 暂存区

    暂存区存放了本次添加的修改。
    当在工作区的文件发生修改,而进行add之后,就会在暂存区添加修改的信息。
    可以想象,暂存区是允许你一直往里add新的修改的。
    而commit,则会去暂存区读取所有修改的信息,最终生成一个新的版本。

    正因为commit提交的是暂存区里的内容,而暂存区的内容又由add添加的。所以,如果你在工作区做了某个修改却没有add到暂存区里就进行commit,则新生成的版本并不涵盖工作区中未add的修改。但此时,工作区中的那个修改,还是存在的。

    • 分支

    在git中,分支是必然存在的,版本是建立在分支之上的。默认情况下,我们在master主分支上进行开发。
    新增加的分支,必然都是从主分支上拷贝出来的副本,可以称之为子分支,子分支在完成特定开发任务之后,再合并回主分支去。
    子分支还可以继续去拷贝,生成新的分支。
    当子分支合并回主分支后,主分支可以生成一次新的版本,用于标记本次合并事件,子分支则可以被删除,但是,该分支的版本信息依然存在。
    当在某个分支,回退另一个分支的某个版本时,不会影响当前所在的分支。
    切换分支时,git将把工作区与暂存区重置,所以,git会要求开发者将当前暂存区内容进行提交。

    • 冲突

    不同的版本想要合并为同一个版本(pull时比较多见),或不同分支要合并成一个分支时,会发生对同一个文件有着不同的修改,这时就会发生冲突。
    用git status可以查看冲突的文件,手动解决所有冲突后,再add和commit。
    多人协作时,必须先pull,再push,以保持版本库与远端版本库最新状态。

    • 标签

    git支持开发者在自己的版本上打标签,打了标签之后,开发者与git就可以用标签来标记某个版本,而不用面对一串commit id。
    标签存在于本地版本库,可以被推送到远端版本库,也可以用命令删除远端版本库中的标签

    • 别名

    一个个人认为比较鸡肋的功能,算是个性化定制。
    该功能通过简单的命令,可以将 commit -m 别名为 cm ,将push origin 别名为 po。
    在使用命令时,就可以用cm或者po来代替原来较长的单词命令
    但是个人认为,在不同的环境下工作,你可能需要把这些都移植过来。

    • 远程仓库

    一个用于托管代码的公共版本库,即前面提到过的git服务器。
    一般情况下,git支持用ssh和https来传输数据,https速度慢,且每次推送需要口令,较麻烦
    实际上,git服务器与其他git节点不同的地方,就是在于它需要接受其他节点的push。

    push不能胡乱接受,否则就会受到攻击,所以如果你传输协议是https的,它会用你输入的口令来验证你的push权限,如果你是ssh的,则会对你传输申请时提交的ssh key进行过滤

    命令


    我将我常用的git命令按照以下五个分类进行划分与整理:

    • 本地版本仓库管理
    1. 设置git用户名和邮箱
    git config --global user.name "object"
    git config --global user.email "2252390865@qq.com"
    
    • 创建版本仓库

    git init

    - 把文件添加到仓库
    
    

    git add
    git add -f xxxx 强制添加到git

    - 把文件提交到仓库
    
    

    git commit -m "提交说明"
    // -- 提交说明很重要,这记录着你每次提交的情况,免得版本多了,自己忘了改了什么

    - 查看当前仓库状态
    
    

    git status
    // -- 用这个命令可以随时掌握工作区的状态

    - 查看距离上一次add,文件的变更情况
    
    

    git diff 文件名
    // -- diff可以查看仓库内的任意一个文件,本次修改的情况,当用git status时,发现有文件修改,可以用此命令,查看具体修改了什么

    - 查看仓库所有版本记录
    
    

    git log
    git log --pretty=oneline 将结果以一行的形式显示
    git reflog 列出曾经存在过的所有版本号 同样可以搜索
    // -- 可以使用如grep一样的命令进行搜索 如:git log --pretty=oneline | grep create

    - 版本回退与重置
    
    

    git reset --hard HEAD^^ 回退到前两个版本(上上个版本)
    git reset --hard commit id 重置到指定版本号的版本

    - 撤销本次工作区中的修改
    
    

    git checkout -- README.MD
    // -- 当readme.md文件已经被add的时候,他的内容就已经进入了暂存区。而上面的命令,是撤销工作区中的修改。
    // -- 所以,该命令大致意思是回到最近一次commit或add的样子

    - 撤销在暂存区内的某个修改
    
    

    git reset HEAD README.MD

    - 从版本中删除文件
    
    

    git rm 文件名
    // -- 此时只是从当前版本中删除了文件,但物理文件还是存在的,你可直接把物理文件删除
    // -- 当你物理文件被删除的情况下,你想恢复,可以用 撤销本次工作区中的修改 来实现恢复文件

    - 暂存现工作区的状态
    
    

    git stash

    - 查看暂存工作区状态的列表
    
    

    git stash list

    - 恢复工作区状态
    
    

    git stash apply <暂存标识>
    // -- 这种情况下只会恢复工作区状态,不会从列表中删除该状态,所以需要用 git stash drop <暂存标识> 来删除
    git stash pop

    
    - 远程仓库管理
    
    1. 创建ssh key
    
    

    ssh-keygen -t rsa -C "2252xxx5@qq.com"

    - 将本地仓库与远程仓库关联
    
    

    git remote add <仓库名> <仓库地址与信息>

    - 将本地仓库内容推送到远程仓库
    
    

    git push [参数信息,如-u] <仓库名> <分支名>
    // -u参数,当首次推送某分支的时候,该参数可以将本地分支和远程分支关联起来,以后推送时可简化命令

    - 将远程仓库克隆到本地
    
    

    git clone <仓库地址>

    - 从远程仓库取得某分支的更新
    
    

    git pull <远程主机名> <远程分支名>:<本地分支名>

    
    - 分支管理
    
    1. 创建分支
    
    

    git branch <分支名>
    // -- 当前在什么分支,就会以什么分支为基础,创建新分支

    - 切换分支
    
    

    git checkout <分支名>

    - 创建并切换分支
    
    

    git checkout -b <分支名>

    - 查看当前分支情况
    
    

    git branch

    - 合并分支
    
    

    git merge <被合并的分支>
    // -- 如果,你要把demo分支合并到master分支中,那你首先要切换到master分支里,再执行 git merge demo

    - 删除分支
    
    

    git branch -d <分支名>
    git branch -D <分支名> 强制删除分支

    - 查看分支合并情况
    
    

    git log --graph --pretty=oneline --abbrev-commit

    - 合并分支,且生成一个版本
    
    

    git merge --no-ff -m "提交说明" <分支名>

    
    - 多人协作
    
    1. 查看远程仓库的信息
    
    

    git remote 简单信息
    git remote -v 详细信息

    - 通常工作流程
      1.  先自己新建分支,修改提交后,尝试push给远端
      - 推送失败,则说明远端比本地分支更新,则使用pull进行合并
      - 如果有冲突,则解决冲突
      - 如果pull失败,提示"no tracking information",则表示本地分支与远端分支没有建立关联。可使用 git branch --set-upstream <分支名> <远端仓库名>/<分支名>
    
    - 标签与别名
    
    1. 创建标签
    
    

    git tag v1.0 默认是当前分支的最新版本
    git tag v1.2 <commit id> 给特定版本打上标签

    - 创建带有说明的标签
    
    

    git tag -a v0.1 -m "说明信息" <commit id>

    - 删除标签
    
    

    git tag -d v1.0

    - 推送标签到远端
    
    

    git push <仓库名> <标签名>
    git push <仓库名> --tags 把未推送的标签全部推送过去

    - 删除远端仓库的标签
    
    

    git push origin :refs/tags/<tagname>

    - 检查.gitignore是否有问题(语法错误)
    
    

    git check-ignore -v

    - 给git命令配置别名
    
    

    git config --global alias.st status 给status配置一个叫 st 的别名
    git config --global alias.unstage 'reset HEAD' 敲命令时,unstage可以代替 reset HEAD

    
    #   技巧
    ***
    - 分支策略
    
    1. Master分支应保持非常稳定的状态,近用来发布新版本,不能用于开发
    - dev分支代表用于开发的分支
    - 每个开发者可以新建一个自己的分支推送给远程仓库,远程仓库对这些推送来的分支做处理,如合并
    - 修复bug,最好为该bug新建分支
    - 添加新功能,最好为该新功能新建分支
    - 哪个分支上的bug,就以哪个分支为基础,创建新分支用于修复bug
    
    - 忽略敏感文件
    > 当不希望某文件被提交与管理时,可新建一个.gitignore 文件,再将需要忽略的文件写进去,将.gitignore文件提交到git 
    - 搭建git服务器
    1. 在linux上安装git
    - 创建linux的git用户
    - 创建证书登录
     - 收集所有需要登录的用户的公钥,即id_rsa.pub
     - 将所有公钥导入到/home/git/.ssh/authorized_keys文件中,一行一个
    - 初始化git仓库
     - 选定一个目录,git init –bare 项目名.git
     - 修改项目的拥有者 chown –R git:git 项目名.git
    - 在本地clone
    - 最后,两个工具系统:公钥管理 gitosis,权限管理 gitolite
    
    # 总结
    ***
    git是个诞生与linux的工具,是现代程序员必修技能之一。
    git只是一个工具,大致常用的命令基本已在本文中罗列出来。
    这些概念与命令,看一两天就能掌握,但想要熟练运用在项目中,还须日常练习。

    相关文章

      网友评论

        本文标题:1,GIT版本控制

        本文链接:https://www.haomeiwen.com/subject/sfkxwttx.html