首先介绍一写基本的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 Files\TortoiseGit\bin\TortoiseGitPlink.exe
替换为本地Git执行文件路径
X:\Program Files\Git\usr\bin\ssh.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
 
 
 

Git分支基本命令+coding webhook+lnmp的更多相关文章

  1. Git 分支基本命令

    1. 查看当前分支 (git branch) 2. 创建分支 (git branch 分支名) 3.切换分支(git checkout 分支名) 4.分支上的常规操作 5.分支的合并 (git che ...

  2. github webhook 实现代码自动部署 踩坑!! 附加git&coding webhook部署代码

    踩坑: 1.php程序执行linux命令是以webserver的user用户(如apache .www……)操作的,需要在/etc/sudoers添加用户免密码操作权限; %apache ALL=(A ...

  3. php 通过exec 创建git分支失败

    今天给我们自己的发布系统增加一个新建分支的功能,操作比较简单,但是使用php执行shell命令的时候总是无法push分支到远程,但是登陆服务器执行却是可以的 新建分支命令如下 git fetch -- ...

  4. Git版本控制:Git分支处理

    http://blog.csdn.net/pipisorry/article/details/46958699分支的意义创建分支可以避免提交代码后对主分支的影响,同时也使你有了相对独立的开发环境. 假 ...

  5. Git的基本命令介绍

    Git的安装 进入官网下载系统所需要的版本  官网地址:https://git-scm.com/downloads 点击下载按钮官方网站一般会根据操作系统的自动下载所需要的Git版本. 下载完成后,点 ...

  6. Git版本号控制:Git分支处理

    http://blog.csdn.net/pipisorry/article/details/46958699分支的意义创建分支能够避免提交代码后对主分支的影响,同一时候也使你有了相对独立的开发环境. ...

  7. Git-Runoob:Git 分支管理

    ylbtech-Git-Runoob:Git 分支管理 1.返回顶部 1. Git 分支管理 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同 ...

  8. 【第七篇】- Git 分支管理之Spring Cloud直播商城 b2b2c电子商务技术总结

    ​ Git 分支管理 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作. 有人把 Git 的分支模型称为必杀技特性,而正是因为它,将 ...

  9. Git 分支

    Git 保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照,某一次的提交指向这处时刻的文件快照,看起来就像每次提交都保存了当时的文件,连续的提交形成一条长链 分支 指向某一个特定的提交,不同的 ...

随机推荐

  1. 编译U-Boot时command not found的解决方法

    我使用的U-Boot版本是u-boot-2012.10,编译的步骤为 cd u-boot-2012.10 make s5p_goni_config sudo make 然后,就会看到错误提示 /bin ...

  2. [TJOI2007] 足彩投注

    足彩投注 题目概述 题目背景 了解足球彩票的人可能知道,足球彩票中有一种游戏叫做"胜负彩",意为猜比赛的胜负.下面是一些与胜负彩有关的术语 注 :每一组有效组合数据. 投 注:彩民 ...

  3. 快捷使用 Iterm2 连接SSH ( HTTP代理 )

    1,配置iterm2 > Preferences.. > Profiles > 填写:name : 别名 : Command : expect /Users/jerryxu/wwwr ...

  4. 通过 Chrome浏览器 查看http请求报文

    as we all know  HTTP 请求报文 包含请求行.请求头和请求体三部分 请求行:(请求方式 资源路径 协议/版本) 例如:POST /test/index.html HTTP/1.1 P ...

  5. Period 时间坑

    jdk1.8 的Period Period between = Period.between( LocalDate.parse("2018-01-01 00:00:00", Dat ...

  6. web渗透漏洞靶场收集

    最近将自己遇到过或者知道的web靶场链接奉上 0X01 DVWA 推荐新手首选靶场,配置简单,需下载phpstudy和靶场文件包,简单部署之后即可访问. 包含了常见的web漏洞(php的),每个漏洞分 ...

  7. linux100讲——71 if-else判断的使用

    1.if-then-else语句: 语法: if [测试条件成立] then 执行相应的命令 else 测试条件不成立,执行相应的命令 fi 结束 示例:vim 9.sh #!/bin/bash #i ...

  8. C语言实现链式二叉树静态创建,(先序遍历),(中序遍历),(后续遍历)

    #include <stdio.h>#include <stdlib.h> struct BTNode{ char data ; struct BTNode * pLchild ...

  9. python3练习100题——051

    题目:学习使用按位与 & . 不会的知识点,查了一下按位运算. 按位运算符是把数字看作二进制来进行计算的. 运算符 描述 实例 & 按位与运算符:参与运算的两个值,如果两个相应位都为1 ...

  10. PDF体检报告

    //Title: 个人健康管理分析报告 using System; using System.Collections.Generic; using System.Linq; using System. ...