• Git分支基本命令+coding webhook+lnmp


    首先介绍一写基本的git操作命令:

    • 查看当前项目的远程地址:
      • git remote -v
    • 查看远程地址所有分支:
      • git branch -a 或者 git branch -r
    • 查看本地分支与远程分支的映射关系:
      • git branch -vv
     
    新建分支和创建映射的方式:
    一:
    • 新建分支:
      • git branch  xxx 
      • git checkout xxx
    • 新建分支,并切换到该分支:git checkout -b issue1
    • 当前分支与远程分支创建映射关系(文件跟踪):
      • git branch -u origin/addFile  或者 
      • git branch --set-upstream-to origin/issue1
    • 解除映射关系:git branch --unset-upstream
    •  
    • PS : 本地分支与远程分支可以不同名
    二:
    • 在本地新建分支,并自动切换到该分支;建立本地分支和远程分支的映射关系:
      • git checkout -b 本地分支名x origin/远程分支名x       
    三:
    • 在本地新建分支,不切换到该分支;不建立远程映射关系:
      • git fetch origin  远程分支名x:本地分支名x
     
    分支的修改提交:
    • git add
    • git commit -m "注释"
    • 以上两个命令的合并写法:git commit -a -m "注释"
     
    分支的推送:
    • git push origin 本地分支x:远程分支x
    • 分支已有映射关系:git push
     
    合并分支:
    • 切换到主分支或者测试分支(master或者develop)
      • git checkout develop
      • git merge hotfix
     
    解决合并多个分支时的冲突:
    • 主分支中执行:
      • 获取当前分支状态:
        • git status
      • 选择解决冲突原始工具:
        • git mergetool
        • vimdiff (工具解决冲突保存完成层后,确认已解决,自动存入缓存区)或者使用IDE解决冲突后,主动添加到缓存区(git add ./)
      • 冲突解决完成后,提交文件:
        • git commit 
     
    IDE解决冲突,phpstorm为例:
     
     
    分支完成开发使命后的删除:
    • 删除本地分支:
      • git branch -d xxx
      • 强制删除:git branch -D XXX
    • 删除远程分支:
      • git push origin --delete hotfix
      • git push origin :br  (origin 后面有空格)
    • 删除a目录下的2.txt文件
      • git rm -r --cached a/2.txt
    • 删除a目录
      • git rm -r --cached a
      • git commit -m "删除a目录下的2.txt文件" 
      • git push
    • Note: 用-r参数删除目录, git rm --cached a.txt 删除的是本地仓库中的文件,且本地工作区的文件会保留且不再与远程仓库发生跟踪关系,如果本地仓库中的文件也要删除则用git rm a.txt
     
    分支代码回滚:
    • 本地代码库分支回滚:
      • git reset --hard commit-id :回滚到commit-id,讲commit-id之后提交的commit都去除
      • git reset --hard HEAD~3:将最近3次的提交回滚
    • 远程代码库回滚:
      • 这个是重点要说的内容,过程比本地回滚要复杂
      • 应用场景:自动部署系统发布后发现问题,需要回滚到某一个commit,再重新发布
      • 原理:先将本地分支退回到某个commit,删除远程分支,再重新push本地分支
      • 操作步骤:
      • git checkout the_branch
      • git pull
      • git branch the_branch_backup //备份一下这个分支当前的情况
      • git reset --hard the_commit_id //把the_branch本地回滚到the_commit_id
      • git push origin :the_branch //删除远程 the_branch
      • git push origin the_branch //用回滚后的本地分支重新建立远程分支
      • git push origin :the_branch_backup //如果前面都成功了,删除这个备份分支
      • 如果使用了gerrit做远程代码中心库和code review平台,需要确保操作git的用户具备分支的push权限,并且选择了 Force Push选项(在push权限设置里有这个选项)
     
     
    服务器上部署Git 并创建 webhook:
      • 使用php执行webhook,注意事项:
        • linux下php的执行用户,权限;
        • 切记hook操作的目标文件,不要用高权限用户修改或者pull等操作(例root),否则会造成hook失效,后面再思考是否可以避免这样的情况。
        • 做钩子大多是走 ssh 协议, 需要coding 里配置部署公钥
          • hook前期的配置工作:
            • 生成 当前设备、php执行用户 公钥,配置至coding的应用公钥和部署公钥中,可参考coding - ssh公钥生成文档 https://coding.net/help/doc/git/ssh-key.html#i-4
            • clone git仓库ssh地址(允许后续hook文件的免密拉取代码操作)
              • BTW:如果项目一开始采用https协议克隆代码,可通过:git remote set-url origin <ssh地址>   将https转化成ssh
              • 如果使用tortoise git等三方工具,则需替换默认ssh工具到Git执行文件,以tortoise git为例:
    Setting->network->SSH
    C:Program FilesTortoiseGitinTortoiseGitPlink.exe
    替换为本地Git执行文件路径
    X:Program FilesGitusrinssh.exe
     
    编写webhook文件,给一个简单的示例:
    <?php
    error_reporting(1);
    $output = shell_exec('id -a');//判断是否是www:www在执行
    $action_user = "<pre>$output</pre>";
    file_put_contents('./log/user_action.log',"USER_ACTION::".$action_user.$output. PHP_EOL , FILE_APPEND);
     
    $target = '/usr/local/nginx/html/git_work/forecast_admin/forecast'; // 测试环境web目录
    $token = 'forecast'; //token校验暂不启用
    $wwwUser = 'www';
    $wwwGroup = 'www';
     
     
    $json = json_decode(file_get_contents('php://input'), true);
    file_put_contents('./log/user_action.log',"HOOK_DATA::".file_get_contents('php://input'). PHP_EOL , FILE_APPEND);
     
     
    $cmds = array(
        "cd $target && git pull origin develop",
        "chown -R {$wwwUser}:{$wwwGroup} $target/", 
    );
     
     
    foreach ($cmds as $cmd) {
        $shellExec = shell_exec($cmd);
     
        if($shellExec == NULL) {
            file_put_contents('./log/test_try2.log', 'shell success'.$cmd, FILE_APPEND);
        } else {
            file_put_contents('./log/test_try_error.log', 'shell false'.$cmd, FILE_APPEND);
        }
    }
    根据实际情况,按照以上git分支的方法操作本地和远程分支,就ok哒。
     
     
    此外,关于git webhook和php发布 待了解的两个公共包:

    1.composer  cpliakas/git-wrapper

    2.composer  deploy
     
     
     
  • 相关阅读:
    Windows 8 应用的页面导航(1)
    开发 Windows 8 Bing地图应用(6)
    Windows 8 应用的页面导航(2)
    Windows 8 生命周期管理(4)
    删除DataTable重复列,只针对删除其中的一列重复的行
    Silverlight 数据库 Silverlight Database
    广告费用 会计处理及其改进
    Query to Join Delivery Details and MTL Material Table
    SAVEPOINT
    SYNCHRONIZE
  • 原文地址:https://www.cnblogs.com/yokooo/p/11477530.html
Copyright © 2020-2023  润新知